如何绘制/渲染Bullet Physics碰撞体/形状?

5
我已经使用NDK将Bullet Physics引擎集成到我的Android程序中(我正在使用Vuforia's imagetarget示例进行Android开发),它已经设置并正常工作,但是我希望绘制我的碰撞框/平面以查看我的刚体(btRigidBody)/碰撞形状(btCollisionShape),我确定这是可能的,但我找不到任何关于如何实现的教程!
我已经参考了Bullet物理引擎维基页面上的Hello World教程,并对其进行了修改,以将下落物理体的变换应用于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();

但是你无法获取索引列表以按特定顺序绘制顶点点!
1个回答

11

如果我记得没错,这不是在Bullet中绘制调试形状的正确方式。你有阅读过用户手册(PDF)的第16页吗?

你需要实现自己的调试绘制器类,并实现其中的drawLine方法,该类应该继承btIDebugDraw

将此调试绘制器对象通过setDebugDrawer传递给Bullet,然后使用world->getDebugDrawer->setDebugMode(debugMode);启用它。

要绘制世界,请调用world->debugDrawWorld()

这会多次调用您自定义函数上的drawLine,直到物理世界的线框模型被绘制出来。


这看起来就是我需要的,感谢指引!不幸的是,我的 C++ 已经生疏了(作为一名 Android 开发者,我主要使用 Java 进行编程)。我一直在使用 NDK 代码片段来完成工作,但看起来我需要重新学习编写正确的 C++ 类。 - AndroidNoob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接