2012-08-16 97 views
3

我已經實現了子彈物理引擎到我的Android程序與NDK(我使用的是Android的Vuforia's imagetarget示例),它設置正常,但我想渲染/繪製我的碰撞盒/飛機到看到我的剛體(btRigidBody)/碰撞形狀(btCollisionShape),我很積極這是可能的,但我找不到任何教程如何做到這一點!如何繪製/渲染子彈物理碰撞體/形狀?

我已將hello world Bullet physics tutorial on their wiki page修改爲應用從墜落的物理物體到3d物體的轉換,我在opengl es 2.0中查看碰撞物體,這裏是我用來渲染物體的代碼:

void drawRigidBody(btRigidBody* body,QCAR::Matrix44F modelViewMatrix, unsigned int textureID) 
{ 
btTransform trans; 
body->getMotionState()->getWorldTransform(trans); 
    LOG("sphere pos: (x %f , y %f, z %f)",trans.getOrigin().getX(),trans.getOrigin().getY(),trans.getOrigin().getZ()); 


    float physicsMatrix[16]; 
    trans.getOpenGLMatrix(physicsMatrix); 

    SampleUtils::scalePoseMatrix(kObjectScale, kObjectScale, kObjectScale, 
      &modelViewMatrix.data[0]); 

    QCAR::Matrix44F modelViewProjection, objectMatrix; 
    SampleUtils::multiplyMatrix(&modelViewMatrix.data[0], physicsMatrix, &objectMatrix.data[0]); 
    SampleUtils::multiplyMatrix(&projectionMatrix.data[0], &objectMatrix.data[0], &modelViewProjection.data[0]); 



    glVertexAttribPointer(vertexHandle, 3, GL_FLOAT, GL_FALSE, 0, 
      (const GLvoid*) &signVerts[0]); 
    glVertexAttribPointer(normalHandle, 3, GL_FLOAT, GL_FALSE, 0, 
      (const GLvoid*) &signNormals[0]); 
    glVertexAttribPointer(textureCoordHandle, 2, GL_FLOAT, GL_FALSE, 0, 
      (const GLvoid*) &signTexCoords[0]); 

    glEnableVertexAttribArray(vertexHandle); 
    glEnableVertexAttribArray(normalHandle); 
    glEnableVertexAttribArray(textureCoordHandle); 

    glActiveTexture(GL_TEXTURE0); 
    glBindTexture(GL_TEXTURE_2D, textureID); 
    glUniformMatrix4fv(mvpMatrixHandle, 1, GL_FALSE, 
      (GLfloat*)&modelViewProjection.data[0]); 
    glDrawArrays(GL_TRIANGLES, 0, signNumVerts); 
} 

編輯:看的btBoxShape代碼我注意到,你可以抓住箱子的頂點和法線:

btVector3** vertices= wallShape->getVertices(); 
btVector3**normals = wallShape->getNormals(); 

,但你不能搶指數列表中某個繪製頂點訂購!

回答

10

如果我沒有記錯,這不是在Bullet中繪製調試形狀的正確方法。你讀過user manual (PDF),第16頁了嗎?

你應該實現你自己的調試抽屜類,它實現了btIDebugDraw,並且在這個類中你實現了drawLine方法。

傳遞給這個調試抽屜子彈與setDebugDrawer,然後用world->getDebugDrawer->setDebugMode(debugMode);

啓用它吸取世界,調用world->debugDrawWorld();

然後在您的自定義函數中多次調用drawLine,直到繪製物理世界的線框模型。

+0

這看起來像是我需要的,謝謝指針!不幸的是,我的C++很生疏(作爲一名Android開發人員,我一直主要使用java進行編程),我一直在用NDK代碼片段來解決問題,但看起來我不得不刷新編寫適當的C++類 – AndroidNoob 2012-08-17 11:32:04