vofuria的开发(5)替换原vuforia的茶壶模型、改为自己想要的模型AR model

2023-11-17

1.在基于android NDK开发的过程中,替换目标图片之后就是如何替换掉官方demo中给的茶壶模型,换成自己想要模型。如果对替换目标图片不了解的可以点击这里

2.在更换模型的过程中首先你要有一个.obj的文件,这个文件你可以去下载,也可以用3Dmax来生成。

3.下面是必备步骤,大家不要怕麻烦,下载ActivePerl并安装,可以自行百度下载。

这里写图片描述

4.下载obj2opengl文件,可以点击下面这里

5.下面看看如何用.obj文件来生成.h,其中model.obj(先将里面的.obj文件重命名成model.obj)文件可以在这下载.obj文件下载

6.将model.obj 、obj2opengl文件放到C\Perl\bin目录下执行perl obj2opengl.p1 model.obj,这样就生成了model.h文件

这里写图片描述

生成的model.h中的文件数据如下:

这里写图片描述

7.修改代码如下,在下面所示的文件夹下建一个model.java的文件,用来替换模型的数据

这里写图片描述

由于数据量不小,使用基本的文件操作,将verts, norms, texcoords三个模型数据放入txt中分别导入.

package com.vuforia.samples.SampleApplication.utils;

import android.content.res.AssetManager;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.Buffer;

/**
 * This file created by dragon on 2016/7/29 21:58,belong to com.vuforia.samples.SampleApplication.utils .
 */
public class model extends MeshObject {
   
    private  static final String TAG="modelTest";

    private Buffer mVertBuff;//顶点
    private Buffer mTexCoordBuff;//纹理坐标
    private Buffer mNormBuff;//normal
    private int verticesNumber = 0;
    private AssetManager assetManager;

    public model(AssetManager inputassetManager){
        this.assetManager = inputassetManager;
        setVerts();
        setTexCoords();
        setNorms();
    }
    double[] model_VERTS;
    double[] model_TEX_COORDS;
    double[] model_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();
            int floatsToRead = Integer.parseInt(line);
            model_VERTS = new double[3*floatsToRead];
            for(int i=0;i<floatsToRead;i++){
                String curline = reader.readLine();
                if(curline.indexOf('/')>=0){
                    i--;
                    continue;
                }
//                将一行分成3个数据
                String floatStrs[] = curline.split(",");
                model_VERTS[3 * i] = Float.parseFloat(floatStrs[0]);
                model_VERTS[3 * i + 1] = Float.parseFloat(floatStrs[1]);
                model_VERTS[3 * i + 2] = Float.parseFloat(floatStrs[2]);

            }
            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();

            int floatsToRead = Integer.parseInt(line);
            model_TEX_COORDS = new double[2*floatsToRead];


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

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

                //将一行分成两个数据
                String floatStrs[] = curline.split(",");

                model_TEX_COORDS[2*i] = Float.parseFloat(floatStrs[0]);
                model_TEX_COORDS[2*i+1] = Float.parseFloat(floatStrs[1]);
            }
            return floatsToRead;
        } finally
        {
            if (inputFile != null)
                inputFile.close();
        }
    }

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

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

            String line = reader.readLine();
            int floatsToRead = Integer.parseInt(line);
            model_NORMS = new double[3*floatsToRead];


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

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

                //将一行分成三个数据
                String floatStrs[] = curline.split(",");

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

            return floatsToRead;

        } finally
        {
            if (inputFile != null)
                inputFile.close();
        }
    }

    private void setVerts(){
        int num = 0;
        try{
            num = loadVertsFromModel("ImageTargets/model/verts.txt");

        } catch(IOException e){
            e.printStackTrace();
        }
        mVertBuff = fillBuffer(model_VERTS);
        verticesNumber = num;
    }
    private void setTexCoords()
    {
        int num = 0;
        try {
            num = loadTexCoordsFromModel("ImageTargets/model/texcoords.txt");
        } catch (IOException e) {
            e.printStackTrace();
        }

        mTexCoordBuff = fillBuffer(model_TEX_COORDS);

    }
    private void setNorms()
    {
        int num = 0;
        try {
            num = loadNormsFromModel("ImageTargets/model/norms.txt");
        } catch (IOException e) {
            e.printStackTrace();
        }
        mNormBuff = fillBuffer(model_NORMS);
    }
    public int getNumObjectIndex()
    {
        return 0;
    }


    @Override
    public int getNumObjectVertex()
    {
        return verticesNumber;
    }
    @Override
    public Buffer getBuffer(BUFFER_TYPE bufferType)
    {
        Buffer result = null;
        switch (bufferType)
        {
            case BUFFER_TYPE_VERTEX:
                result = mVertBuff;
                break;
            case BUFFER_TYPE_TEXTURE_COORD:
                result = mTexCoordBuff;
                break;
            case BUFFER_TYPE_NORMALS:
                result = mNormBuff;
                break;
            default:
                break;

        }

        return result;
    }

}

8.修改ImageTargetRenderer.java的文件如下

/*===============================================================================
Copyright (c) 2016 PTC Inc. All Rights Reserved.

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

Vuforia is a trademark of PTC Inc., registered in the United States and other 
countries.
===============================================================================*/

package com.vuforia.samples.VuforiaSamples.app.ImageTargets;

import java.io.IOException;
import java.util.Vector;

import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;

import android.opengl.GLES20;
import android.opengl.GLSurfaceView;
import android.opengl.Matrix;
import android.util.Log;

import com.vuforia.Matrix44F;
import com.vuforia.Renderer;
import com.vuforia.State;
import com.vuforia.Tool;
import com.vuforia.Trackable;
import com.vuforia.TrackableResult;
import com.vuforia.VIDEO_BACKGROUND_REFLECTION;
import com.vuforia.Vuforia;
import com.vuforia.samples.SampleApplication.SampleApplicationSession;
import com.vuforia.samples.SampleApplication.utils.model
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vofuria的开发(5)替换原vuforia的茶壶模型、改为自己想要的模型AR model 的相关文章

随机推荐