Come risolvere la penetrazione di due corpi in collisione


9

Ho implementato un semplice motore di fisica dei giochi 3D. Ho già un buon rilevamento delle collisioni, ora sto cercando di capire la parte di risposta alle collisioni. Sto usando il metodo basato sugli impulsi per calcolare le velocità post-collisione. Funziona abbastanza bene, tuttavia, non impedisce completamente ai corpi di continuare a compenetrarsi. Quindi ho un pezzo di codice aggiuntivo per risolvere la penetrazione. Attualmente, muovo i corpi lungo il contatto normale per metà della profondità di penetrazione - primo corpo nella direzione del contatto normale, secondo corpo nella direzione opposta.

Questo va bene per la maggior parte del tempo, ma ci sono alcuni effetti indesiderati. Ad esempio, immagina uno stretto corridoio e un oggetto che si muove attraverso di esso. Se l'oggetto colpisce una delle pareti del corridoio, la risoluzione di penetrazione lo sposta nella parete opposta, quindi nel fotogramma successivo nella prima parete e così via. L'effetto è che l'oggetto è una specie di vibrazione molto veloce tra le pareti, il che non è carino.

Quindi la mia domanda è se esiste un modo migliore per risolvere la penetrazione? Forse non muovere i corpi, solo in qualche modo regolare le loro velocità (oltre al calcolo degli impulsi) in modo che smettano di muoversi l'uno verso l'altro e la penetrazione si risolva da sola nei prossimi due fotogrammi. Sto solo indovinando qui. Qualche idea?

Risposte:


3

Quando si rileva una collisione, determinare in quale momento / punto i corpi hanno iniziato a scontrarsi e trattare la collisione a questo punto. A questo punto potresti ancora avere una leggera penetrazione da risolvere, ma sarà molto più piccolo e [in genere] non produrrà i problemi di oscillazione che stai riscontrando.

Diciamo che hai passi di simulazione di 100ms e che in alcuni frame hai due sfere che si scontrano a metà strada (50ms) nel frame. Innanzitutto, rileverai che si sono scontrati in qualsiasi punto dell'inquadratura (cosa che confido che stai già facendo in modo efficace). Determineranno in quale momento della cornice si sono scontrati. Ora gestisci la collisione, inclusi i primi 50ms del frame in cui non si sono scontrati. Ora avrai le nuove velocità delle palline e ora puoi anche fare dei passi per assicurarti che non penetrino (dovrebbero essere molto piccoli poiché "è appena successo"). Infine, simulerai i prossimi 50 anni di la cornice. Si noti che durante questo periodo, potrebbe benissimo esserci un'altra collisione con una o entrambe queste sfere.


1
Quindi in pratica stai suggerendo di implementare il rilevamento continuo delle collisioni e quindi gestire le penetrazioni ancora lasciate allo stesso modo in cui lo faccio già, dal momento che probabilmente saranno molto piccole. Questo potrebbe funzionare suppongo. Ora devo solo capire come rendere continuo il mio rilevamento delle collisioni :)
Adamo,

Non sono sicuro di cosa intendi per continuo. A rigor di termini, non c'è nulla di continuo nella simulazione fisica, poiché tutto è sempre suddiviso in passi discreti di una certa dimensione. Fare passi più piccoli, che è essenzialmente quello che suggerisco, produrrà errori molto più piccoli (e più facili da correggere). Un altro modo di pensare a questo è che esiste una relazione diretta tra dimensione del passo ed errori (come la penetrazione). Quindi, quando si rileva un errore del genere, suddividere in passaggi più piccoli fino a quando l'errore non è banalmente risolvibile.
notlesh

Il rilevamento continuo delle collisioni significa che invece di controllare l'intersezione tra due oggetti statici (un problema 3d), si controlla il contatto di due oggetti in movimento (fondamentalmente, un problema 4d). Di solito è sufficiente considerare solo le velocità costanti, perché è possibile approssimare le traiettorie con curve lineari a tratti. Il vantaggio è che la distanza di penetrazione sarà sempre zero (o vicina a causa di errori di arrotondamento del galleggiante). Pensavo ne parlassi, ma forse ho frainteso la tua risposta?
Adamo,

@adam Sì, è di questo che sto parlando.
notlesh

2

Dai un'occhiata a questo articolo - che è stato pubblicato qui molte volte in precedenza, basta cercare tra le domande e risposte contrassegnate per il rilevamento delle collisioni - mostra come eseguire la risoluzione "continua" delle collisioni di cui parlava Stephelton:

http://www.gamasutra.com/view/feature/3383/simple_intersection_tests_for_games.php?page=3

Fondamentalmente, risolvi alcune equazioni cinematiche di base per il punto esatto del tempo quando i tuoi due rettangoli iniziano a intersecarsi. Si risolvono le collisioni in quel preciso momento, quindi si procede con il tempo rimanente nella cornice. Potrebbe essere necessario simulare nuovamente ciò che accade dopo il momento della collisione, poiché le velocità / accelerazioni dei tuoi oggetti saranno cambiate. Ma c'è il tuo punto di partenza, comunque ... evviva!


Grazie, ho controllato l'articolo. Il fatto è che sto usando una diversa rappresentazione dei miei oggetti. Sto usando poliedri convessi e testando la collisione usando il teorema degli assi di separazione. Questo può essere esteso per gestire i corpi che si muovono con velocità lineari costanti (cosa che so fare), ma non ho idea di come gestire anche le velocità angolari. Ma farò una domanda separata se decido di andare in questo modo.
Adamo,
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.