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