collisioni corso di programmazione grafica e laboratorio daniele marini

35
Collisioni Corso di Programmazione Grafica e Laboratorio Daniele Marini

Upload: aroldo-graziani

Post on 02-May-2015

218 views

Category:

Documents


3 download

TRANSCRIPT

Page 1: Collisioni Corso di Programmazione Grafica e Laboratorio Daniele Marini

Collisioni

Corso di Programmazione Grafica e Laboratorio

Daniele Marini

Page 2: 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

2Programmazione grafica a.a. 2007/2008

Page 3: Collisioni Corso di Programmazione Grafica e Laboratorio Daniele Marini

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

3Programmazione grafica a.a. 2007/2008

Page 4: Collisioni Corso di Programmazione Grafica e Laboratorio Daniele Marini

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

4Programmazione grafica a.a. 2007/2008

Page 5: Collisioni Corso di Programmazione Grafica e Laboratorio Daniele Marini

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

5Programmazione grafica a.a. 2007/2008

Page 6: Collisioni Corso di Programmazione Grafica e Laboratorio Daniele Marini

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

6Programmazione grafica a.a. 2007/2008

Page 7: Collisioni Corso di Programmazione Grafica e Laboratorio Daniele Marini

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

7Programmazione grafica a.a. 2007/2008

Page 8: Collisioni Corso di Programmazione Grafica e Laboratorio Daniele Marini

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

8Programmazione grafica a.a. 2007/2008

Page 9: Collisioni Corso di Programmazione Grafica e Laboratorio Daniele Marini

Rilevazione collisioni accurata per molti oggetti

• Per ”simulazione” intendiamo la modellazione del movimento degli oggetti

9Programmazione grafica a.a. 2007/2008

Page 10: Collisioni Corso di Programmazione Grafica e Laboratorio Daniele Marini

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

10Programmazione grafica a.a. 2007/2008

Page 11: Collisioni Corso di Programmazione Grafica e Laboratorio Daniele Marini

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. 11Programmazione grafica a.a. 2007/2008

Page 12: Collisioni Corso di Programmazione Grafica e Laboratorio Daniele Marini

Pseudocodice per testare un BVH rispetto a un altro BVH

Considera 4 casi:

1) Test tra due nodi foglia2) Test tra due nodi interni(non foglia)3) Nodo interno vs. nodo foglia4) Nodo foglia vs.nodo interno 12Programmazione grafica a.a.

2007/2008

Page 13: Collisioni Corso di Programmazione Grafica e Laboratorio Daniele Marini

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

13Programmazione grafica a.a. 2007/2008

Page 14: Collisioni Corso di Programmazione Grafica e Laboratorio Daniele Marini

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:

nv : numero di test di sovrapposizione tra BV

cv : costo del test di sovrapposizione tra BV

np : numero di coppie di primitive testa per la sovrapposizione

c p : costo del test di sovrapposizione tra due primitive

nu : numero di BV aggiornati per ilmovimento del modello

cu : costo dell'aggiornamento di un BV 14Programmazione grafica a.a. 2007/2008

Page 15: Collisioni Corso di Programmazione Grafica e Laboratorio Daniele Marini

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

15Programmazione grafica a.a. 2007/2008

Page 16: Collisioni Corso di Programmazione Grafica e Laboratorio Daniele Marini

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

16Programmazione grafica a.a. 2007/2008

Page 17: Collisioni Corso di Programmazione Grafica e Laboratorio Daniele Marini

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

17Programmazione grafica a.a. 2007/2008

Page 18: Collisioni Corso di Programmazione Grafica e Laboratorio Daniele Marini

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)

18Programmazione grafica a.a. 2007/2008

Page 19: Collisioni Corso di Programmazione Grafica e Laboratorio Daniele Marini

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

19Programmazione grafica a.a. 2007/2008

Page 20: Collisioni Corso di Programmazione Grafica e Laboratorio Daniele Marini

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

20Programmazione grafica a.a. 2007/2008

Page 21: Collisioni Corso di Programmazione Grafica e Laboratorio Daniele Marini

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

a

e

c

d

b

ab c

d e

ff pp

21Programmazione grafica a.a. 2007/2008

Page 22: Collisioni Corso di Programmazione Grafica e Laboratorio Daniele Marini

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

22Programmazione grafica a.a. 2007/2008

Page 23: Collisioni Corso di Programmazione Grafica e Laboratorio Daniele Marini

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 p0 può essere nel piede o nel centro di un

modello, la posizione del punto viene aggiornata secondo la direzione di spostamento: p1=p0+w

23Programmazione grafica a.a. 2007/2008

Page 24: Collisioni Corso di Programmazione Grafica e Laboratorio Daniele Marini

basato su BSP tree - 5

• si può usare un cilindro per approssimare l’ingombro di un personaggio, è più veloce

p0

r

z y

xp0

p0

t

p0e

e

24Programmazione grafica a.a. 2007/2008

Page 25: Collisioni Corso di Programmazione Grafica e Laboratorio Daniele Marini

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 cerchio25Programmazione grafica a.a.

2007/2008

Page 26: Collisioni Corso di Programmazione Grafica e Laboratorio Daniele Marini

basato su BSP tree - 6

• possono esserci inaccuratezze€

tx =rnxnx

2 + ny2

+ px

ty =rny

nx2 + ny

2+ py

26Programmazione grafica a.a. 2007/2008

Page 27: Collisioni Corso di Programmazione Grafica e Laboratorio Daniele Marini

basato su BSP tree - 7HitCheckBSP(N,v0,v1) #N radice del BSPtree, v0 v1

estremi segmento di spostamentoreturn(TRUE,FALSE)if(not isSolidCell(N)) return FALSEesle if(isSolideCell(N)) #è una foglia e siamo all’interno

pimpact=v0

return TRUEhit=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)endreturn hit 27Programmazione grafica a.a.

2007/2008

Page 28: Collisioni Corso di Programmazione Grafica e Laboratorio Daniele Marini

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 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)

28Programmazione grafica a.a. 2007/2008

Page 29: Collisioni Corso di Programmazione Grafica e Laboratorio Daniele Marini

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 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

29Programmazione grafica a.a. 2007/2008

Page 30: Collisioni Corso di Programmazione Grafica e Laboratorio Daniele Marini

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

30Programmazione grafica a.a. 2007/2008

Page 31: Collisioni Corso di Programmazione Grafica e Laboratorio Daniele Marini

K-DOP

• Politopi discreti orientati di ordine k

• Definito da k/2 normali unitarie (normalizzate) ni cui sono associati due scalari di

min < dimax

• Ogni tripletta (ni, dimin,di

max) identifica una “lastra” compresa tra i due piani identificati da:

• L’intersezione di tutte le lastre identifica il k-DOP

ni .x + dimin = 0

ni .x + dimax = 0

31Programmazione grafica a.a. 2007/2008

Page 32: Collisioni Corso di Programmazione Grafica e Laboratorio Daniele Marini

32Programmazione grafica a.a. 2007/2008

Page 33: Collisioni Corso di Programmazione Grafica e Laboratorio Daniele Marini

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

33Programmazione grafica a.a. 2007/2008

Page 34: Collisioni Corso di Programmazione Grafica e Laboratorio Daniele Marini

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

34Programmazione grafica a.a. 2007/2008

Page 35: Collisioni Corso di Programmazione Grafica e Laboratorio Daniele Marini

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

35Programmazione grafica a.a. 2007/2008