Výpočet průsečíků paprsku se scénou 1996-2008 Josef Pelikán, MFF UK Praha http://cgg.ms.mff.cuni.cz/~pepca/ Josef.Pelikan@mff.cuni.cz NPGR004, intersection.pdf 2008 Josef Pelikán, http://cgg.ms.mff.cuni.cz/~pepca 1
Průsečík paprsku s tělesem výstup 3D poloha: t, [x,y,z] (2D poloha: [u,v]) (Normála: N, N u N v ) u v [x,y,z] N v P 0 P 1 t N N u vstup Paprsek: P 0, P 1 NPGR004, intersection.pdf 2008 Josef Pelikán, http://cgg.ms.mff.cuni.cz/~pepca 2
Rovina paprsek: P(t) = P 0 + t P 1 P 0 P 1 N rovina: N = [x N,y N,z N ] x x N + y y N + z z N + D = 0 t průsečík t = (N P 0 + D) / (N P 1 ) negativní: 2±, 3*, pozitivní: 5±, 6*, 1/ výpočet [x,y,z]: 3±, 3* NPGR004, intersection.pdf 2008 Josef Pelikán, http://cgg.ms.mff.cuni.cz/~pepca 3
Inverzní transformace v rovině rovina: Pl(u,v) = Pl 0 + u U + v V U = [x U,y U,z U ], V = [x V,y V,z V ] N = U V vstup: Pl, U, V, [x,y,z] výstup: [u,v] v [x,y,z] U u N V Pl 0 soustava u x u + v x v = x - Pl 0x řešení [u,v]: 5±, 5*, 2/ u y u + v y v = y - Pl 0y NPGR004, intersection.pdf 2008 Josef Pelikán, http://cgg.ms.mff.cuni.cz/~pepca 4
Rovnoběžník paprsek: P(t) = P 0 + t P 1 P 0 rovnoběžník: R(u,v) = R 0 + u U + v V 0 u,v 1 P 1 t, [x,y,z], [u,v] U V N R 0 výpočet t, [x,y,z], [u,v], kontrola u,v pozitivní případ celkem: 13±, 14*, 3/, 4 NPGR004, intersection.pdf 2008 Josef Pelikán, http://cgg.ms.mff.cuni.cz/~pepca 5
Trojúhelník paprsek: P(t) = P 0 + t P 1 P 0 trojúhelník: R(u,v) = R 0 + u U + v V 0 u,v,u+v 1 P 1 U t, [x,y,z], [u,v] V N R 0 výpočet t, [x,y,z], [u,v], kontrola u,v pozitivní případ celkem: 14±, 14*, 3/, 3 NPGR004, intersection.pdf 2008 Josef Pelikán, http://cgg.ms.mff.cuni.cz/~pepca 6
Obecný rovinný mnohoúhelník paprsek: P(t) = P 0 + t P 1 P 0 P 1 N... V 4 rovina mnohoúhelníka: N = [x N,y N,z N ] x x N + y y N + z z N + D = 0 vrcholy mnohoúhelníka: V 1, V 2,... V M t, [x,y,z] V 2 V 8 V 1 V 3 výpočet t, [x,y,z], test v rovině: bod polygon průsečík s rovinou: 8±, 9*, 1/ NPGR004, intersection.pdf 2008 Josef Pelikán, http://cgg.ms.mff.cuni.cz/~pepca 7
Rovnoběžné roviny paprsek: P P(t) = P 0 + t P P 1 1 0 N rovnoběžné roviny: N = [x N,y N,z N ] x x N + y y N + z z N + D i = 0 t 1 t 2 průsečíky t i = (N P 0 + D i ) / (N P 1 ) první rovina: 5±, 6*, 1/, každá další: 1±, 1/ NPGR004, intersection.pdf 2008 Josef Pelikán, http://cgg.ms.mff.cuni.cz/~pepca 8
Konvexní mnohostěn chápu jej jako průnik K poloprostorů počítám maximálně K průsečíků paprsku s rovinou mohu využít rovnoběžnosti některých rovin (úspora výpočtů viz výše) - např. kvádr proměnné t in, t out inicializované na 0, průsečík paprsku s jedním poloprostorem: t, ) resp. (, t t in = max{ t in, t } resp. t out = min{ t out, t } předčasně skončím, je-li t in > t out NPGR004, intersection.pdf 2008 Josef Pelikán, http://cgg.ms.mff.cuni.cz/~pepca 9
Implicitní plocha paprsek: P(t) = P 0 + t P 1 implicitní povrch: F(x,y,z) = 0 příklad: (c - cos ax) cos z + (y + a sin ax) sin z + + cos a(x+z) = 0 po dosazení P(t) do F a úpravách: F*(t) = 0 hledám kořeny funkce F*(t) někdy stačí najít nejmenší kladný kořen (první průsečík), v CSG potřebuji naopak všechny NPGR004, intersection.pdf 2008 Josef Pelikán, http://cgg.ms.mff.cuni.cz/~pepca 10
Algebraická plocha paprsek: P(t) = P 0 + t P 1 algebraická plocha stupně d: (,, ) i + + i, j, k= j k d A x y z = a x y z = 0 ijk i j k 0 příklad (toroid s poloměry a, b): ( ) ( 2 2 2 2 2 ) 2 2 ( 2 2 4 ) Tab x, y, z = x + y + z a b a b z po dosazení P(t) do A a úpravách: A*(t) = 0 A* je polynom stupně nejvýše d NPGR004, intersection.pdf 2008 Josef Pelikán, http://cgg.ms.mff.cuni.cz/~pepca 11
Kvadrika (d=2) obecná kvadrika: T x Qx = 0 x = x y z 1, Q = a b c d b e f g c f h i d g i j po dosazení P(t) do rovnice vychází: a2t 2 + a1t + a0 = 0, 2 1 T 1 1 1 T 0 0 0 T 0 kde a = P QP, a = 2P QP, a = P QP NPGR004, intersection.pdf 2008 Josef Pelikán, http://cgg.ms.mff.cuni.cz/~pepca 12
Rotační kvadrika rotační kvadrika v základní poloze: 2 2 2 x + y + az + bz + c = 0 koule: 2 2 2 x + y + z 1 = 0, 2 po dosazení P(t) do rovnice koule vychází: ( ) ( ) ( ) t P P + 2t P P + P P 1 = 0 1 1 0 1 0 0 NPGR004, intersection.pdf 2008 Josef Pelikán, http://cgg.ms.mff.cuni.cz/~pepca 13
Koule (geometrické řešení) P(t) = P 0 + t P 1 P 1 P 0 střed tětivy t 0 = (V P 1 ) vzdálenost D 2 2 = (V V) - t 0 odchylka 2 t D = R 2 - D 2 V t 1 t 0 t 2 t D R D pro t D 2 = 0 je paprsek tečnou koule v P( t 0 ) pro t D2 > 0 existují dva průsečíky: P( t 0 ± t D ) negativní: 9±, 6*, 1<, pozitivní navíc: 2±, 1 sqrt NPGR004, intersection.pdf 2008 Josef Pelikán, http://cgg.ms.mff.cuni.cz/~pepca 14
Inverzní transformace na kouli koule: (x-x C ) 2 +(y-y C ) 2 +(z-z C ) 2 = R 2 směr k pólu: P, k rovníku: E (P E) = 0 vstup: N, P, E výstup: [u,v] z [0,1] 2 v P u N E ( ) [ ( N E) sin Φ ] arccos Φ = arccos ( N P), θ = 2π v = Φ π, P E N > 0 u = θ, jinak u = 1 θ NPGR004, intersection.pdf 2008 Josef Pelikán, http://cgg.ms.mff.cuni.cz/~pepca 15
Válec a kužel jednotkový válec a kužel v základní poloze: x 2 2 2 2 2 + y 1 = 0 x + y z = 0 2 po dosazení P(t) do rovnice válce vychází: ( ) ( ) t x + y + 2t x x + y y + x + y 1 = 0 2 1 2 1 2 0 1 0 1 0 2 0 2 po dosazení P(t) do rovnice kužele vychází: ( ) ( ) 1 2 1 2 1 2 2 0 1 0 1 0 1 t x + y z + t x x + y y z z + + x + y z = 0 2 0 2 0 2 0 NPGR004, intersection.pdf 2008 Josef Pelikán, http://cgg.ms.mff.cuni.cz/~pepca 16
Toroid z -a a x Dvě kružnice v rovině xz: b [ ( ) ] ( ) [ ] 2 2 2 2 2 2 x a + z b x + a + z b = 0 [ x 2 + z 2 ( a 2 + b 2 ) ] 2 = 4 a 2 ( b 2 z 2 ) Po substituci r 2 = x 2 + y 2 rovnice čtvrtého stupně: za x 2 vychází ( x 2 y 2 z 2 a 2 b 2 ) 2 a 2 ( b 2 z 2 ) + + 4 = 0 NPGR004, intersection.pdf 2008 Josef Pelikán, http://cgg.ms.mff.cuni.cz/~pepca 17
Rotační plocha P 0 + t P 1 z z r x y rovnice paprsku v rovině rz: 2 2 2 ( ) ( ) r = x + y = x0 + x1t + y0 + y1t z = z + z t 0 1 2 2 r NPGR004, intersection.pdf 2008 Josef Pelikán, http://cgg.ms.mff.cuni.cz/~pepca 18
Paprsek v rovině rz 2 2 Po eliminaci t: ar + bz + cz + d = 0 (1) 2 a = z 1 b = x 2 2 1 y 1 c = 2 z 1 e z 0 b 2 d = z 0 z 0 b 2 z 1 e f z 1 e = x 0 x 1 y 0 y 1 f = x 2 2 0 y 0 po dosazení parametrického vyjádření křivky K(s) do (1) dostaneme rovnici K*(s) = 0 K* má proti K dvojnásobný stupeň NPGR004, intersection.pdf 2008 Josef Pelikán, http://cgg.ms.mff.cuni.cz/~pepca 19
CSG reprezentace pro elementární tělesa umím průsečíky spočítat začátek a konec průniku paprsku s tělesem pro konvexní tělesa množinové operace provádím na polopřímce paprsku: distributivita: P (A-B) = (P A) - (P B) obecný průnik paprsku se scénou je množina intervalů geometrické transformace: na paprsek aplikuji inverzní transformace NPGR004, intersection.pdf 2008 Josef Pelikán, http://cgg.ms.mff.cuni.cz/~pepca 20
Průsečíky P A,P B: B P B P 0 P 1 A P A P 0 P 1 NPGR004, intersection.pdf 2008 Josef Pelikán, http://cgg.ms.mff.cuni.cz/~pepca 21
Průsečík P (A-B): rozdíl B P (A-B) A B P 0 P 1 A NPGR004, intersection.pdf 2008 Josef Pelikán, http://cgg.ms.mff.cuni.cz/~pepca 22
Implementace paprsek: počáteční bod P 0 a směrový vektor P 1 transformuje se inverzními maticemi T i -1 (nemusí být vždy výhodné... 1 transformace: 15+, 18*) průnik paprsku se scénou (částí scény): uspořádaný seznam hodnot parametru t: [t 1, t 2, t 3,..] množinové operace: zobecněné slévání vstupních seznamů t i zpětná transformace normálových vektorů! NPGR004, intersection.pdf 2008 Josef Pelikán, http://cgg.ms.mff.cuni.cz/~pepca 23
Množinové operace na paprsku A B A B A B A B NPGR004, intersection.pdf 2008 Josef Pelikán, http://cgg.ms.mff.cuni.cz/~pepca 24
Zpětná transformace normál N N N v N N u N = N u N v vektory transformujeme pouze submaticí 3 3! obecné afinní zobrazení nezachovává úhly (kolmost normálového vektoru na plochu) místo normály přenášíme dva povrchové vektory NPGR004, intersection.pdf 2008 Josef Pelikán, http://cgg.ms.mff.cuni.cz/~pepca 25
Konec Další informace: A. Glassner: An Introduction to Ray Tracing, Academic Press, London 1989, 35-119 J. Foley, A. van Dam, S. Feiner, J. Hughes: Computer Graphics, Principles and Practice, 712-714 NPGR004, intersection.pdf 2008 Josef Pelikán, http://cgg.ms.mff.cuni.cz/~pepca 26