Come risolvere le collisioni di forme composte utilizzando SAT?


16

SAT è un modo decente per determinare le collisioni tra poligoni convessi arbitrari. Otterrai anche il vettore necessario per risolvere una collisione.

Per risolvere le collisioni tra forme complesse (non convesse), stavo pensando a una sorta di forma composta composta da diversi poligoni convessi. Se si verifica una collisione nella fase larga (ad es. Cerchio contro cerchio o AABB vs AABB), la collisione verrebbe risolta controllando ciascun poligono nella forma composta rispetto a ciascun poligono nell'altra forma composta.

Mi chiedo quale sia il modo migliore per separare effettivamente gli oggetti? Un approccio ingenuo sarebbe quello di prendere il vettore con la massima magnitudine e usarlo per la separazione. Nell'immagine seguente, questo sarebbe V 2

Esempio SAT 1

Tuttavia, se i vettori di separazione puntano in direzioni diverse, la collisione non può essere risolta immediatamente e potrebbe richiedere diverse iterazioni. Quindi nella prossima immagine separeremmo usando V 1 e in un'altra iterazione di V 2 (o qualcosa di simile a V 2 , poiché la forma si sarebbe mossa della quantità di V 1 ).

Esempio SAT 2

Questo approccio fallirà nel separare i vettori che puntano nella direzione opposta l'uno dell'altro o in un caso come mostrato nella figura seguente:

Esempio SAT 3

Qui ripeteremo all'infinito tra lo stato a sinistra e lo stato a destra.

Quindi, per porre una domanda reale qui: qual è un approccio ragionevole a questo problema? Immagino che usare poligoni composti per forme complesse sia un'idea ragionevole, ma mi chiedo davvero come risolvere le collisioni in quel caso? Come posso rilevare un vicolo cieco come mostrato nella terza immagine?


Puoi chiarire per cosa vuoi usare il vettore?
Sarà il

@Will Il vettore dovrebbe essere usato per risolvere la collisione, in modo che le forme non si sovrappongano più. Quindi potrei spostare l'oggetto giallo dal vettore risultante e i due oggetti non si scontrerebbero più.
Bummzack,

Risposte:


7

Penso che potresti provare a inserire una chiave quadrata in un foro rotondo applicando SAT come sei, qui. Ovviamente, non è progettato per collisioni concave e concave, e sebbene io raccomandi il tuo sforzo di adattarlo a tale scopo, ci sono considerazioni che rendono improbabile che funzioni.

Realismo

L'impulso angolare e i suoi effetti a catena sono il nome del gioco qui.

L'ordine dei punti di contatto è importante per una risoluzione realistica delle collisioni. Nel mondo reale, uno di quei punti colpirà sempre prima di un altro. Ed è solo nell'emulazione di quell'ordine di contatto e dei risultati di ciascuna "sottocollisione" rappresentata da quello, che puoi aspettarti di ottenere un risultato realistico nella simulazione. Questo è uno dei motivi per cui stai rompendo il tuo concavo in convesso, in primo luogo: consente il rilevamento a tratti di quale parte ha colpito per prima. Naturalmente, questo può anche essere emulato come da mio commento sotto la voce "Meno realismo".

I tuoi dispositivi convessi si combinano per dare all'oggetto sia il suo contorno che il suo centroide (e ovviamente in simulazioni più complesse, ogni dispositivo può influenzare diversamente la densità). Il motivo per cui menziono questo è che nel risolvere realisticamente le collisioni, dovrai calcolare non solo l'impulso lineare ma anche angolare, seguendo ogni "sottocollisione" dei tuoi punti di contatto. Non è così semplice come il "push apart" di base che si applica con SAT.

Questo quindi cambia completamente la natura del tuo problema, perché come puoi vedere, è inutile ottenere e provare a usare 2 o più punti di contatto, perché in realtà è solo il primo che conta. Dopo aver risolto il primo in termini di impulso lineare e angolare, sarà necessario ricalcolare per ulteriori collisioni, poiché gli orientamenti di ciascun oggetto saranno cambiati. Inoltre, il rilevamento di ogni singolo contatto nella fase può essere necessario o meno all'interno di quella stessa fase - a seconda della temporizzazione tra i contatti quando viene toccato il primo punto di contatto degli oggetti, viene applicato il successivo impulso lineare e angolare, seconda tocca il punto di contatto e così via.

Meno realismo

Ovviamente, supponendo che tu non sia affatto interessato a risolvere l'impulso angolare, allora il meglio che puoi fare con SAT diventa essenzialmente esattamente quello che faresti se avessi avvolto questi poligoni come convessi usando qualcosa come Graham's Scan: allontanarsi dal singolo separatore vettore. In altre parole, ha poco senso cercare di risolvere tre vettori in tandem, come hai dimostrato. È il più grande del gruppo che conta.

MODIFICA in risposta alla tua domanda

Quello che devi fare se vuoi un approccio semplicistico è il seguente:

  • Determina la direzione corretta di spostamento. Ciò è più semplice eseguendo uno scafo convesso ciascuno e determinando le normali sull'asse di separazione.

  • Ora è necessario determinare l' entità dello spostamento . Perché non possiamo semplicemente usare la grandezza data da SAT? Perché se ci pensate, le profondità di compenetrazione saranno potenzialmente maggiori per gli scafi convessi, di quanto lo saranno per i loro scafi concavi abbinati - pensate a due E con i denti l'una nell'altra! Come hai fatto sopra, trova tutti i punti di contatto per un dato passaggio, ma trovali paralleli alle normali degli assi, perché questa è la direzione di spostamento corretta. Ora determina quale di questi vettori di sovrapposizione paralleli è il più lungo. Sostituisci quello, scarta il resto e procedi al prossimo passo di fisica.


Penso di vedere cosa intendi. Quindi nello scenario del "meno realismo" non valuterei solo i vettori (più brevi) forniti da SAT per i singoli poligoni, ma dovrei anche considerare le altre sovrapposizioni (più grandi) e, nel peggiore dei casi, usare lo scafo convesso?
Bummzack,

Vedi (ultima) modifica.
Ingegnere,
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.