240 likes | 375 Views
Intersezioni e distanze. Daniele Marini. Definizioni utili. raggio r (t) semiretta dotata di origine e direzione (solitamente la direzione è normalizzata) superfici: implicite e esplicite implicite: f( p )=0 - es: x 2 +y 2 +z 2 -r 2 =0
E N D
Intersezioni e distanze Daniele Marini
Definizioni utili • raggio r(t) semiretta dotata di origine e direzione (solitamente la direzione è normalizzata) • superfici: implicite e esplicite • implicite: f(p)=0 - es: x2+y2+z2-r2=0 • dato il punto p si valuta se appartiene alla superficie risolvendo l’equazione (se =0) • esplicite: f(u,v)=(fx(u,v),fy(u,v),fz(u,v)) - es: f(a,b)=((r sina cosb), (r sina sinb), (r cosb))
Rette • dato un punto p =(x0,y0,z0)per cui passa la retta, la sua forma parametrica è: r(t)=p+td dove d è la direzione (vettore normalizzato) e t il parametro, per t>0 abbiamo una semiretta (tipicamente il raggio) • le componenti:
Bounding volume • si definiscono tre tipi di bounding volumes: AABB, OBB, k-DOP • AABB axis aligned bounding box, un parallelepipedo con le facce parallele ai piani coordinati, si definisce con due valori estremi amin,, amax amin amax
OBB oriented bounding box è un AABB ruotato rispetto agli assi principali, si può definire con un centro e tre vettori normalizzati che descrivono le direzioni dei lati • k-DOP discrete oriented polytope definito da k/2 vettori normalizzati con associati due valori scalari per definire una porzione di piano; in pratica definiscono un poliedro
Bounding sfera • Si utilizza anche la sfera come volume di contenimento • lo studio delle intersezioni con i BV è essenziale per l’efficienza
Intersecare rette • usato in ray tracing / ray casting • usato per calcolare collisioni • il raggio è una semiretta, con direzione data, e un punto di applicazione • la retta è specificata con coseni direttori e un punto da cui passa
la distanza di un punto q dalla retta r si ottiene proiettando q su r e valutando la norma: q-p q d (q-p)-w p w r
Intersezione con segmenti • segmento per due punti (vettore): • il calcolo della intersezione di un raggio con tutti gli oggetti di una scena può essere molto costoso, si riduce sfruttando boundig volumes • caso più semplice di BV è la sfera
Intersezione con una sfera • raggio in forma parametrica (vettore): • sfera con centro in (l,m,n) e raggio r:
(x2,y2,z2) t>1 • sostituendo nell’equazione della circonferenza x,y,z (vediamo solo x): (x1,y1,z1) 0<t<1 t<0
la forma quadratica generale è quindi: • da risolvere come equazione di II grado; se il determinate è <0 non ci sono intersezioni, se =0 il vettore è tangente, se >0 due intersezioni, e le radici t1,t2 danno il punto di entrata e di uscita del raggio • i,j,k sono le differenze (x2-x1) ecc. non sono coseni direttori !
si ricava anche la normale alla sfera nel punto di intersezione (tangenza):
per accelerare il calcolo si valuta prima il test di rifiuto rejection test • le intersezioni “dietro” non interessano • si valuta il vettore origine_raggio-centro_sfera, se ne calcola il modulo l2, se < r2 l’origine è interna alla sfera • il raggio interseca certamente, se ci interessa solo questo si termina (es: picking) altrimenti si procede) • si calcola la proiezione del vettore sul raggio, se <0 e se l’origine è esterna allora la sfera è dietro al raggio e si termina • altrimenti si calcola la distanza al quadrato dal centro sfera alla proiezione del vettore sul raggio m2 se > r2il raggio non colpisce la sfera altrimenti si calcola l’intersezione
Intersezione raggio triangolo (poligono) • 3 passi: • determinare il piano su cui giace il triangolo • determinare l’intersezione piano-raggio • valutare se e’ interna al triangolo (poligono) • usata anche per clipping, i raggi in questo caso sono i bordi del poligono e il piano è uno dei piani del frustum di visione; trovate tutte le intersezioni si genera un nuovo poligono
Determinare il piano • equazione del piano: Ax+By+Cz+D=0 • A,B,C sono le componenti della normale al piano • il prodotto vettore tra due vettori identifica la normale • dati due lati V, W del triangolo calcoliamo la normale: • dove i,j,k sono i versori, quindi A,B,C sono: • D si ottiene sostituendo un vertice del poligono nell’equazione (un punto che giace nel piano)
Intersezione raggio / piano • si sostituisce x,y,z dalla equazione parametrica del raggio: • se t<0 il raggio è nel semispazio che non contiene il poligono • se il denominatore = 0 raggio e piano sono paralleli; per verificare se il raggio è nel semispazio che non contiene il poligono basta testare il segno del numeratore: se > 0 è esterno
Casi negativi • raggio esterno al semispazio che contiene il poligono: t<0 • raggio parallelo al piano del poligono: denominatore = 0 • nel semispazio esterno al poligono: numeratore >0 raggio esterno esterno interno interno
Test di appartenenza del punto • nei casi “positivi” si verifica se l’intersezione col piano cade nel poligono (triangolo) • metodo diretto: se interno la somma degli angoli dal punto ai vertici è 360°
il metodo diretto è costoso, se il punto è su un bordo dà errore, non si può valutare se il poligono è orientato “back face” rispetto alla direzione del raggio (può interessare solo la prima intersezione con un poliedro) • algoritmo di Haines: (inizializza tnear come minimo valore negativo e tfar come massimo positivo) if piano-è-back-face and (t<tfar) then tfar=t if (piano-è-front-face) and (t>tnear) then tnear=t if (tnear>tfar) then exit (raggio non interseca)
Intersezione con OBB • si considerano a turno coppie di piani paralleli determinando tneare tfar • si conserva nel confronto tnear maggiore e tfar minore • se il massimo tnear è maggiore del minimo tfar non c’è intersezione
tnear tfar tnear tfar tnear tnear tfar tfar