Come posso estendere btCollisionAlgorithm per abilitare la collisione con un terreno voxel?


8

Sto usando Bullet e sto tentando di creare un algoritmo di collisione che genera punti di contatto al di fuori di un terreno basato su cubi insieme alla risposta di collisione appropriata. Ho anche intenzione di estenderlo per includere anche le forme non-box, tuttavia non è vitale al momento. Ho scoperto che l'uso di una mesh triangolare è troppo di un maiale RAM per le mappe di grandi dimensioni.

Ho provato la procedura descritta da Byte56 qui , tuttavia, ho una serie di domande relative all'implementazione di questo con Bullet:

  • Come si genera una forma di collisione per il mondo? Usi una forma personalizzata? Che cosa hai intenzione m_shapeTypedi essere su di esso?
  • O usi ancora una scatola dalle dimensioni del mondo?
  • Come garantire che i punti di contatto vengano liberati?
  • Come si modifica esattamente processCollision?

Quello che ho fatto:

  • Ho creato un terrainShape that extendsbtBoxShape , the only difference being thatm_shapeType = CUSTOM_CONVEX_SHAPE_TYPE`, per consentirmi di registrare un nuovo algoritmo di collisione con il dispatcher per oggetti con solo questa forma.
  • Ho esteso la btRigidBodyclasse in un modo simile a Byte56 nella sua domanda (vedi il link nel 2 ° paragrafo), tuttavia checkCollisionWith(CollisionObject * co)restituisce vero se qualsiasi voxel nell'ABD conon è aereo.
  • Ho esteso la btCollisionAlgorithmclasse, in un modo simile a btCompoundCollisionAlgorithm, processCollisionfacendo quanto segue:

    1. Controlla gli oggetti in collisione passati come argomenti e determina quale è il terreno e quale è l'entità.
    2. Cancella le molteplici eventuali algoritmi figlio.
    3. Chiamata resultOut->setPersistantManifold(resultOut)
    4. Genera nuove forme e trasformazioni di casella nell'ABD occupato dall'entità in collisione, quindi chiama m_dispatcher->findAlgorithm. Memorizza la forma, trasforma e trova l'algoritmo in una struttura Algorithm figlio per ogni voxel all'interno dell'AABB.
    5. Scorrere su tutti gli algoritmi figlio, chiamando proccessCollision.
    6. Scorrere su tutti gli algoritmi figlio, rimuovendo qualsiasi ora al di fuori dell'AABB dell'entità in collisione. (chiamando ~btCollisionAlgorithm()quindi m_dispatcher->freeCollisionAlgorithm())
    7. Chiama resultOut->refreshContactPoints().

Cosa funziona: processCollisionviene chiamato ogni volta che l'AABB del giocatore si interseca con voxel non aerei.

Cosa no: la risposta alla collisione è semplicemente strana ... L'entità giocatore inizia a levitare verso l'alto. Se entra in qualcosa, rimbalza violentemente. A volte, non è possibile continuare a muoversi su un asse dopo essere entrati in qualcosa. Ciò che sospetto stia accadendo è che i punti di contatto non vengano rilasciati dopo la risposta alla collisione, probabilmente a causa dell'entità giocatore che si trova sempre nell'ABS dell'oggetto mondiale. Sono curioso di vedere se sto abbaiando l'albero giusto rispetto a processCollision?


L'hai risolto del tutto? Sto riscontrando un problema molto simile.
Timoxley,

Un po 'tardi, scusa, non ho visto la tua domanda. Se non l'hai già capito, hai provato il disegno di debug dei tuoi corpi fisici? L'AABB che stai utilizzando per rilevare la collisione non limita il corpo fisico che stai utilizzando. Quindi quando rilevi la collisione, il tuo oggetto è già molto al suo interno. Questo spiega perché le tue reazioni di collisione sono così strane.
MichaelHouse

1
Vedi la mia ultima risposta alla mia domanda: gamedev.stackexchange.com/questions/27405/…
MichaelHouse

Risposte:


1

Purtroppo non sono stato in grado di ottenere risultati affidabili dal metodo descritto nella risposta a cui fai riferimento . Analogamente a te, vorrei ottenere strani eventi fluttuanti o situazioni in cui la rimozione di un voxel causava la fluttuazione in aria degli oggetti che galleggiavano sopra di essi, o una caduta di una strana piuma oscillante a terra. Ho abbandonato quella strategia per una nuova strategia.

Ho iniziato a creare mesh di collisione personalizzate per ogni pezzo di terreno voxel. Lo faccio con il BvhTriangleMeshShape. Funziona abbastanza bene:

inserisci qui la descrizione dell'immagine

Ci sono maggiori dettagli sull'implementazione delle mesh di collisione personalizzate qui .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.