私はqualcommsdkを使用しており、ImageTargetsサンプルアプリケーションを使用して拡張現実アプリケーションを開発しています。アプリケーションは正常に実行されますが、ユーザーが画面に触れたときに別の3Dモデルをロードしたいと思います。つまり、カメラビューが開始してマーカーに到達したときに、ティーポット3Dモデルがロードされ、ユーザーが画面に触れたときに新しいモデルがロードされます。以下は私がしているステップです:-
新しい3Dモデルを入手し、その.hファイルを入手しました。私はそれをアセットフォルダーに含め、ImageTargets.cppファイルにも含めました。つまり#include "./banana.h"
次に、modelID変数を更新するImageTargets.cppの別の関数を呼び出すImageTargets.javaファイルにontouchEventを追加しました。
以下は、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ファイルを作成し、動作を開始しました。