Sto cercando di utilizzare Bullet Physics solo per il rilevamento delle collisioni. Non ho bisogno di spostare oggetti per me o gestire il rendering con i callback. Voglio solo aggiornare le posizioni dell'oggetto ogni frame e usarlo per dirmi quando ho delle collisioni. Per ottenere l'esempio più semplice, sto cercando di trovare le collisioni tra gli oggetti con btBoxShape come forma. Tutto funziona bene senza arresti anomali o perdite di memoria apparenti, ma non ho nessuna collisione, quindi devo fare alcuni errori da qualche parte. Cercherò di tenerlo il più breve possibile senza lasciare nulla di importante.Fisica di proiettile Esempio di collisione più semplice
Ecco la mia funzione di configurazione mondo:
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));
In questo momento ho dei giocatori e nemici oggetti del tipo btCollisionObject *. Le sto configurando in questo modo:
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);
Io essenzialmente faccio la stessa cosa con i miei oggetti nemici.
Poi ogni fotogramma posso aggiornare tutti i miei oggetti con qualcosa di simile:
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, infine, ecco la struttura che definisce il mio risultato di callback:
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;
}
}
Ho guardato un sacco dei demo, ma sembrano per lo più lasciare il movimento a Bullet, e dal momento che sto spostando i personaggi a una velocità impostata senza alcuna fisica speciale quando si scontrano, ho avuto difficoltà ad adattare gli esempi alla mia applicazione. Il callback del risultato proviene in realtà da questo post nei forum: http://bulletphysics.org/Bullet/phpBB3/viewtopic.php?t=6816 Si tratta di utilizzare mesh triangolari, ma sembrava più vicino a quello che stavo cercando di implementare.
In ogni caso, se avete letto fino a qui, grazie !! Qualsiasi consiglio o link che potresti risparmiare sarebbe molto apprezzato.
"Voglio solo aggiornare le posizioni degli oggetti ogni fotogramma e usarlo per dirmi quando ho delle collisioni." Questo è generalmente antitetico su come funziona un sistema * physics *. Dovresti provare a lavorare con il tuo motore fisico, non * contro * it. Se hai personaggi che si muovono a una velocità prestabilita, dovresti lasciare che il tuo sistema fisico li sposti. Può farlo bene. –
sì, vorrei poter taggare questo come risposta. Dopo aver letto questo e averlo esaminato ancora di più, mi sono reso conto che posso solo eseguire il rilevamento delle collisioni usando volumi limite e alcuni calcoli matematici. Grazie! – Aztal
Che cos'è l'input e l'output? E.g .: per ogni frame Input = posizione + velocità (per step) di tutti gli oggetti Output = quali coppie di oggetti sono entrati in collisione in quale punto nello spazio? E aggiorni manualmente le posizioni/velocità usando un metodo personalizzato? –