我正在使用 qualcomm sdk 并使用 ImageTargets 示例应用程序来开发增强现实应用程序。应用程序运行良好,但我想在用户触摸屏幕时加载另一个 3D 模型,即当相机视图启动并到达标记时,茶壶 3D 模型加载,然后用户触摸屏幕,应该加载一个新模型。以下是我正在执行的步骤:-
我得到了新的 3D 模型并得到了它的 .h 文件。我已将其包含在 assets 文件夹中,并将其包含在 ImageTargets.cpp 文件中,即 #include "./banana.h"
然后我在 ImageTargets.java 文件中添加了 ontouchEvent,该文件调用 ImageTargets.cpp 中的另一个函数,该函数更新了 modelID 变量。
以下是renderFrame函数中ImageTargets.cpp的编辑代码
#ifdef USE_OPENGL_ES_1_1 // Load projection matrix: glMatrixMode(GL_PROJECTION); glLoadMatrixf(projectionMatrix.data); // Load model view matrix: glMatrixMode(GL_MODELVIEW); glLoadMatrixf(modelViewMatrix.data); glTranslatef(0.f, 0.f, kObjectScale); glScalef(kObjectScale, kObjectScale, kObjectScale); // Draw object: glBindTexture(GL_TEXTURE_2D, thisTexture->mTextureID); if (modeId == 0){ glTexCoordPointer(2, GL_FLOAT, 0, (const GLvoid*) &teapotTexCoords[0]); glVertexPointer(3, GL_FLOAT, 0, (const GLvoid*) &teapotVertices[0]); glNormalPointer(GL_FLOAT, 0, (const GLvoid*) &teapotNormals[0]); glDrawElements(GL_TRIANGLES, NUM_TEAPOT_OBJECT_INDEX, GL_UNSIGNED_SHORT, (const GLvoid*) &teapotIndices[0]); } else{ glVertexPointer(3, GL_FLOAT, 0, bananaVerts); glNormalPointer(GL_FLOAT, 0, bananaNormals); //glTexCoordPointer(2, GL_FLOAT, 0, bananaTexCoords); glDrawArrays(GL_TRIANGLES, 0 , bananaNumVerts); } #else LOG("When tracker found 4"); QCAR::Matrix44F modelViewProjection; SampleUtils::translatePoseMatrix(0.0f, 0.0f, kObjectScale, &modelViewMatrix.data[0]); SampleUtils::scalePoseMatrix(kObjectScale, kObjectScale, kObjectScale, &modelViewMatrix.data[0]); SampleUtils::multiplyMatrix(&projectionMatrix.data[0], &modelViewMatrix.data[0] , &modelViewProjection.data[0]); glUseProgram(shaderProgramID); if (modelId == 0) { LOG("ModelID is 0"); glVertexAttribPointer(vertexHandle, 3, GL_FLOAT, GL_FALSE, 0, (const GLvoid*) &teapotVertices[0]); glVertexAttribPointer(normalHandle, 3, GL_FLOAT, GL_FALSE, 0, (const GLvoid*) &teapotNormals[0]); glVertexAttribPointer(textureCoordHandle, 2, GL_FLOAT, GL_FALSE, 0, (const GLvoid*) &teapotTexCoords[0]); } else { LOG("ModelID is 1"); glVertexAttribPointer(vertexHandle, 3, GL_FLOAT, GL_FALSE, 0, (const GLvoid*) &bananaVerts[0]); glVertexAttribPointer(normalHandle, 3, GL_FLOAT, GL_FALSE, 0, (const GLvoid*) &bananaNormals[0]); glVertexAttribPointer(textureCoordHandle, 2, GL_FLOAT, GL_FALSE, 0, (const GLvoid*) &bananaTexCoords[0]); } glEnableVertexAttribArray(vertexHandle); glEnableVertexAttribArray(normalHandle); glEnableVertexAttribArray(textureCoordHandle); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, thisTexture->mTextureID); glUniformMatrix4fv(mvpMatrixHandle, 1, GL_FALSE, (GLfloat*)&modelViewProjection.data[0] ); if (modelId == 0) { LOG("ModelID is 0"); glDrawElements(GL_TRIANGLES, NUM_TEAPOT_OBJECT_INDEX, GL_UNSIGNED_SHORT, (const GLvoid*) &teapotIndices[0]); } else{ LOG("ModelID is 1"); glDrawArrays(GL_TRIANGLES, 0, bananaNumVerts); } SampleUtils::checkGlError("ImageTargets renderFrame"); #endif
编辑
我解决了这个问题,但如果使用 glDrawElements 那么你不应该使用 glDrawArrays。所以我从一些 3d .obj 文件创建了另一个 .h 文件,它开始工作。