2016-10-17 3 views
0

Я пытаюсь реализовать простую дверь, которая просто исчезает, когда игрок приближается. Проблема в том, что дверь все еще блокирует плеер даже после того, как беринг удалился из мира.Жесткое тело, все еще сталкивающееся после удаления из мира в Bullet Physics

На каждом кадре, я делаю следующее:

  1. Tick моделирования

  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); 

Я уже пытался отключить дезактивацию на этом объекте, и делает его аа динамический объект без массы, но результат тот же.

Как удалить статический объект из мира и заставить его работать?

ответ

0

Чтобы удалить Bullet Physics объект, сначала состояние движения и форму столкновения должны быть удалены, то твердое тело должно быть удалено от мира и удалил себя как в:

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

Если вы этого не сделаете, вы получите утечки. Вы можете использовать VLD (Visual Leak Detector), чтобы отслеживать их.

Смежные вопросы