Ich versuche Bullet Physics nur für die Kollisionserkennung zu verwenden. Ich brauche es nicht, um irgendwelche Objekte für mich zu bewegen oder Renderings mit Callbacks durchzuführen. Ich möchte nur Objektpositionen jedes Bild aktualisieren und es verwenden, um mir zu sagen, wenn ich Kollisionen habe. Um das einfachste Beispiel zu bekommen, versuche ich Kollisionen zwischen Objekten mit btBoxShape als Form zu finden. Alles läuft gut ohne Abstürze oder offensichtliche Speicherlecks, aber ich bekomme keine Kollisionen, also muss ich irgendwo Fehler machen. Ich werde versuchen, das so kurz wie möglich zu halten, ohne etwas Wichtiges auszulassen.Bullet Physik Simplest Collision Beispiel
Hier ist meine Welt Setup-Funktion:
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));
Im Moment habe ich Spieler und Feind Objekte vom Typ btCollisionObject *. Ich richte sie so ein:
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);
Ich mache im Wesentlichen die gleiche Sache mit meinen Feindobjekten.
Dann jeder Frame ich alle meine Objekte mit so etwas wie dies aktualisieren:
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
}
Und schließlich ist hier die Struktur, die mein Ergebnis Rückruf definiert:
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;
}
}
ich viel haben gesucht von den Demos, aber sie scheinen die Bewegung meistens auf Bullet zu belassen, und da ich Charaktere mit einer festgelegten Geschwindigkeit ohne spezielle Physik bewegte, wenn sie kollidierten, hatte ich Probleme, die Beispiele in meine Anwendung zu übernehmen. Das Ergebnis Callback kam tatsächlich von diesem Beitrag in den Foren: http://bulletphysics.org/Bullet/phpBB3/viewtopic.php?t=6816 Es geht um Dreiecksnetze, aber es schien am nächsten zu dem, was ich versuchte zu implementieren.
Wie auch immer, wenn Sie so weit lesen, danke !! Jeder Rat oder Links, die Sie frei hätten, wäre sehr willkommen.
"Ich möchte nur Objektpositionen jeden Rahmen aktualisieren und es verwenden, um mir zu sagen, wenn ich Kollisionen habe." Das steht im Gegensatz zu dem System * physics *. Sie sollten versuchen, mit Ihrer Physik-Engine zu arbeiten, nicht * dagegen *. Wenn Sie Charaktere haben, die sich mit einer bestimmten Geschwindigkeit bewegen, sollten Sie Ihr Physiksystem wirklich bewegen lassen. Das kann es gut. –
Ja, ich wünschte, ich könnte dies als Antwort markieren. Nachdem ich das gelesen und ein wenig mehr darüber gelesen hatte, wurde mir klar, dass ich die Kollisionserkennung selbst mit Hilfe von Volumen und Mathe machen kann. Vielen Dank! – Aztal
Was ist die Eingabe und Ausgabe? ZB: für jeden Frame Input = Position + Geschwindigkeit (pro Step) aller Objekte Output = welche Objektpaare kollidierten an welcher Stelle im Raum? Und Sie aktualisieren Positionen/Geschwindigkeiten manuell mit einer benutzerdefinierten Methode? –