Far funzionare il rilevamento delle collisioni è un ottimo primo obiettivo per il tuo motore fisico 2D. È positivo che tu abbia deciso che per ora stai lavorando specificamente in 2D, poiché non tutte le regole in 2D funzionano in 3D, nonostante la quantità di algoritmi relativi alla dimensione n, a un certo punto devi specializzarli (fai di più variante specifica come il modo in cui il prodotto incrociato soddisfa solo l'identità Jacobi in 3D).
La tua domanda riguarda intrinsecamente l'architettura e il design del framework e non la fisica 2D, quindi la preoccupazione di ciò che il tuo edificio dovrebbe essere separato nella tua mente per come vengono utilizzati quei pezzi. In sostanza, è necessario separare la mentalità di costruzione del motore / libreria / framework dal suo utilizzo in un altro progetto.
Architects motori di risoluzione:
con qualsiasi motore matematico, essenzialmente vogliamo mettere i valori in qualche funzione e ci aspettiamo che i valori che risultano utili per realizzare una simulazione interessante.
Gli elementi chiave di questo processo dovrebbero essere il più astratti possibile mentre gli elementi atomici (i più piccoli pezzi utili di dati / metodi) dovrebbero essere specifici per scopi individuali ed essere utili per comporre insieme. Nel nostro caso quasi l'unico utile atomico è un vettore 2D, che dovrebbe essere una singola classe di oggetti che consente l'espressione di una struttura (x, y) e ha metodi per tutte le operazioni matematiche di base utili per i calcoli vettoriali in 2D. Addizione, sottrazione, normalizzazione, normale (perpendicolare), prodotto incrociato, punto prodotto, magnitudo / lunghezza e qualsiasi altra cosa si incontri che è inerentemente inerente al vettore -> operazioni vettoriali o vettore -> operazioni numeriche reali. Se stai usando un linguaggio di classe, un semplice class Vector
con ognuno di questi come funzione membro o sovraccarico dell'operatore farebbe molto bene.
Dopo che tutti i tipi atomici sono stati costruiti, comporresti i loro algoritmi in un altro livello sopra il nostro tipo atomico Vector
. Il mio go to sarebbe a Line
e a Curve
. Decideremo qui che a Curve
è fuori portata per questo e richiede molta specializzazione (il concetto a cui si fa riferimento sopra come la creazione di molte funzioni di casi speciali). Da Vector
comporrei anche a Rectangle
come Vector
primitiva 4 , comporre Circle
dal vettore usando a Vector
e a radius
, e poi comporrei anche un Polygon
da Vector
. Polygon
dovrebbe essere fatto da Vector
e non Line
qui perché ogni linea condividerebbe un punto duplicato con l'ultima linea nel poligono.
Ora hai delle forme, ma non sappiamo cosa farne.
Collision Detection Il
rilevamento delle collisioni non è una scienza esatta e non esiste un singolo algoritmo perfetto (o uno qualsiasi). Esistono molti metodi che possono essere utilizzati per ottenere una varietà di effetti di qualità o addirittura avere una maggiore precisione rispetto ad altri. Fondamentalmente, tuttavia, può essere separato in alcuni diversi livelli di preoccupazione e quindi in alcuni processi diversi.
Il rilevamento di collisioni a fase larga è l'atto di sezionare le aree in cui ci preoccupiamo di ciò che potrebbe / potrebbe / si scontrano e di separarle per il processo a fase stretta. In 2D in genere consiglierei di usare un albero quad per questo. Per questo avremo bisogno del nostro che Rectangle
abbiamo costruito in precedenza e di fornire un rilevamento delle collisioni AABB. Questo sta per Axis Aligned Bounding Box e lo useremo per determinare che per una scatola non rotante in A
cui non B
esiste alcuna parte della scatola A
. Dal presupposto che nessuna parte di B
può esistere all'interno di A
una collisione esiste se si intersecano.
Un albero quad è un processo ricorsivo in cui si determina una profondità massima o si consente invece alla quantità dell'oggetto di impedire una profondità di ricorsione infinita. Raggruppa i corpi fisici in 4 regioni (da cui il nome) e dovrebbe consentire di accedere a ciascun quad separatamente. Dovresti quindi entrare in ognuno di quei quattro quaderni ed eseguire lo stesso processo che non tratterò qui per brevità ma è disponibile qui: https://gamedevelopment.tutsplus.com/tutorials/quick-tip-use-quadtrees- gamedev-374 - a-probabili-collisioni-in-2d-spazio-rilevamento
Collisione a fase strettaè il processo di analisi dei gruppi di forme che abbiamo già determinato si scontrerà / potrebbe / farà scontrarsi e di eseguire un controllo delle collisioni più discreto, a questo punto iniziamo a preoccuparci se gli oggetti ruotano o meno (ho vinto ' coprire questo, quando si superano queste fasi di collisione, si cerca di rilevare la collisione con momento angolare) e la forma del loro corpo di collisione. Per eseguire questa parte della collisione devi specializzare i tuoi metodi come descritto sopra (creando funzioni specifiche per AABBvsCircle, OBBvsCircle, CirclevsCircle, PolygonvsPoint, PolygonvsCircle, PointvsCircle, ecc.) Tuttavia, questi stessi metodi possono anche essere eseguiti su più livelli come sopra.
I suoi controlli di separazione primitivi sono i discreti, i metodi di rilevamento delle collisioni specializzati o quelli generali come SAT seconda caso d'uso e dovrebbero essere tutti semplicemente restituire un valore true / false, o restituire un oggetto relazionale, come un Manifold
, Joint
, CollisionObject
ecc, che avrebbe un collegamento con le due forme che si trovano a scontrarsi e tutte le informazioni su di esse necessarie per risolvere la collisione, ad esempio quanto in profondità si scontrano o a quale velocità (quali dati sono necessari nella varietà dipendono dal metodo di risoluzione utilizzato). Quell'oggetto si passa a un oggetto Solver
che dovrebbe astrarre le differenze tra tutte le diverse forme che potrebbero scontrarsi, accettando solo una Manifold
e non accettando alcuna informazione particolare sulle forme.
Sommario
Il Solver
prenderà il Manifold
prodotto facendo scontrare un po 'di primitiva A
con un po' di primitiva B
, usando prima il raggruppamento di fase ampia (tutto vs mondo) e poi il rilevamento di fase stretta (A vs B) e se le forme sono non poligonali devono essere specializzate, Solver
quindi produce sia nuove Vector
s per le posizioni e le velocità delle forme in collisione, o un oggetto che il PhysicsEnvironment
o World
può quindi utilizzare per risolvere la collisione sui propri figli, quindi infine aggiornare QuadTree
e ripetere questo processo sul fotogramma successivo. Se entrambe le forme in collisione sono poligoni, la specializzazione dovrebbe essere fatta solo per quanto riguarda l'aumento delle prestazioni, altrimenti semplicemente usando il teorema sull'asse di separazione