移除刚体,但仍然会发生碰撞

Removing a rigid body, but still getting collisions for it

本文关键字:碰撞      更新时间:2023-10-16

删除刚体的正确方法是什么,我只是这样做来删除它:

void removeRigidBody(btDynamicsWorld* pDynamicsWorld, btRigidBody* rb)
{
   pDynamicsWorld->removeRigidBody(rb);
   delete rb->getMotionState();
   delete rb;
}

然而,在我执行pDynamicsWorld->stepSimulation

之后,对象仍然出现在pDynamicsWorld->getCollisionObjectArray()

实际上,这是我发现的。在评论中发布代码看起来很糟糕,这就是为什么答案。

     //remove the rigidbodies from the dynamics world and delete them
    int i;
    for (i=m_dynamicsWorld->getNumCollisionObjects()-1; i>=0 ;i--)
    {
            btCollisionObject* obj = m_dynamicsWorld->getCollisionObjectArray()[i];
            m_dynamicsWorld->removeCollisionObject( obj );
            delete obj;
    }

从碰撞对象中移除body

和大多数bug一样,这只是一个愚蠢的错误。对不起,那些花时间阅读它的人。

这个错误实际上是在一些java调用removeRigidBody的jni。

if (body.id > 0) {

id实际上是btRigidBody地址的整型转换,所以当然任何!= 0整数都可以是有效的地址。在x86上,地址恰好是<0在另一台设备上恰好是> 0