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

时间:2013-05-27 13:28:08

标签: c++ bulletphysics

移除刚体的正确方法是什么,我这样做是为了将其移除:

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

但是,在我执行pDynamicsWorld->getCollisionObjectArray()

后,该对象仍会显示在pDynamicsWorld->stepSimulation

奇怪的是,这不会发生在ARM上,只是x86。

2 个答案:

答案 0 :(得分:1)

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

     //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;
    }

所以你从碰撞对象中移除了身体。

答案 1 :(得分:0)

这就像大多数错误只是一个愚蠢的错误。对于那些花时间阅读的人感到抱歉。

错误实际上出现在一些通过jni调用removeRigidBody的java中。

if (body.id > 0) {

id实际上是btRigidBody地址的int强制转换,因此任何!= 0整数当然都可以是有效地址。在x86上,地址碰巧是< 0在另一个设备上碰巧是> 0