Come si esegue il rilevamento delle collisioni su oggetti costituiti da molti piccoli triangoli?


13

Capisco che qualsiasi forma può essere creata (o approssimata) da triangoli più piccoli. Qualsiasi rettangolo può essere creato da 2 triangoli più piccoli. Ogni cerchio può essere creato da molti sottili triangoli a "fetta di pizza". Come si traduce in rilevamento delle collisioni?

Capisco come calcolare la sovrapposizione del rettangolo usando i vertici. Capisco come calcolare la sovrapposizione del cerchio usando il centro, i raggi e la distanza.

Ma come si fa a rilevare le collisioni su forme fatte di piccoli triangoli? Non specifici, ma solo il concetto generale ....

Risposte:


26

Ma come si fa a rilevare le collisioni su forme fatte di piccoli triangoli?

Non facendolo.

Il rilevamento delle collisioni contro una raccolta di triangoli arbitraria (o peggio, tra due raccolte di triangoli arbitrari) è proibitivamente costoso.

Invece, in genere eseguiamo il rilevamento delle raccolte in modo gerarchico, iniziando prima con forme estremamente grezze e semplici (come scatole o sfere) che si avvicinano (scarsamente) all'oggetto sottostante.

Questo ci consente di respingere rapidamente la maggior parte delle potenziali collisioni come "non verificatesi", che è il solito caso. Nel caso in cui passi un tale controllo grezzo, ciò indica una potenziale collisione effettiva e procediamo a eseguire il controllo contro un'approssimazione più dettagliata della forma sottostante (come una fatta con più forme di capsula ben aderenti o molte riquadri di delimitazione allineati).

Fondamentalmente, il rilevamento delle collisioni inizia con test grezzi e, al superamento di tali test, continua a rappresentare sempre più in dettaglio. Questa immagine, fornita da Shiro in un commento alla risposta di Alexandre , illustra come un modello complesso (un essere umano) possa essere rappresentato da una serie di forme più semplici:

hitboxes

Raramente abbiamo effettivamente bisogno di eseguire una collisione a livello di singolo triangolo, e quando lo facciamo di solito abbiamo usato i metodi più grezzi per eseguire il drill down su una serie molto piccola di potenziali triangoli su cui testare. A quel punto, vengono utilizzati algoritmi specifici per eseguire i test, proprio come faresti se due rettangoli si sovrappongono. Ad esempio, puoi determinare se e dove un raggio colpisce un triangolo .


Grazie. Sì, se stessi realizzando un gioco, utilizzerei solo un motore esistente. Ma voglio solo capire le idee di base che sono implementate in un motore di rilevamento delle collisioni pre-realizzato. Nel diagramma sopra, useresti la matematica del rettangolo per vedere se qualcosa sta toccando QUALSIASI delle dozzine di rettangoli che compongono l'uomo. È questa l'idea di base?
JackOfTutto il

Quelle sono scatole di delimitazione orientate (3D) non rettangoli. Ma si. Se avessi intenzione di provare se un raggio (che rappresenta, diciamo, un proiettile) si è scontrato con il giocatore, avrei testato il raggio contro quelle scatole - probabilmente dopo il primo test contro una scatola gigante che rappresenta l'intero personaggio - non contro tutti triangolo della mesh di rendering).

L'idea è che puoi usare un'approssimazione approssimativa del personaggio, come i riquadri di delimitazione orientati mostrati nell'immagine sopra, e testarlo prima per fare un hit test meno costoso, e se c'è una collisione poi vai al livello inferiore SE NECESSARIO, test dei singoli triangoli contenuti nel riquadro di selezione. In genere ci possono essere diversi gerarchi BV usati gerarchicamente, con quello esterno meno accurato ma il più veloce da testare (sfera, riquadro) e eseguire il drill down su qualcosa di più specifico (k-DOP) e potenzialmente approfondire ulteriormente (triangoli )
Kik,

4

Il rilevamento delle collisioni si basa sulla geometria (primitive come linea, piani, sfere, scatole, capsule, cilindri).

Se è necessario eseguire il rilevamento delle collisioni su forme fatte con un triangolo, ad esempio un terreno non piatto, è necessario eseguire un test su tutti i triangoli che formano la mesh.

Se arriverai a quel punto, ti consiglio vivamente di utilizzare un motore di rilevamento delle collisioni pre-realizzato, poiché questo tipo di cose diventano piuttosto complesse, abbastanza velocemente.


Come si fa a rilevare le collisioni su forme composte da triangoli?
JackOfTutti il

@JackOfAll ha già detto che nella sua risposta, che è quello di utilizzare la geometria dà forma solito i.stack.imgur.com/CAhxn.jpg
dimitris93

@JackOfAll Ho modificato la mia risposta; e come dice Shiro, se hai "oggetti" più complessi nel tuo ambiente (corpi, sedie, macchine, ecc ...), nello sviluppo del gioco di solito sono fatti di primitivi più semplici che sono legati insieme. Il rilevamento delle collisioni viene effettuato sulle forme primitive, ma la simulazione fisica viene quindi eseguita su tutto il corpo.
Vaillancourt

4
Non sto letteralmente cercando di creare un gioco, voglio solo capire le idee di base che sono implementate in un motore di rilevamento delle collisioni pre-realizzato. Se stavo davvero facendo un gioco, chiaramente non avrei reinventato la ruota, d'accordo.
JackOfTutto il
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.