Intento utilizar Bullet Physics solo para detección de colisión. No necesito mover ningún objeto para mí ni manejar la representación con devoluciones de llamada. Solo quiero actualizar las ubicaciones de los objetos en cada cuadro y usarlo para decirme cuándo tengo colisiones. Para que funcione el ejemplo más simple, estoy tratando de encontrar colisiones entre los objetos con btBoxShape como su forma. Todo funciona bien sin bloqueos o pérdidas de memoria aparentes, pero no tengo colisiones, así que debo cometer algunos errores en alguna parte. Trataré de mantener esto lo más breve posible sin dejar nada importante.Ejemplo simple de colisión de física de bala
Aquí es mi función de configuración 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));
Ahora mismo tengo los jugadores y enemigos objetos del tipo btCollisionObject *. Los estoy configuración de la siguiente 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);
hago esencialmente lo mismo con mis objetos enemigos.
Entonces 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, por último, aquí es la estructura que define mi resultado de devolución de llamada:
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 mirado en un montón de los demos, pero parecen estar dejando el movimiento a Bullet, y como estoy moviendo personajes a una velocidad establecida sin ninguna física especial cuando colisionan, tuve problemas para adaptar los ejemplos a mi aplicación. La devolución de llamada del resultado en realidad vino de esta publicación en los foros: http://bulletphysics.org/Bullet/phpBB3/viewtopic.php?t=6816 Se trata de usar mallas triangulares, pero parecía estar más cerca de lo que estaba tratando de implementar.
De todos modos, si lees hasta aquí, ¡gracias! Cualquier consejo o enlace que pueda tener sería muy apreciado.
"Solo quiero actualizar las ubicaciones de los objetos en cada cuadro y usarlo para decirme cuándo tengo colisiones". Eso es generalmente antitético de cómo funciona un sistema * física *. Deberías intentar trabajar con tu motor de física, no * en contra de * it. Si tienes personajes que se mueven a una velocidad establecida, entonces realmente deberías dejar que tu sistema de física los mueva. Puede hacerlo bien. –
sí, me gustaría poder etiquetar esto como la respuesta. Después de leer esto y observarlo un poco más, me di cuenta de que podía hacer la detección de colisiones usando volúmenes de encuadernación y algunas matemáticas. ¡Gracias! – Aztal
¿Cuál es la entrada y la salida? P. ej .: para cada cuadro Entrada = posición + velocidad (por paso) de todos los objetos Salida = ¿qué pares de objetos colisionaron en qué punto del espacio? ¿Y actualiza manualmente las posiciones/velocidades usando un método personalizado? –