【问题标题】:Bullet btBvhTriangleMeshShape Not CollidingBullet btBvhTriangleMeshShape 未碰撞
【发布时间】:2014-06-16 23:13:18
【问题描述】:

我正在尝试在我的应用程序中从一个大网格中创建一个 btBvhTriangleMeshShape,并将其用作刚体。这个刚体将构成静止不动的“地平面”。问题是一切都直截了当,就像它甚至不存在一样。以下是当前来源:

btTriangleMesh* tMesh = new btTriangleMesh();
irr::scene::IMeshBuffer* MB = WorldNode1->getMesh()->getMeshBuffer(1);

irr::video::S3DVertex* Vertices = (irr::video::S3DVertex*)MB->getVertices();
irr::u16* Indices = MB->getIndices();

for (irr::u32 i = 0; i < MB->getIndexCount(); i+=3)
{
    irr::core::vector3df Tri1Pos = Vertices[Indices[i]].Pos;
    irr::core::vector3df Tri2Pos = Vertices[Indices[i+1]].Pos;
    irr::core::vector3df Tri3Pos = Vertices[Indices[i+2]].Pos;

    tMesh->addTriangle(btVector3(Tri1Pos.X, Tri1Pos.Y, Tri1Pos.Z), btVector3(Tri2Pos.X, Tri2Pos.Y, Tri2Pos.Z), btVector3(Tri3Pos.X, Tri3Pos.Y, Tri3Pos.Z));
}

btCollisionShape* groundShape = new btBvhTriangleMeshShape(tMesh, false);
btDefaultMotionState* groundMotionState = new btDefaultMotionState(btTransform(btQuaternion(0, 0, 0, 1), btVector3(0, -1, 0)));
PH->CreateRigidBody(0, groundMotionState, groundShape);

PH->CreateRigidBody() 只是一个快速创建刚体的辅助函数,我知道这个函数可以正常工作,因为其他对象使用它并且碰撞很好。

非常感谢您对此处问题的任何见解。非常感谢大家的宝贵时间。

编辑: 连接调试抽屉后,它会显示以下内容(这是从网格下方拍摄的照片): 为了澄清,这里是上面的镜头:

我不知道这是网格本身的问题,还是遍历顶点以创建物理网格的代码的问题

【问题讨论】:

  • 是什么阻止了地板掉落?您是否打开了调试视图以检查没有发生这种情况?
  • 是的,我继续连接调试视图,地板就在它应该在的地方。
  • 我猜绿色是三角形,红色是装订量。所以你能解释一下地板应该是什么样子,因为它看起来有很多缝隙,实际上大部分是缝隙。所以我不会对失败的很多事情感到惊讶。

标签: c++ c++11 bulletphysics irrlicht


【解决方案1】:

当迭代通过 Irrlicht 网格缓冲区提供的三角形时,我需要迭代模型上存在的所有网格缓冲区,如下所示:

btTriangleMesh* tMesh = new btTriangleMesh();

irr::u32 MBCount = WorldMesh1->getMeshBufferCount();

for (irr::u32 m = 0; m < MBCount; m++)
{
    irr::scene::IMeshBuffer* MB = WorldNode1->getMesh()->getMeshBuffer(m);

    irr::video::S3DVertex* Vertices = (irr::video::S3DVertex*)MB->getVertices();
    irr::u16* Indices = MB->getIndices();

    for (irr::u32 i = 0; i < MB->getIndexCount(); i += 3)
    {
        irr::core::vector3df Tri1Pos = Vertices[Indices[i]].Pos;
        irr::core::vector3df Tri2Pos = Vertices[Indices[i + 1]].Pos;
        irr::core::vector3df Tri3Pos = Vertices[Indices[i + 2]].Pos;

        tMesh->addTriangle(btVector3(Tri1Pos.X, Tri1Pos.Y, Tri1Pos.Z), btVector3(Tri2Pos.X, Tri2Pos.Y, Tri2Pos.Z), btVector3(Tri3Pos.X, Tri3Pos.Y, Tri3Pos.Z));
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-27
    • 1970-01-01
    相关资源
    最近更新 更多