Metodi per collision detection
per il corso di Geometria Computazionale
Indice:
________________
Il problema delle collisioni nel campo
della simulazione fisica e suoi derivati è sempre stato un problema sia
di difficile soluzione sia di enorme interesse.
La sua difficolta stà nella sua appartenenza
all dominio di esplorazione esponenziale delle soluzioni:per ogni faccia
si deve fare un confronto con tutte le altre faccie presenti nella scena
portando a tempi computazionali troppo alti per applicazioni real time;
questo ha portato a sviluppo di metodi di approssimazione per applicazioni
con necessità real time nella simulazione di collisioni,per esempio videogiochi
o robotica.
TOP HOME
____________
I primi metodi per la collision detection
si sono basati sulla tecnica bounding box: il metodo disegna un parallelepipedo
attorno al corpo e basa la sua decisione per la collisione in base all'intersezione
o meno di queste costruzioni.La velocità è guadagnata a discapito della
precisione,ma in molti campi questa caratteristica è meno importante rispetto
alla generazione di frame.
Per corpi molto complessi e facilmente
suddivisibili in zone distinte la tecnica bounding box viene applicata
ad ogni sottocorpo in modo indipendente l'una dall'altra, quindi di avrà
un accrescimento della precisione a scapito solo di un fattore costante
sui tempi di computazione.
Man mano che nuovi metodi maggiormente
precisi venivano sviluppati metodi precedenti, solitamente piu veloci,
venivano chiamati per ordine di precisione maggiore fin quando uno di questi
non dava un esito negativo.Questo metodo di procede può velocizarre la
computazione applicando metodi sempre piu precisi solo quando ce ne sarà
bisogno.
Altra caratteristica sfruttata in alcuni
campi e l'indeformabilità dei corpi, questo comporta la possibilità di
computare caratteristiche degli oggetti presenti nello spazio a priori,non
gravando alla computazione della scena.Un esempio in questo senso e la
tecnica del bsp(binary space partition) tree,che spezza la scena in regioni
di spazio e la computazione di collisioni(ma non solo) viene effettuata
solo se due oggetti appartengono alla stesso spazio.
Una tecnica analoga può essere applicata
anche al singolo oggetto non solo all'intero spazio: ogni corpo viene strutturato
come un albero in modo che la ricerca di una qualsiasi entità geometrica
utile per la collision detection sia in una struttura ottimizzata per la
ricerca rispetto alla posizione della stessa all'interno del corpo.
Esistono altre tecniche per la collision
detection che non si basano sull intersezione di corpi ma sul calcolo delle
distanze minime tra corpi.Queste tecniche sono usate soprattutto se si
necessità di una precisione maggiore.
TOP HOME
__________________________
Il progetto e stato sviluppato basandosi
sulla struttura di un singolo corpo.Questa e stato pensato come un grafo,
quindi un insieme di vertici e un insieme di relazioni tra di essi,ovvero
la loro connessione,questo permette una creazione incrementale dell'oggetto
e la possibilità di inserimento di funzioni solitimante usate sui grafi.I
corpi possono essere inoltre creati in base a certi parametri di input
per la propria geometria locale, per esempio è possibile specificare la
lunghezza del lato al cubo oppure il numero di meridiani e paralleli della
sfera poligonale.A questa struttura sono state aggiunte informazioni riguardanti
il corpo come il suo vettore di rotazione,il suo colore e via dicendo.
Ogni oggetto ha un suo sistema di coordinate,
solitamente centrato nel baricentro del corpo per operazioni locali, mentre
per operazioni tra corpi esite un sistema di coordinate mondo e la transformazione
avviene tramite i vettori di rotazione traslazione e scalatura del corpo.
Questa serie di transformazioni vengono
racchiuse in una matrice di transformazione per portare ogni vertice dell'oggetto
espresso inizialmente in coordinate oggetto in coordinate mondo concatenando
le matrici di scalatura, rotazione e traslazione in questo ordine.
Esiste una seconda matrice che viene applicata
ad ogni singolo vertice per la sua proiezione, parallela o prospettica,
per ottenere la visualizzazzione dell'oggetto nelle aree di visualizzazione
opportune.
Le due matrici risultanti vengono moltiplicate
per ottenere la matrice finale di visualizzazione completa dell'oggetto,che
avrà vita fin quando tutti i vertici del suddetto verranno processati,alchè
si ricomputera la prima matrice e la si moltiplicherà per la seconda matrice
rimasta invariata fin quando non si dovra rendere la scena su un altra
finestra.
Tutti gli oggetti presenti nel mondo vengono
mantenuti tramite un vettore e processati,tramite la matrice detta sopra,
uno per uno dalla classe engine che restituira un oggetto draw bidimensionale
su cui si faranno le operazioni di selezione,che avviene calcolando il
perimetro esterno dell'oggetto e stabilendo se il punto di click sia o
meno all interno di questo perimetro.
L'interfaccia invece si occupa di catturare
gli eventi del mouse click e drag e quelli della tastiera alt e shift e
li organizza in base alla sorgente dell'evento e al tool selezionato,una
volta catturata l'azione viene chiamata una funzione dell'engine atta a
soddisfare la richiesta,non esiste nessuna intersezione logica della parte
engine (kernel o core dell'applicazione) e la sua interfaccia grafica tranne
per la particolare classe drawcanvas che si occupa anche di fare alcune
operazioni sulle immagini a video in bidimensionale come trovare il perimetro.
Esiste una seconda classe che mette a disposizione
delle funzioni alla gui ed è la classe collisionengine che si occupa di
trovare le collisioni all'interno della geometria mondo e creare nuovi
oggetti temporanei atti alla visualizzazzione della collisione.
Esiste quindi la tipica separazione gui da
core/kernel in cui le classi che si interfacciano l'una verso l'altra sono
rispettivamente i vari gestori degli eventi e le 4 canvas(input e output
rispettivamente), e le classi engine e collisionengine.
Purtroppo per una mancanza sia di tempo non
e stata un altra classe che poteva essere una classe del tipo rasterengine
atta a operare sulle immagini bidimensionali a video,con possibilità di
implementazione di zbuffer antialias o alcuni modelli di illuminazione
per il rendering.
TOP HOME
_______________________
Descriviamo ora come è stata pensata ed
implementata tutta la geometria del progetto.
Tutti gli oggetti istanziabili sono sottoclassi
della classe Draw che mette a disposizione una serie di chiamate standard,
per esempio per l'aggiunta di un vertice o di un collegamento tra vertici
e via dicendo, ed ognuna di queste sottoclassi effettua la costruzione
del corpo in un proprio sistema di riferimento: tutti i vertici sono costruiti
attorno ad un punto fisso,di solito il baricentro.
Alcune sottoclassi mettono a disposizione
alcune informazioni addizzionali per rendere consistente l'informazione
del corpo,per esempio la classe DrawBerzie aggiunge le informazioni sul
grado in u e v della superficie di Bezier che si andrà a creare e la classe
DrawRationalBerzie aggiunge la matrice dei pesi per ogni superficie razionale
di Bezier.
La pipeline di transformazione mondo-visualizzazione
funziona in questo modo: viene prima creata la matrice di transformazione
per la visualizzazzione sull'area che fa questa richiesta: di solito un
prodotto di 2 matrici,una per la transformazione dei vertici in base alla
prospettiva ed una per il ridimensionamento all'interno della finestra
di visualizzazzione,successivamente per ogni oggetto viene creata una matrice
che serve a posizionare correttamente il corpo nello spazio secondo i suoi
valori rotazione scalatura e traslatura,attraverso il prodotto di queste
tre matrici in questo ordine, scalatura, rotazione e traslazione.
La martice ottenuta viene infine moltiplicata
per la matrice propria della finestra di visualizzazione calcolata precedentemente
ed applicata ad ogni vertice del corpo.Ogni punto viene reso omogeneo prima
di essere effetivamente disegnato.
La matrice di rotazione viene composta in
questo modo: si calcola prima la matrice di rotazione attorno all'asse
x,se questo valore e diverso da 0,poi quella attorno ad y,poi quella attorno
a z,ed infine moltiplicate nel ordine di creazione.
Quindi riassumendo l'algoritmo utilizzato
e questo:
>Costruisci la matrice per la visualizzazione
>>per ogni corpo
>>costruisci la matrice di trasformazione
propria dell'oggetto
>>moltiplica la matrice ottenuta con la matrice
di visualizzazione
>>per ogni punto dell'oggetto
>>>moltiplica il punto per la matrice ottenuta
nel ultimo prodotto matriciale
>>>rendi omogeneo il punto ottenuto e assegnalo
al punto da visualizzare
>>end
>end
Le superficii di Bezier vengono costruite
in fase di visualizzazione basandosi sul poliedro di controllo trasformato
in base al procedimento sopra esposto.
Per la parte delle collisioni vieni invece
usato un altro motore implementato nella classe CollisionEngine e mette
a disposizione 3 metodi per il confronto dei corpi:by Sphere,by bounding
box, by analisys.Questi metodi vengono chiamati su ogni coppia di oggetti
presenti nella scena.
Il primo metodo semplicemente controlla che
sfere,una per ogni corpo centrata nel baricento del corpo e aventei come
raggio la massima distanza tra il baricentro e vertici del corpo,abbiano
o meno intersezioni a 2 a 2.Una volta controllata la possibile intersezione
di 2 sfere si procede, in caso che il test abbia dato esito positivo, a
costruire il corpo per rendere a video la zona d'intersezione come unione
di due calotte.
Il secondo metodo costruisce parallelogrammi
attorno ai vari corpi e calcola l'intersezione tra questi, costruendo anche
in questo caso l'opportuna intersezione.
L'ultimo metodo non e stato completamento
sviluppato, ed non è completamente corretto. Il metodo esegue prima un
confornto basato sulle sfere,in caso di test positivo costruisce per entrambi
i corpi il loro involucro convesso tramite l'algoritmo quickhull,una volta
costruito controlla che esistano vertici dell'involucro che siano interni
all'altro, se non esistono non riporta nessuna intersezione,nel caso invece
ce ne siano,inzia a costruire due insiemi di punti per ogni involucro,un
insieme di vertici interni e un insieme di vertici esterni con un vicino
interno rispettivamente al secondo involucro,e cerca le intersezioni tra
piani del primo involucro e segmenti generati da vertici interni ed esternidel
secondo e viceversa.Una volta trovati i punti costruisce il corpo convesso
di questi.
Purtroppo questo metodo ha 2 problemi: uno
di approssimazioni numerica in qualche caso di vicinanza allo zero,e un
secondo problema proprio concettuale:se un corpo non ha nessun vertice
all'interno dell'altro la costruzione è incompleta in quanto manca l'apporto
del secondo corpo,inoltre il fatto che non abbia vertici inclusi nella
possibile intersezione non vuole dire che questa non esista:potrebbero
intersecarsi solo le superficii delle faccie.
Purtoppo per mancanza di tempo, non ho potuto
completare questo punto in modo adeguato.
TOP HOME
________________
La prima schermata che si presenta e riportata
qua sotto:
E' possibile suddividere la finestra iniziale
in 4 zone logiche:
Menu
la zona dei menu mette
a disposizione la lista di comandi di creazioni di oggetti in modo parametrico,la
lista per la modifica delle propietà di un singolo oggetto come la sua
rotazione, la sua scalatura o il suo colore, una lista per modificare
il metodo di selezione dell'oggetto, una lista di opzioni generali.
Area di visualizzazione
la zona di visualizzazione e divisa in
4 finestre che,partendo dall'alto a sinistra sono vista in pianta,vista
prospettica,vista laterare,vista frontale. Nella vista prospettica le azioni
possibili sono quelle di selezione tramite click, sia dell'oggetto sia
di un suo vertice/peso, e quelle di modifica della telecamera per quanto
riguarda zoom (drag del mouse con shift premuto) e rotazione attorno all'origine
mondo(drag del mouse con alt premuto).
Nelle restanti tre finestre,oltre alla
modifica dello zoom(sempre col drag del mouse con shift premuto) ed alla
selezione,si può modificare anche le propietà dell'oggetto selezionato
tramite il drag del mouse e a seconda del tool scelto(rotazione translazione
o scalatura) nella parte dei tools(vedere seguito).
Area dei tools
La zona dei tools si divede
maggiormente in 2 zone: la zona alta permette di selezionare il tool da
usare (traslazione,rotazione o scalatura) che modificherà il comportamento
del drag del mouse nelle zone dell'area di visualizzazione che supportano
tale possibilità (tutte tranne la prospettica).
La seconda parte invece
influeza il comportamento del click del mouse nell'area di visualizzazione
rendendo disponibili selezioni per oggetto,per vertice o per peso.
Barra di gestione
Questa zona permette di
creare oggetti che verranno piazzati nell'origine del mondo e senza possibilità
di parametrizzarli(se si desidera farlo si usi il comando corripondente
presente nel menù),di cancellare l'oggetto selezionato,o di testare le
collisioni coi metodi descritti nella sezione “descrizione geometrica”.
TOP HOME
_____________
Lo sviluppo del progetto è stato molto
pesante sia per la dimensione e difficoltà del'argomento, sia per un non
chiara fase iniziale di concept,sia per la mancanza di una serie di chiamate
grafiche usabili (java3D).
Il problema affrontato e molto complesso
per le sue richieste di real time nella grafica odierna, e questo e solo
una principio di approccio utilizzato soprattutto nei videogiochi, mentre
un altra tecnica sarà esplorata da me nella tesi basata sul computo delle
distanze tra le faccie.
Per chi approccia per la prima volta lo
sviluppo di programmi per la grafica consiglio lo sviluppo di una propria
libreria geometrica per le normali operazioni nel piano e eventualmente
nello spazio,la scrittura a livello semantico (interfaccie delle classi
e prototipi) dei vari moduli che opereranno nella versione finale dell'applicativo.In
alcuni casi possono sorgere problemi di underflow per calcoli vicini allo
zero la cui propagazione può essere molto nociva.
TOP HOME
_____________
G.Farin: “Curves and Surfaces for Computer
Aided Design, A Pratical Guide 2nd Edition” ed. Academic Press,1990.
M. A. Penna-R. R. Patterson: "Projective
Geometry and its applications to Computational Geometry" ed. Prentice Hall,
C. Bradford Barber, David P. Dobkin, Hannu Huhdanpaa:”The Quickhull Algorithm
for Convex Hulls”, 1996 http://citeseer.nj.nec.com/barber96quickhull.html
TOP HOME