原文:http://blog.csdn.net/zhimou/article/details/43865503
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 != 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();
//ex.24168 3 floatsdata in 1 line
int floatsToRead = Integer.parseInt(line);
//int floatsToRead = 1000;
banana_NORMS = 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_NORMS[3*i] = Float.parseFloat(floatStrs[0]);
banana_NORMS[3*i+1] = Float.parseFloat(floatStrs[1]);
banana_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/banana/verts.txt");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
mVertBuff = fillBuffer(banana_VERTS);
verticesNumber = num ;
}
private void setTexCoords()
{
int num = 0;
try {
num = loadTexCoordsFromModel("ImageTargets/banana/texcoords.txt");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
mTexCoordBuff = fillBuffer(banana_TEX_COORDS);
}
private void setNorms()
{
int num = 0;
try {
num = loadNormsFromModel("ImageTargets/banana/norms.txt");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
mNormBuff = fillBuffer(banana_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;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 136
- 137
- 138
- 139
- 140
- 141
- 142
- 143
- 144
- 145
- 146
- 147
- 148
- 149
- 150
- 151
- 152
- 153
- 154
- 155
- 156
- 157
- 158
- 159
- 160
- 161
- 162
- 163
- 164
- 165
- 166
- 167
- 168
- 169
- 170
- 171
- 172
- 173
- 174
- 175
- 176
- 177
- 178
- 179
- 180
- 181
- 182
- 183
- 184
- 185
- 186
- 187
- 188
- 189
- 190
- 191
- 192
- 193
- 194
- 195
- 196
- 197
- 198
- 199
- 200
- 201
- 202
- 203
- 204
- 205
- 206
- 207
- 208
- 209
- 210
- 211
- 212
- 213
- 214
- 215
- 216
- 217
- 218
- 219
- 220
- 221
- 222
- 223
- 224
- 225
- 226
- 227
- 228
- 229
- 230
- 231
- 232
- 233
- 234
- 235
- 236
- 237
- 238
- 239
- 240
- 241
- 242
- 243
- 244
- 245
- 246
- 247
- 248
- 249
- 250
- 251
- 252
- 253
- 254
- 255
- 256
- 257
- 258
- 259
- 260
- 261
- 262
- 263
- 264
- 265
- 266
- 267
- 268
- 269
- 270
- 271
- 272
- 273
- 274
- 275
- 276
- 277
- 278
2)修改ImageTargetRenderer.java
基本就是把TeaPot换成了Banana,然后绘图函数部分将glDrawElements替换成了glDrawArrays
/*===============================================================================
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.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.qualcomm.vuforia.Matrix44F;
import com.qualcomm.vuforia.Renderer;
import com.qualcomm.vuforia.State;
import com.qualcomm.vuforia.Tool;
import com.qualcomm.vuforia.Trackable;
import com.qualcomm.vuforia.TrackableResult;
import com.qualcomm.vuforia.VIDEO_BACKGROUND_REFLECTION;
import com.qualcomm.vuforia.Vuforia;
import com.qualcomm.vuforia.samples.SampleApplication.SampleApplicationSession;
import com.qualcomm.vuforia.samples.SampleApplication.utils.CubeShaders;
import com.qualcomm.vuforia.samples.SampleApplication.utils.LoadingDialogHandler;
import com.qualcomm.vuforia.samples.SampleApplication.utils.SampleApplication3DModel;
import com.qualcomm.vuforia.samples.SampleApplication.utils.SampleUtils;
import com.qualcomm.vuforia.samples.SampleApplication.utils.Teapot;
import com.qualcomm.vuforia.samples.SampleApplication.utils.Banana;
import com.qualcomm.vuforia.samples.SampleApplication.utils.Texture;
// The renderer class for the ImageTargets sample.
public class ImageTargetRenderer implements GLSurfaceView.Renderer
{
private static final String LOGTAG = "ImageTargetRenderer";
private SampleApplicationSession vuforiaAppSession;
private ImageTargets mActivity;
private Vector<Texture> mTextures;
private int shaderProgramID;
private int vertexHandle;
private int normalHandle;
private int textureCoordHandle;
private int mvpMatrixHandle;
private int texSampler2DHandle;
private Teapot mTeapot;
private Banana mBanana;
private float kBuildingScale = 120.0f;
private SampleApplication3DModel mBuildingsModel;
private Renderer mRenderer;
boolean mIsActive = false;
private static final float OBJECT_SCALE_FLOAT = 50.0f;
public ImageTargetRenderer(ImageTargets activity,
SampleApplicationSession session)
{
mActivity = activity;
vuforiaAppSession = session;
}
// Called to draw the current frame.
@Override
public void onDrawFrame(GL10 gl)
{
if (!mIsActive)
return;
// Call our function to render content
renderFrame();
}
// Called when the surface is created or recreated.
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config)
{
Log.d(LOGTAG, "GLRenderer.onSurfaceCreated");
initRendering();
// Call Vuforia function to (re)initialize rendering after first use
// or after OpenGL ES context was lost (e.g. after onPause/onResume):
vuforiaAppSession.onSurfaceCreated();
}
// Called when the surface changed size.
@Override
public void onSurfaceChanged(GL10 gl, int width, int height)
{
Log.d(LOGTAG, "GLRenderer.onSurfaceChanged");
// Call Vuforia function to handle render surface size changes:
vuforiaAppSession.onSurfaceChanged(width, height);
}
// Function for initializing the renderer.
private void initRendering()
{
//mTeapot = new Teapot();
mBanana = new Banana(mActivity.getResources().getAssets());
mRenderer = Renderer.getInstance();
GLES20.glClearColor(0.0f, 0.0f, 0.0f, Vuforia.requiresAlpha() ? 0.0f
: 1.0f);
for (Texture t : mTextures)
{
GLES20.glGenTextures(1, t.mTextureID, 0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, t.mTextureID[0]);
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D,
GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR);
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D,
GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);
GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA,
t.mWidth, t.mHeight, 0, GLES20.GL_RGBA,
GLES20.GL_UNSIGNED_BYTE, t.mData);
}
shaderProgramID = SampleUtils.createProgramFromShaderSrc(
CubeShaders.CUBE_MESH_VERTEX_SHADER,
CubeShaders.CUBE_MESH_FRAGMENT_SHADER);
vertexHandle = GLES20.glGetAttribLocation(shaderProgramID,
"vertexPosition");
normalHandle = GLES20.glGetAttribLocation(shaderProgramID,
"vertexNormal");
textureCoordHandle = GLES20.glGetAttribLocation(shaderProgramID,
"vertexTexCoord");
mvpMatrixHandle = GLES20.glGetUniformLocation(shaderProgramID,
"modelViewProjectionMatrix");
texSampler2DHandle = GLES20.glGetUniformLocation(shaderProgramID,
"texSampler2D");
try
{
mBuildingsModel = new SampleApplication3DModel();
mBuildingsModel.loadModel(mActivity.getResources().getAssets(),
"ImageTargets/Buildings.txt");
} catch (IOException e)
{
Log.e(LOGTAG, "Unable to load buildings");
}
// Hide the Loading Dialog
mActivity.loadingDialogHandler
.sendEmptyMessage(LoadingDialogHandler.HIDE_LOADING_DIALOG);
}
// The render function.
private void renderFrame()
{
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);
State state = mRenderer.begin();
mRenderer.drawVideoBackground();
GLES20.glEnable(GLES20.GL_DEPTH_TEST);
// handle face culling, we need to detect if we are using reflection
// to determine the direction of the culling
GLES20.glEnable(GLES20.GL_CULL_FACE);
GLES20.glCullFace(GLES20.GL_BACK);
if (Renderer.getInstance().getVideoBackgroundConfig().getReflection() == VIDEO_BACKGROUND_REFLECTION.VIDEO_BACKGROUND_REFLECTION_ON)
GLES20.glFrontFace(GLES20.GL_CW); // Front camera
else
GLES20.glFrontFace(GLES20.GL_CCW); // Back camera
// did we find any trackables this frame?
for (int tIdx = 0; tIdx < state.getNumTrackableResults(); tIdx++)
{
TrackableResult result = state.getTrackableResult(tIdx);
Trackable trackable = result.getTrackable();
printUserData(trackable);
Matrix44F modelViewMatrix_Vuforia = Tool
.convertPose2GLMatrix(result.getPose());
float[] modelViewMatrix = modelViewMatrix_Vuforia.getData();
// int textureIndex = trackable.getName().equalsIgnoreCase("stones") ? 0
// : 1;
int textureIndex = trackable.getName().equalsIgnoreCase("Tree") ? 0
: 1;
textureIndex = trackable.getName().equalsIgnoreCase("tarmac") ? 2
: textureIndex;
// deal with the modelview and projection matrices
float[] modelViewProjection = new float[16];
if (!mActivity.isExtendedTrackingActive())
{
Matrix.translateM(modelViewMatrix, 0, 0.0f, 0.0f,
OBJECT_SCALE_FLOAT);
Matrix.scaleM(modelViewMatrix, 0, OBJECT_SCALE_FLOAT,
OBJECT_SCALE_FLOAT, OBJECT_SCALE_FLOAT);
} else
{
Matrix.rotateM(modelViewMatrix, 0, 90.0f, 1.0f, 0, 0);
Matrix.scaleM(modelViewMatrix, 0, kBuildingScale,
kBuildingScale, kBuildingScale);
}
Matrix.multiplyMM(modelViewProjection, 0, vuforiaAppSession
.getProjectionMatrix().getData(), 0, modelViewMatrix, 0);
// activate the shader program and bind the vertex/normal/tex coords
GLES20.glUseProgram(shaderProgramID);
if (!mActivity.isExtendedTrackingActive())
{
GLES20.glVertexAttribPointer(vertexHandle, 3, GLES20.GL_FLOAT,
//false, 0, mTeapot.getVertices());
false, 0, mBanana.getVertices());
GLES20.glVertexAttribPointer(normalHandle, 3, GLES20.GL_FLOAT,
//false, 0, mTeapot.getNormals());
false, 0, mBanana.getNormals());
GLES20.glVertexAttribPointer(textureCoordHandle, 2,
//GLES20.GL_FLOAT, false, 0, mTeapot.getTexCoords());
GLES20.GL_FLOAT, false, 0, mBanana.getTexCoords());
GLES20.glEnableVertexAttribArray(vertexHandle);
GLES20.glEnableVertexAttribArray(normalHandle);
GLES20.glEnableVertexAttribArray(textureCoordHandle);
// activate texture 0, bind it, and pass to shader
GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,
mTextures.get(textureIndex).mTextureID[0]);
GLES20.glUniform1i(texSampler2DHandle, 0);
// pass the model view matrix to the shader
GLES20.glUniformMatrix4fv(mvpMatrixHandle, 1, false,
modelViewProjection, 0);
// finally draw the teapot
// GLES20.glDrawElements(GLES20.GL_TRIANGLES,
// mTeapot.getNumObjectIndex(), GLES20.GL_UNSIGNED_SHORT,
// mTeapot.getIndices());
GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0,
mBanana.getNumObjectVertex());
// disable the enabled arrays
GLES20.glDisableVertexAttribArray(vertexHandle);
GLES20.glDisableVertexAttribArray(normalHandle);
GLES20.glDisableVertexAttribArray(textureCoordHandle);
} else
{
GLES20.glDisable(GLES20.GL_CULL_FACE);
GLES20.glVertexAttribPointer(vertexHandle, 3, GLES20.GL_FLOAT,
//false, 0, mBuildingsModel.getVertices());
false, 0, mBanana.getVertices());
GLES20.glVertexAttribPointer(normalHandle, 3, GLES20.GL_FLOAT,
//false, 0, mBuildingsModel.getNormals());
false, 0, mBanana.getNormals());
GLES20.glVertexAttribPointer(textureCoordHandle, 2,
//GLES20.GL_FLOAT, false, 0, mBuildingsModel.getTexCoords());
GLES20.GL_FLOAT, false, 0, mBanana.getTexCoords());
GLES20.glEnableVertexAttribArray(vertexHandle);
GLES20.glEnableVertexAttribArray(normalHandle);
GLES20.glEnableVertexAttribArray(textureCoordHandle);
GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,
mTextures.get(3).mTextureID[0]);
GLES20.glUniformMatrix4fv(mvpMatrixHandle, 1, false,
modelViewProjection, 0);
GLES20.glUniform1i(texSampler2DHandle, 0);
GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0,
//mBuildingsModel.getNumObjectVertex());
mBanana.getNumObjectVertex());
SampleUtils.checkGLError("Renderer DrawBuildings");
}
SampleUtils.checkGLError("Render Frame");
}
GLES20.glDisable(GLES20.GL_DEPTH_TEST);
mRenderer.end();
}
private void printUserData(Trackable trackable)
{
String userData = (String) trackable.getUserData();
Log.d(LOGTAG, "UserData:Retreived User Data \"" + userData + "\"");
}
public void setTextures(Vector<Texture> textures)
{
mTextures = textures;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 136
- 137
- 138
- 139
- 140
- 141
- 142
- 143
- 144
- 145
- 146
- 147
- 148
- 149
- 150
- 151
- 152
- 153
- 154
- 155
- 156
- 157
- 158
- 159
- 160
- 161
- 162
- 163
- 164
- 165
- 166
- 167
- 168
- 169
- 170
- 171
- 172
- 173
- 174
- 175
- 176
- 177
- 178
- 179
- 180
- 181
- 182
- 183
- 184
- 185
- 186
- 187
- 188
- 189
- 190
- 191
- 192
- 193
- 194
- 195
- 196
- 197
- 198
- 199
- 200
- 201
- 202
- 203
- 204
- 205
- 206
- 207
- 208
- 209
- 210
- 211
- 212
- 213
- 214
- 215
- 216
- 217
- 218
- 219
- 220
- 221
- 222
- 223
- 224
- 225
- 226
- 227
- 228
- 229
- 230
- 231
- 232
- 233
- 234
- 235
- 236
- 237
- 238
- 239
- 240
- 241
- 242
- 243
- 244
- 245
- 246
- 247
- 248
- 249
- 250
- 251
- 252
- 253
- 254
- 255
- 256
- 257
- 258
- 259
- 260
- 261
- 262
- 263
- 264
- 265
- 266
- 267
- 268
- 269
- 270
- 271
- 272
- 273
- 274
- 275
- 276
- 277
- 278
- 279
- 280
- 281
- 282
- 283
- 284
- 285
- 286
- 287
- 288
- 289
- 290
- 291
- 292
- 293
- 294
- 295
- 296
- 297
- 298
- 299
- 300
- 301
- 302
- 303
- 304
- 305
- 306
- 307
- 308
- 309
- 310
- 311
- 312
- 313
- 314
- 315
- 316
- 317
- 318
- 319
- 320
- 321
- 322
- 323
- 324
3)修改ImageTargets.java
把贴图文件banana.png 放到和Teapot贴图相同的路径下,并修改以下代码
private void loadTextures()
{
mTextures.add(Texture.loadTextureFromApk("banana.png",
getAssets()));
//mTextures.add(Texture.loadTextureFromApk("TextureTeapotBrass.png",
// getAssets()));
// mTextures.add(Texture.loadTextureFromApk("TextureTeapotBlue.png",
// getAssets()));
// mTextures.add(Texture.loadTextureFromApk("TextureTeapotRed.png",
// getAssets()));
mTextures.add(Texture.loadTextureFromApk("ImageTargets/Buildings.jpeg",
getAssets()));
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
如果贴图显示有问题,可以试着将贴图的方向调整一下
效果图:
版权声明:本文为博主原创文章,未经博主允许不得转载。