Android | Vuforia 更换模型

本文介绍了如何在Android应用中使用Vuforia更换3D模型。首先,从网上获取或创建OBJ模型文件。其次,下载并使用ActivePerl及obj2opengl工具将OBJ文件转换为OpenGL可用的头文件。接着,将转换后的头文件整合到Android项目的代码中,替换原有的模型数据。在Banana.java中加载verts, norms, texcoords数据,并修改ImageTargetRenderer.java的绘制方式。最后,确保贴图文件banana.png正确配置并在ImageTargets.java中更新引用。通过这些步骤,成功实现了模型的替换并展示了效果。" 109440506,8378538,编程求解整数均值,"['编程', '算法', '数学运算']
摘要由CSDN通过智能技术生成

1.获得一个obj模型文件(可以使用3dmax等建模软件制作,亦可直接百度下载)


2.
1)下载ActivePerl(百度下载)
http://download.csdn.net/detail/zhimou/8450071
2)下载obj2opengl(可以将.obj文件转化成.h)
http://download.csdn.net/detail/ggtaas/4998714


3.将obj2opengl.pl和你需要转换的obj放到C:\Perl\bin目录中
(这里我们以banana.obj为例)


4.运行命令提示符,定位到C:\Perl\bin目录下,输入命令:perl obj2opengl.pl banana.obj

这里写图片描述

这时候你会发现,bin文件夹中自动生成了banana.h文件。


5.修改代码
这部分有点繁,等哪天有空了再写教程,先放上代码…
1)仿照Teapot.java,新建一个Banana.java
  主要任务是要替换模型数据,由于数据量大,这里使用了文件操作,我将verts, norms, texcoords三个模型数据放在文件中分别导入

  同时要注意的是,TeaPot的实现有4个参数,而使用obj2opengl导出的.h数据中只有3个参数,缺少indices数据,不过不影响模型的显示,Sample中的Building也是只有3个参数,但具体原理我就不太懂了,跟opengl的知识有关,还望大神指教

/*===============================================================================
Copyright (c) 2012-2014 Qualcomm Connected Experiences, Inc. All Rights Reserved.

Vuforia is a trademark of QUALCOMM Incorporated, registered in the United States 
and other countries. Trademarks of QUALCOMM Incorporated are used with permission.
===============================================================================*/

package com.qualcomm.vuforia.samples.SampleApplication.utils;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.nio.Buffer;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;

import android.content.res.AssetManager;
import android.util.Log;



public class Banana extends MeshObject
{
   

    private static final String LOGTAG = "Banana";

    private Buffer mVertBuff;
    private Buffer mTexCoordBuff;
    private Buffer mNormBuff;
    private Buffer mIndBuff;

    private int indicesNumber = 0;
    private int verticesNumber = 0;

    private AssetManager assetManager;

    public Banana(AssetManager inputassetManager)
    {
        this.assetManager = inputassetManager;
        setVerts();
        setTexCoords();
        setNorms();

    }


    double[] banana_VERTS;
    double[] banana_TEX_COORDS;
    double[] banana_NORMS;

    InputStream inputFile = null;


    private int loadVertsFromModel(String fileName)
            throws IOException
        {
            try
            {
                inputFile = assetManager.open(fileName);

                BufferedReader reader = new BufferedReader(
                    new InputStreamReader(inputFile));

                String line = reader.readLine();

                //ex.24168 3 floatsdata in 1 line
                int floatsToRead = Integer.parseInt(line);
                //int floatsToRead = 1000;

                banana_VERTS = new double[3*floatsToRead];


                for (int i = 0; i < floatsToRead; i++)
                {

                    String curline = reader.readLine();
                    if( curline.indexOf('/') >= 0 ){
                        i--;
                        continue;
                    }

                    //split 1 line to 3 data
                    String floatStrs[] = curline.split(",");

                    banana_VERTS[3*i] = Float.parseFloat(floatStrs[0]);
                    banana_VERTS[3*i+1] = Float.parseFloat(floatStrs[1]);
                    banana_VERTS[3*i+2] = Float.parseFloat(floatStrs[2]);
                    Log.d(LOGTAG, ""+i);
                }

                return floatsToRead;


            } finally
            {
                if (inputFile != null)
                    inputFile.close();
            }
        }
    private int loadTexCoordsFromModel(String fileName)
            throws IOException
        {
            try
            {
                inputFile = assetManager.open(fileName);

                BufferedReader reader = new BufferedReader(
                    new InputStreamReader(inputFile));

                String line = reader.readLine();

                //ex.24168 3 floatsdata in 1 line
                int floatsToRead = Integer.parseInt(line);
                //int floatsToRead = 1000;

                banana_TEX_COORDS = new double[2*floatsToRead];


                for (int i = 0; i < floatsToRead; i++)
                {

                    String curline = reader.readLine();
                    if( curline.indexOf('/') >= 0 ){
                        i--;
                        continue;
                    }

                    //split 1 line to 2 data
                    String floatStrs[] = curline.split(",");

                    banana_TEX_COORDS[2*i] = Float.parseFloat(floatStrs[0]);
                    banana_TEX_COORDS[2*i+1] = Float.parseFloat(floatStrs[1]);
                    //banana_TEX_COORDS[3*i+2] = Float.parseFloat(floatStrs[2]);
                }

                return floatsToRead;


            } finally
            {
                if (inputFile != 
评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值