Пример простейшего столкновения 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 Речь идет об использовании треугольных сеток, но мне показалось, что это ближе всего к тому, что я пытался реализовать.

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

Ответы на вопрос(3)

Ваш ответ на вопрос