2016-10-17 106 views
0

我试图实现一个简单的门,当玩家靠近时就会消失。问题在于,即使从世界移除后,门仍然阻止玩家。从子弹物理世界移除后刚体仍然发生碰撞

在每一个帧中,我执行以下操作:

  1. 蜱模拟

  2. 迭代通过所有的碰撞

  3. 如果放置在播放器和一个传感器对象之间的碰撞靠近门,用这种方法取出门:

    self.dynamicsWorld->removeCollisionObject(object.collisionBody);

奇怪的是,这对我的场景中的抛射物非常适用,一旦它们与任何其他物体接触就会被移除。

这里的世界是如何设置的:

btDefaultCollisionConfiguration* collisionConfiguration; 
btCollisionDispatcher* dispatcher; 
btBroadphaseInterface* overlappingPairCache; 
btSequentialImpulseConstraintSolver* solver; 
btDiscreteDynamicsWorld* dynamicsWorld; 


collisionConfiguration = new btDefaultCollisionConfiguration(); 
dispatcher = new btCollisionDispatcher(collisionConfiguration); 
overlappingPairCache = new btDbvtBroadphase(); 
solver = new btSequentialImpulseConstraintSolver; 
dynamicsWorld = new btDiscreteDynamicsWorld(dispatcher, overlappingPairCache, solver, collisionConfiguration); 
dynamicsWorld->setGravity(btVector3(0, 0, gravity)); 

而这里的门是如何设置的:

float mass = 0; 
bool isDynamic = false; 

btBoxShape* shape = new btBoxShape(size); 

btTransform transform; 
transform.setIdentity(); 
btVector3 localInertia(0, 0, 0); 
if (isDynamic) { 
    shape->calculateLocalInertia(mass, localInertia); 
}else{ 
    mass = 0; 
} 
btDefaultMotionState* motionState = new btDefaultMotionState(transform); 
btRigidBody::btRigidBodyConstructionInfo cInfo(mass, motionState, shape, localInertia); 
btRigidBody* body = new btRigidBody(cInfo); 

btTransform transform; 
body->getMotionState()->getWorldTransform(transform); 
transform.setOrigin(position); 
body->getMotionState()->setWorldTransform(transform); 

self.dynamicsWorld->addRigidBody(body); 

我已经尝试过这个对象上禁用停用,并使其AA动态没有质量的对象,但结果是一样的。

那么如何从世界中移除一个静态对象并使其工作?

回答

0

要删除子弹物理对象,第一运动状态和碰撞形状已被删除,则该刚体必须从世界移除并删除它本身如:

void InceptionPhysics::deleteShape(btRigidBody* rigidBody) { 
    delete rigidBody->getMotionState(); 
    delete rigidBody->getCollisionShape(); 
    m_dynamicsWorld->removeRigidBody(rigidBody); 
    delete rigidBody; 
} 

如果你不这样做,你最终会泄漏。您可以使用VLD(Visual Leak Detector)来追踪它们。