350 likes | 466 Views
Collisioni. Daniele Marini. Campi applicazione. praticamente tutto: giochi, CAD, realtà virtuale complessità elevata dipendente dalla complessità degli oggetti soluzioni approssimate e soluzioni esatte esigenze di real time Accresce il realismo di una simulazione grafica. Fasi.
E N D
Collisioni Daniele Marini
Campi applicazione • praticamente tutto: giochi, CAD, realtà virtuale • complessità elevata dipendente dalla complessità degli oggetti • soluzioni approssimate e soluzioni esatte • esigenze di real time • Accresce il realismo di una simulazione grafica
Fasi • determinare se c’e’ collisione collision detection - test sì/no • determinare dove c’è collisione collision determination • decidere cosa fare quando c’è collisione collision handling
Metodi principali • metodi approssimati e veloci (ray tracing) • basati su BSP tree • basati su BV gerarchici • basati su OBB tree • basati su k-DOP tree
Metodo approssimato (ray tracing) • es. un automobile che viaggia su una superficie: determinare collisione ruote • si dovrebbero analizzare tutte le ruote rispetto alla superficie • semplificare: rappresentiamo l’auto con un insieme di raggi - un raggio per ogni ruota, si testa l’intersezione dei raggi con la superficie
Metodo appross. con raggi - 2 • all’inizio il raggio è posto sul punto di contatto ruota-superficie • il raggio è diretto verticalmente • a ogni passo si fa un test di intersezione raggio-superficie, se la distanza intersezione-origine_raggio è positiva non c’è contatto, se =0 contatto, se <0 penetrazione • l’esito del test guida la risposta alla collisione
Metodo appross. con raggi - 3 • la superficie può essere composta da molti triangoli • per accelerare il calcolo dell’intersezione con la superficie, essa può essere organizzata gerarchicamente • il calcolo della intersezione dipende dalle primitive usate nel rappresentare la superficie
Un’altra semplificazione • A volte si può ridurre un problema 3D a un problema 2D • Esempio: il labirinto • Un oggetto (giocatore) che si muove in un labirinto può essere approssimato da una circonferenza • Si testa la circonferenza rispetto alle linee del labirinto • Meglio: si spostano le linee di un offset pari al raggio della circonferenza • Il test ora è tra il centro della circonferenza e le linee spostate
Rilevazione collisioni accurata per molti oggetti • Per ”simulazione” intendiamo la modellazione del movimento degli oggetti
Collisione accurata tra oggetti complessi • Se è richiesto un risultato accurato si ricorre alla gerarchia di BV • Usa gerarchia di BV (BVH) separata per ciascun oggetto • Testare un BVH rispetto all’altro BVH per cercare sovrapposizioni • Se ci sono sovrapposizioni di triangoli si calcola l’intersezione esatta
Suddividere il piano Trova box minimo Ordina i piani rispetto ai centroidi Dei triangoli Esempio di costruzione di una gerarchia di volumi (BVH) = + …and so on.
Pseudocodice per testare un BVH rispetto a un altro BVH Considera 4 casi: 1) Test tra due nodi foglia 2) Test tra due nodi interni (non foglia) 3) Nodo interno vs. nodo foglia 4) Nodo foglia vs. nodo interno
Commenti • Termina quando trova la prima coppia di triangoli che collidono • Si può modificare per cercare tutte le coppie che collidono e metterle in una lista
Quali BV? • Scelte possibili: • AABB, OBB, k-DOP, sfere • In generale BV più ”stretti” comportano ricerche più lente • BV più laschi alla fine comportano più test tra coppie di triangoli • Funzione di costo:
Collisione tra molti oggetti -semplificare! • Immaginate centinaia di pietre che rotolano da un monte …. • La semplificazione viene spesso chiamata”First-Level Collision Detection (CD)” • Si preferisce fare una CD di primo livello per farne una di secondo livello meno frequentemente • Supponiamo ci sia elevata coerenza tra frame successivi • Ovvero gli oggetti sono vicini alla posizione precedente
Sweep-and-prune • Gli oggetti possono traslare e ruotare • Si determina un cubo minimale AABB che contiene un oggetto sotto tutte le possibili rotazioni • Si esegue il test di collisione tre volte rispetto ai tre assi considerando un solo asse per volta • Ciascun cubo sull’asse è un intervallo da si a ei, dove i è il numero del cubo
Sweep-and-prune • Si ordinano tutti gli si e ei in una lista • Si attraversa la lista da start a end • Quando si incontra un s, marca il correspondiente intervallo come attivo in una active_interval_list • Quando incontri un e cancella l’intervallo dalla active_interval_list • Tutti gli interrvalli nella active_interval_ list hanno sovrapposizioni
Sweep-and-prune • L’ordinamento costa: O(n*log n) • Ma si sfruttia la coerenza tra frame! • La lista quindi non dovrebbe cambiare molto • Si può perciò usare un ordinamento che ”riordina” un insieme già quasi in ordine, come bubble-sort, o insertion-sort • Complessità attesa: O(n)
Sweep-and-prune algorithm • Mantieni una variabile booleana per ciascuna coppia di intervalli • Scambia elementi quando cambia l’ordinamento • Se tutte le variabile booleane per i tre assi sono true, sovrapposizione
basato su BSP tree • la scena è organizzata in BSPtree • l’oggetto può essere: sfera, cilindro o poliedro convesso che contiene l’oggetto (guscio convesso convex hull) • è dinamico, se l’oggetto si sposta da p0a p1 determina dove avviene la collisione lungo il segmento p0 - p1 • nei giochi l’oggetto è approssimato da sfere o cilindri
basato su BSP tree - 2 • il test dovrebbe venire valutato rispetto ai piani di separazione dei sottospazi • si preferisce spostare il piano lungo la direzione ortogonale (si allarga o stringe il sottospazio): piano=n.x + d ---> n.x + d ±r c a c b e d d e p f p f a b
basato su BSP tree - 3 • una delle regioni del sottospazio è considerata piena (l’oggetto non può entrare): è il sottospazio negativo • se l’oggetto è nel sottospazio positivo (n.x + d ≥0) si sottrae r: n.x + d -r ( si “stringe” l’espansione del volume) • si valuta la distanza di p dal piano
basato su BSP tree - 4 • la sfera è una grossolana approssimazione, si può usare un guscio convesso • lo spostamento del piano d si sceglie nella direzione ortogonale al piano: -maxvi in S(n.(vi-p0)) • dove S è l’insieme dei vertici del guscio, il segno meno indica che il punto deve stare all’esterno • il punto p0può essere nel piede o nel centro di un modello, la posizione del punto viene aggiornata secondo la direzione di spostamento: p1=p0+w
basato su BSP tree - 5 • si può usare un cilindro per approssimare l’ingombro di un personaggio, è più veloce r y z x p0 p0 t e p0 p0 e
basato su BSP tree - 5 • si sposta il piano al punto t • si calcola e • si sposta il piano di e= |n.(t-p0)| • occorre calcolare t , se nz >0 la componente z è quella di p0 • se nx=ny=0 il piano è parallelo ai cerchi del cilindro (soffitto o pavimento) • si puo’ scegliere t=p0 altrimenti occorre trovare un punto sul bordo del cerchio
basato su BSP tree - 6 • possono esserci inaccuratezze
basato su BSP tree - 7 HitCheckBSP(N,v0,v1) #N radice del BSPtree, v0 v1 estremi segmento di spostamento return(TRUE,FALSE) if(not isSolidCell(N)) return FALSE esle if(isSolideCell(N)) #è una foglia e siamo all’interno pimpact=v0 return TRUE hit=FALSE if(clipLineInside(N shift out v0,v1,w0,w1)#parte del segmento di spostamento è all’interno del volume dilatato e restituisce il nuovo segmento w0,w1 hit = HitCheckBSP(N.right-child,w0,w1) if (hit) v1=pimpact end if(clipLineOutside(N shift in v0,v1,w0, w1) hit = HitCheckBSP(N.left-child,w0,w1) end return hit
basato su OBB tree • si riduce nv numero test overlap dii volumi e np numero testo overlap di primitive • il costo cv per OBB è maggiore che per AABB • durante il test si può orientare OBB agli assi riducendo il costo • nv enp sono minori per OBB rispetto AABB • la creazione di un OBB richiede il calcolo del guscio convesso O(nlogn), la profondità dell’albero costa O(logn), il costo totale è O(nlog2n)
basato su OBB tree - 2 • due OBB A e B sono archiviati con le matrici di rototraslazione MA ,M Brispetto al genitore • test di overlap di A e B si fa nel sistema di riferimento di A; A è un AABB, si trasforma B nel riferimento di A: TAB=M-1AMB • se i volumi si intersecano occorre discendere la gerarchia per testare rispetto a C
basato su OBB tree - 3 • facciamo il test rispetto al sottovolume C nel suo riferimento • si trasforma B nel sistema di A con TAB poi si trasforma B nel riferimento di C con MC-1 TCB= MC-1 TAB • si procede ricorsivamente usando lo pseudocodice già visto per BVH • esiste un software free che lo implementa: RAPID (robust accurate polygon interference detection) http://www.cs.unc.edu/~geom/OBB/OBBT.html
K-DOP • Politopi discreti orientati di ordine k • Definito da k/2 normali unitarie (normalizzate) ni cui sono associati due scalari dimin < dimax • Ogni tripletta (ni, dimin,dimax) identifica una “lastra” compresa tra i due piani identificati da: • L’intersezione di tutte le lastre identifica il k-DOP
basato su k-DOP • test di overlap dei volumi più veloce • BV più accurato (minor numero di np) • tutto ciò se k è piccolo, altrimenti degenera in guscio convesso • c’è un costo di aggiornamento dei volumi in movimento cu e pu • si è mostrato che k=18 dà un ottimo risultato • la costruzione di 18-DOP può partire da un AABB aggiungendo 12 piani combinando le 6 normali iniziali
altri problemi • dipendenza dal tempo: la collisione va rilevata in relazione ai fps della animazione • occorre controllare il frame rate, es. 50 fps richiedono 20 ms ciascuno, se 15 ms servono al rendering ne restano 5ms per la collisione • una tecnica è di attraversare l’albero non per profondità ma per ampiezza
altri problemi - 2 • gestione della collisione: cosa fare • es. rimbalzo di una pallina: • si determina la collisione • se viene rilevata: • si calcola la nuova traiettoria e velocità secondo le leggi della riflessione • In generale è oggetto del modello fisico scelto