Жесткое тело все еще сталкивается после удаления из мира в Bullet Physics

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

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

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

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

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


person sak    schedule 17.10.2016    source источник


Ответы (1)


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

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

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

person LastBlow    schedule 22.09.2017