Exemplo de colisão mais simples de física de bala

Estou tentando usar o Bullet Physics apenas para detecção de colisão. Eu não preciso dele para mover objetos para mim ou manipular renderizações com callbacks. Eu só quero atualizar os locais dos objetos em cada quadro e usá-lo para me informar quando houver colisões. Para obter o exemplo mais simples, estou tentando encontrar colisões entre objetos com btBoxShape como sua forma. Tudo corre bem sem falhas ou vazamentos de memória aparente, mas eu não tenho colisões, então eu devo estar cometendo alguns erros em algum lugar. Vou tentar manter isso o mais breve possível sem deixar nada importante.

Aqui está a minha função de configuração do mundo:

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

Agora eu tenho jogadores e objetos inimigos do tipo btCollisionObject *. Estou configurando-as assim:

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

Eu faço essencialmente a mesma coisa com meus objetos inimigos.

Então cada frame eu atualizo todos os meus objetos com algo parecido com isto:

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
}

E finalmente, aqui está a estrutura que define meu callback 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;
 }
}

Eu olhei para muitas das demos, mas elas parecem estar deixando o movimento para a Bullet, e como eu estou movendo personagens a uma velocidade fixa sem nenhuma física especial quando eles colidem, eu tive problemas para adaptar os exemplos Minha aplicação. O retorno de chamada do resultado veio realmente deste borne nos fóruns:http://bulletphysics.org/Bullet/phpBB3/viewtopic.php?t=6816 É sobre o uso de malhas triangulares, mas parece mais próximo do que eu estava tentando implementar.

Enfim, se você leu até aqui, obrigado !! Qualquer conselho ou links que você poderia poupar seria muito apreciado.

questionAnswers(3)

yourAnswerToTheQuestion