Física de bala Ejemplo de colisión más simple

Estoy tratando de usar Bullet Physics solo para la detección de colisiones. No lo necesito para mover ningún objeto por mí o manejar la representación con devoluciones de llamada. Solo quiero actualizar las ubicaciones de los objetos en cada fotograma y usarlo para avisarme cuando tenga colisiones. Para obtener el ejemplo más simple, estoy tratando de encontrar colisiones entre los objetos con btBoxShape como su forma. Todo funciona bien sin bloqueos o evidentes pérdidas de memoria, pero no tengo colisiones, por lo que debo estar cometiendo algunos errores en alguna parte. Trataré de ser lo más breve posible sin dejar de lado nada importante.

Aquí está mi función de configuración mundial:

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

Ahora mismo tengo objetos de jugador y enemigo del tipo btCollisionObject *. Los estoy configurando de esta manera:

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

Yo hago esencialmente lo mismo con mis objetos enemigos.

Luego, en cada cuadro actualizo todos mis objetos con algo como esto:

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
}

Y finalmente, aquí está la estructura que define mi devolución de llamada de resultado:

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

He visto muchas de las demostraciones, pero parece que en su mayoría están dejando el movimiento a Bullet, y como estoy moviendo los personajes a una velocidad establecida sin ninguna física especial cuando chocan, tuve problemas para adaptar los ejemplos a mi aplicación. El resultado de la devolución de llamada en realidad provino de esta publicación en los foros:http://bulletphysics.org/Bullet/phpBB3/viewtopic.php?t=6816 Se trata de usar mallas de triángulos, pero parecía lo más parecido a lo que estaba tratando de implementar.

De todos modos, si lees esto hasta aquí, ¡gracias! Cualquier consejo o enlace que pueda ahorrar sería muy apreciado.

Respuestas a la pregunta(3)

Su respuesta a la pregunta