Bullet Physics エンジンを NDK を使用して Android プログラムに実装しました ( Vuforia のAndroid 用の imagetarget の例を使用しています)。セットアップされ、正しく動作していますが、コリジョン ボックス/プレーンをレンダリング/描画して、剛体 (btRigidBody)/衝突形状 (btCollisionShape)、私はこれが可能であると確信していますが、それを行う方法に関するチュートリアルが見つかりません!
Wiki ページで hello world Bullet 物理学チュートリアルを取得し、それを変更して、衝突体を表示するために opengl es 2.0 にある落下物理体から 3D オブジェクトに変換を適用しました。レンダリングに使用しているコードを次に示します。物申す:
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();
しかし、特定の順序で頂点を描画するためにインデックスのリストを取得することはできません!