3

我正在使用 qualcomm sdk 并使用 ImageTargets 示例应用程序来开发增强现实应用程序。应用程序运行良好,但我想在用户触摸屏幕时加载另一个 3D 模型,即当相机视图启动并到达标记时,茶壶 3D 模型加载,然后用户触摸屏幕,应该加载一个新模型。以下是我正在执行的步骤:-

  1. 我得到了新的 3D 模型并得到了它的 .h 文件。我已将其包含在 assets 文件夹中,并将其包含在 ImageTargets.cpp 文件中,即 #include "./banana.h"

  2. 然后我在 ImageTargets.java 文件中添加了 ontouchEvent,该文件调用 ImageTargets.cpp 中的另一个函数,该函数更新了 modelID 变量。

  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