Bullet Physics Простейший пример столкновения

Я пытаюсь использовать Bullet Physics только для обнаружения столкновений. Мне не нужно перемещать какие-либо объекты или обрабатывать рендеринг с помощью обратных вызовов. Я просто хочу обновлять местоположение объектов в каждом кадре и использовать его, чтобы сообщать мне, когда у меня есть столкновения. Чтобы получить простейший пример, я пытаюсь найти столкновения между объектами с btBoxShape в качестве их формы. Все работает нормально, без сбоев или очевидных утечек памяти, но у меня нет столкновений, поэтому я где-то делаю ошибки. Постараюсь быть максимально кратким, не упуская ничего важного.

Вот моя функция настройки мира:

collisionConfig      = new btDefaultCollisionConfiguration();
dispatcher           = new btCollisionDispatcher(collisionConfig);
overlappingPairCache = new btDbvtBroadphase();
solver               = new btSequentialImpulseConstraintSolver;
dynamicsWorld        = new btDiscreteDynamicsWorld(dispatcher, 
overlappingPairCache, solver, collisionConfig);         

dynamicsWorld->setGravity(btVector3(0.0f, -9.8f, 0.0f));

Прямо сейчас у меня есть объекты игрока и врага типа btCollisionObject*. Я настраиваю их следующим образом:

mPlayerBox = new btBoxShape(btVector3(1,3,1));
mPlayerObject = new btCollisionObject();
mPlayerObject->setCollisionShape(mPlayerBox);
btTransform playerWorld;
playerWorld.setIdentity();
//playerPos is a D3DXVECTOR3 that holds the camera position.
playerWorld.setOrigin(btVector3(playerPos.x, playerPos.y, playerPos.z));
mPlayerObject->setWorldTransform(playerWorld);
mPlayerObject->forceActivationState(DISABLE_DEACTIVATION);//maybe not needed
dynamicsWorld->addCollisionObject(mPlayerObject);

По сути, я делаю то же самое с моими вражескими объектами.

Затем в каждом кадре я обновляю все свои объекты примерно так:

btTransform updatedWorld;
updatedWorld.setIdentity();
updatedWorld.setOrigin(btVector3(position.x, position.y, position.z));
mPlayerObject->setWorldTransform(updatedWorld);

//do the same for my enemies, and then...

dynamicsWorld->performDiscreteCollisionDetection();
//Also tried doing this with stepSimulation(deltaTime, 7), but nothing changed.
//stepSimulation seems to only be for letting Bullet set world Transforms?

//check collisions with player
dynamicsWorld->contactTest(mPlayerObject, resultCallback);
int numManifolds = dynamicsWorld->getDispatcher()->getNumManifolds();
if(numManifolds > 0)
{
   //there's a collision, execute blah blah blah
}

И, наконец, вот структура, определяющая мой обратный вызов результата:

struct rCallBack : public btCollisionWorld::ContactResultCallback
{
 btScalar rCallback::addSingleResult(btManifoldPoint& cp, const btCollisionObject*
 colObj0, int partId0, int index0, const btCollisionObject* colObj1, int partId1,
 int index1)
 {
   btVector3 ptA = cp.getPositionWorldOnA();
   btVector3 ptB = cp.getPositionWorldOnB();
   return 0;
 }
}

Я просмотрел множество демонстраций, но, похоже, оставлять движение на Bullet, и поскольку я перемещаю персонажей с заданной скоростью без какой-либо специальной физики, когда они сталкиваются, у меня возникли проблемы с адаптацией примеров в моем приложении. Обратный вызов результата фактически пришел из этого сообщения на форумах: http://bulletphysics.org/Bullet/phpBB3/viewtopic.php?t=6816 Речь идет об использовании треугольных сеток, но это кажется наиболее близким к тому, что я пытался реализовать.

В любом случае, если вы дочитали до этого места, спасибо!! Любые советы или ссылки, которые вы могли бы сэкономить, будут очень признательны.

9
задан Aztal 23 June 2012 в 20:21
поделиться