3

私はqualcommsdkを使用しており、ImageTargetsサンプルアプリケーションを使用して拡張現実アプリケーションを開発しています。アプリケーションは正常に実行されますが、ユーザーが画面に触れたときに別の3Dモデルをロードしたいと思います。つまり、カメラビューが開始してマーカーに到達したときに、ティーポット3Dモデルがロードされ、ユーザーが画面に触れたときに新しいモデルがロードされます。以下は私がしているステップです:-

  1. 新しい3Dモデルを入手し、その.hファイルを入手しました。私はそれをアセットフォルダーに含め、ImageTargets.cppファイルにも含めました。つまり#include "./banana.h"

  2. 次に、modelID変数を更新するImageTargets.cppの別の関数を呼び出すImageTargets.javaファイルにontouchEventを追加しました。

  3. 以下は、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ファイルを作成し、動作を開始しました。

4

0 に答える 0