Collisioni
Corso di
Programmazione Grafica e Laboratorio
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 raggiosuperficie, se la distanza intersezioneorigine_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 criconferenza

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 (se
necessario)
Esempio di costruzione di una
gerarchia di volumi (BVH)
Suddividere
il piano
Ordina i
piani
rispetto ai
centroidi
Dei triangoli
=
+
Trova box
minimo
…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
• Teermiona 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 traingoli
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
– È una ipotesi ragionevole
Sweep-and-prune
[Ming Lin]
• Gli oggetti possono traslare e ruotare
• Si determina un cubo minimale che
contiene un oggetto sotto tutte le possibili
rotazioni
• Eseguire il testi di collisione tre volte
rispetto ai tre assi
• Consideriamo un solo asse per volta
• Ciascun cubo sull’asse è un intervallo da si
a ei, dove i è il numero del cubo
Sweep-and-prune
• Ordina tutti gli si e ei in una lista
• Attraversa la lista da start a end
• Quando incontri 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 sfruttiamo 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
• Compelssità 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 p0 a
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 sottospazio):
piano=n.x + d ---> n.x + d +-r
c
a
c
b
e
d
d
p
f
f
a
b
e
p
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 valuta la distanza di p dal piano
basato su BSP tree - 4
• la sfera è una grossolana approssimazione, si
può usare guscio convesso
• lo spostamento del piano d si sceglie nella
direzione più 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 p0 può essere nel piede o l’ombelico di
un personaggio, la posizione del punto viene
aggiornata secondo la direzione di spostamento:
p1=p0+w
basato su BSP tree - 5
• si puà usare un cilindro, è più veloce
r
z
y
x
p0
p0
t
e
e
p0
p0
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 se si puo’ prendere t=p0 altrimenti
si trova un punto sul bordo
basato su BSP tree - 6
tx 
ty 
rn x
n n
2
x
2
y
rn y
n n
2
x
2
y
 px
 py
• possono esserci inaccuratezze

basato su BSP tree - 7
HitCheckBSP(N,v0,v1)
return(RUE,FALSE)
if(not isSolidCell(N)) return FALSE
esle if(isSolideCell(N))
pimpact=v0
return TRUE
hit=FALSE
if(clipLineInside(N shift out v0,v1,w0, w1)
hit = HitCheckBSP(N.negativechild,w0,w1)
if (hit) v1=pimpact
end
if(clipLineOutside(N shift in v0,v1,w0, w1)
hit = HitCheckBSP(N.positivechild,w0,w1)
end
return hit
basato su OBB tree
• si riduce nv numero test overlap volumi e np numero
testo overlap primitive
• il costo cv per OBB è maggiore che per AABB
• durante il test si può orientare OBB agli assi riducendo il
costo
• nv e np 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 B rispetto al
genitore
• test di overlap di A e B 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
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
• esiste un software free che lo implementa:
RAPID (robust accurate polygon interference
detection)
http://www.cs.unc.edu/~geom/OBB/OBBT.html
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 con somme delle 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
Scarica

p 0 - Università degli Studi di Milano