【问题标题】:Bullet Physics, Collision between btBvhTriangleMeshShape and btStaticPlaneShape wont work子弹物理,btBvhTriangleMeshShape 和 btStaticPlaneShape 之间的碰撞不起作用
【发布时间】:2014-05-17 13:34:44
【问题描述】:

首先是一些事实: 我尝试使用 Visual Studio 2012 在 C++ 中使用 Bullet 实现碰撞检测。 到目前为止,我有一个 Sphere:

    btCollisionShape* fallShape = new btSphereShape(100); 
    btDefaultMotionState* fallMotionState =
            new btDefaultMotionState(btTransform(btQuaternion(0,0,0,1),btVector3(0,500,0)));
    btScalar mass = 1000;
    btVector3 fallInertia(0,0,0);
    fallShape->calculateLocalInertia(mass,fallInertia);
    btRigidBody::btRigidBodyConstructionInfo fallRigidBodyCI(mass,fallMotionState,fallShape,fallInertia);
    btRigidBody* fallRigidBody = new btRigidBody(fallRigidBodyCI);
    physicsWorld->addRigidBody(fallRigidBody);

和我的关卡,实现为 btBvhTriangleMeshShape:

    triangles.addTriangle(btVector3 (0, 0, 0),btVector3 (0, 0, 0),btVector3 (0, 0, 0));

btCollisionShape* levelShape = new btBvhTriangleMeshShape(&triangles, true, true);
    btDefaultMotionState* levelMotionState = new btDefaultMotionState(btTransform(btQuaternion(0,0,0,1),btVector3(0,0,0)));
  btRigidBody::btRigidBodyConstructionInfo
      levelRigidBodyCI(0,levelMotionState,levelShape,btVector3(0,0,0));
   btRigidBody* levelRigidBody = new btRigidBody(levelRigidBodyCI);
    physicsWorld->addRigidBody(levelRigidBody);

我知道三角形中只有一个三角形,但它们会发生碰撞。

我现在的问题是,当它们发生碰撞时,我的程序会关闭而没有特定错误,只是来自 Visual Studio 的未处理异常窗口。

谁有想法?

【问题讨论】:

    标签: c++ visual-studio-2012 bullet bulletphysics


    【解决方案1】:

    为了将来参考,下面是受上述问题启发的平面btBvhTriangleMeshShape 的 C++ 简短工作示例。质量是0.0f,因为网格显然是一个静态对象。

    btVector3 vertex1, vertex2, vertex3, vertex4;
    btTriangleMesh* triangleMeshTerrain = new btTriangleMesh();
    
    for (int i = -250; i < 250; i = i + 10) {
        for (int j = -250; j < 250; j = j + 10) {
    
            vertex1 = btVector3(i, 0.0f, j);
            vertex2 = btVector3(i + 10.0f, 0.0f, j);
            vertex3 = btVector3(i + 10.0f, 0.0f, j + 10.0f);
            vertex4 = btVector3(i, 0.0f, j + 10.0f);
    
            triangleMeshTerrain->addTriangle(vertex1, vertex2, vertex3);
            triangleMeshTerrain->addTriangle(vertex1, vertex3, vertex4);
        }
    }
    
    btCollisionShape* collisionShapeTerrain = new btBvhTriangleMeshShape(triangleMeshTerrain, true);
    
    btDefaultMotionState* motionState = new btDefaultMotionState(btTransform(btQuaternion(0, 0, 0, 1), btVector3(0, -15, 0)));
    
    btRigidBody::btRigidBodyConstructionInfo rigidBodyConstructionInfo(0.0f, motionState, collisionShapeTerrain, btVector3(0, 0, 0));
    btRigidBody* rigidBodyTerrain = new btRigidBody(rigidBodyConstructionInfo);
    rigidBodyTerrain->setFriction(btScalar(0.9));
    
    m_dynamicsWorld->addRigidBody(rigidBodyTerrain);
    

    【讨论】:

      【解决方案2】:

      在这一行

      triangles.addTriangle(btVector3 (0, 0, 0),btVector3 (0, 0, 0),btVector3 (0, 0, 0));
      

      您将所有坐标都设为零值,因此三角形不正确,这可能是问题的原因。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-16
        • 2013-12-24
        • 1970-01-01
        • 2018-01-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多