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