Qual è un buon algoritmo per rilevare la collisione tra sfere in movimento?


27

Se (ai fini del rilevamento delle collisioni) gli oggetti 3D sono rappresentati in un gioco da sfere, qual è un buon algoritmo per rilevare una collisione tra sfere?

Se ogni oggetto ha una posizione a partire dall'ultimo fotogramma e una nuova (desiderata) posizione, qual è un buon algoritmo che identificherà le collisioni in cui le sfere non si intersecano nel fotogramma precedente e potrebbero non intersecarsi nel secondo fotogramma, ma si sono intersecati da qualche parte nel mezzo?

Risposte:


18

Fondamentalmente stai cercando una traccia.

Questa pagina probabilmente ti aiuterà: http://www.realtimerendering.com/intersections.html

Sfera in movimento / Sfera: (posizione) Aggiungi il raggio della sfera in movimento alla sfera statica e tratta la sfera in movimento come un raggio. Utilizzare questo raggio per eseguire l'intersezione raggio / sfera. Vedi Gomez; Schroeder per il codice (l'articolo ha un bug in derivazione, il codice va bene); e RTR2, pag. 622.


1
Ciò non funziona se entrambe le sfere si muovono (anche se non lo fai due volte). Mi sembra che dovresti prima fare un controllo della distanza tra le linee che attraversano il movimento a e quello che attraversa il movimento b, e se questo è inferiore al raggio a + raggio b hai una possibile collisione. Dopodiché farei un controllo per vedere dove si trova quel punto per la sfera a e dove per la sfera b per vedere se i tempi sono vicini. In tal caso, controllerei la velocità rispetto alla distanza nel tempo per quel punto, se è ancora una possibile collisione farei un perfezionamento graduale.
Kaj,

15
In realtà lo fa, devi solo rendere il movimento relativo. Quindi, se entrambe le sfere si muovono, basta sottrarre la velocità di una delle sfere da entrambe in modo da avere una sfera "in movimento" e una sfera "stazionaria". Quindi è possibile utilizzare quanto sopra.
Tetrad,


4

In cima alla mia testa:

  1. Crea due segmenti di linea dal centro di ogni cerchio da dove è iniziato a dove si è spostato in quel passaggio temporale.
  2. Trova la distanza minima tra quei due segmenti di linea; come spiegato qui .
  3. Se quella distanza è inferiore o uguale al raggio del primo cerchio più il secondo, allora si scontrano; altrimenti non lo fecero.

E questo è tutto quello che c'è da fare, mi aspetto che sia abbastanza veloce.


1

Ecco un altro bell'articolo sulla Gamasatura .


1
Mi rendo conto che è 7 anni dopo, ma questa risposta è solo link. Fortunatamente il link è ancora attivo, ma se non lo fosse, la tua risposta non sarebbe ... una risposta.
Draco18s

0

Parlando come qualcuno che ha fatto questo: non vale la seccatura . A meno che il design del tuo gioco non ne abbia assolutamente bisogno, e quasi certamente non lo farà, spenderai molto più sforzo per far funzionare il tuo lavoro di quanto ti aspetti. E sarà più lento di quanto volevi.


Potrebbe fare un gioco di biliardo per tutto quello che sai.
Kaj,

Se stava realizzando un gioco di biliardo, il suo "game design ne ha assolutamente bisogno" .
deft_code

Hai ragione, non reinventare la ruota . Ma solo per excersise potrebbe valerne la pena.
user712092,

4
Non sono d'accordo con lo scoraggiamento diretto come risposta .
Bobobobo,

Sono d'accordo con @bobobobo, la domanda non è se valga la pena o no, un futuro utente che vede questa discussione potrebbe assolutamente aver bisogno della risposta, indipendentemente dal costo. Questo sarebbe meglio come commento.
TomTsagk,


0

Il rilevamento delle collisioni per oggetti in movimento è in genere chiamato "Calcolo del volume di sweep", qui ci sono alcuni codici / articoli su questo argomento.

http://www.gpu-voxels.org/demos/ (Demo)

Librerie di codici sorgente:

https://github.com/fzi-forschungszentrum-informatik/gpu-voxels

https://libigl.github.io/tutorial/#swept-volume

https://github.com/gradientspace/geometry3Sharp

articoli:

http://gamma.cs.unc.edu/SV/sm03.pdf

https://www.cs.columbia.edu/~allen/PAPERS/abrams.swept.pdf (Purtroppo nessun codice sorgente)

http://www.realtimerendering.com/intersections.html (raccolta piuttosto pesante di collegamenti)


1
Le risposte che contengono solo un collegamento (o, in questo caso, diversi) non contengono una risposta effettiva. Dovresti includere le informazioni pertinenti nel tuo post in modo che se quei link si interrompono, il tuo post è ancora comprensibile.
Draco18s

Le informazioni dietro i collegamenti spiegano leggermente meglio di me al momento. Ci sono anche video dimostrativi dietro i link, che danno una percezione di ciò che sta accadendo in tempo reale.
TarmoPikaro,

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.