Výpočet průsečíků paprsku se scénou 1996-2018 Josef Pelikán CGG MFF UK Praha pepca@cgg.mff.cuni.cz http://cgg.mff.cuni.cz/~pepca/ Intersection 2018 Josef Pelikán, http://cgg.mff.cuni.cz/~pepca 1 / 26
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 Intersection 2018 Josef Pelikán, http://cgg.mff.cuni.cz/~pepca 2 / 26
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* Intersection 2018 Josef Pelikán, http://cgg.mff.cuni.cz/~pepca 3 / 26
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 Intersection 2018 Josef Pelikán, http://cgg.mff.cuni.cz/~pepca 4 / 26
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 Intersection 2018 Josef Pelikán, http://cgg.mff.cuni.cz/~pepca 5 / 26
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 Intersection 2018 Josef Pelikán, http://cgg.mff.cuni.cz/~pepca 6 / 26
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/ Intersection 2018 Josef Pelikán, http://cgg.mff.cuni.cz/~pepca 7 / 26
Rovnoběžné roviny paprsek: p P(t) = P 0 + t p P 1 0 1 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/ Intersection 2018 Josef Pelikán, http://cgg.mff.cuni.cz/~pepca 8 / 26
Konvexní mnohostěn chápu jej jako průnik K poloprostorů počítá se maximálně K průsečíků paprsku s rovinou rovnoběžnost některých rovin (úspora) - např. kvádr proměnné t in, t out inicializované na 0, průsečík paprsku s 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 tout t in Intersection 2018 Josef Pelikán, http://cgg.mff.cuni.cz/~pepca 9 / 26
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 Intersection 2018 Josef Pelikán, http://cgg.mff.cuni.cz/~pepca 10 / 26
Algebraická plocha paprsek: P(t) = P 0 + t p 1 algebraická plocha stupně d: i jk d i, j, k 0 A x, y, z a x y z 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 Intersection 2018 Josef Pelikán, http://cgg.mff.cuni.cz/~pepca 11 / 26
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 Intersection 2018 Josef Pelikán, http://cgg.mff.cuni.cz/~pepca 12 / 26
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 Intersection 2018 Josef Pelikán, http://cgg.mff.cuni.cz/~pepca 13 / 26
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 D2 = 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 Intersection 2018 Josef Pelikán, http://cgg.mff.cuni.cz/~pepca 14 / 26
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 v P N E vstup: N, P, E výstup: [u,v] z [0,1] 2 u arccos N E sin arccos N P, 2 v, P E N 0 u, jinak u 1 Intersection 2018 Josef Pelikán, http://cgg.mff.cuni.cz/~pepca 15 / 26
Válec a kužel 2 jednotkový válec a kužel v základní poloze: x 2 2 y 1 0 x y z po dosazení P(t) do rovnice válce vychází: 2 2 2 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 0 x y z 0 2 0 2 0 2 0 Intersection 2018 Josef Pelikán, http://cgg.mff.cuni.cz/~pepca 16 / 26
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 4a 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 Intersection 2018 Josef Pelikán, http://cgg.mff.cuni.cz/~pepca 17 / 26
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 Intersection 2018 Josef Pelikán, http://cgg.mff.cuni.cz/~pepca 18 / 26
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ň Intersection 2018 Josef Pelikán, http://cgg.mff.cuni.cz/~pepca 19 / 26
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) = (PA) - (PB) obecný průnik paprsku se scénou je množina intervalů geometrické transformace: na paprsek aplikuji inverzní transformace Intersection 2018 Josef Pelikán, http://cgg.mff.cuni.cz/~pepca 20 / 26
Průsečíky PA, PB B PB P 0 p 1 A PA P 0 p 1 Intersection 2018 Josef Pelikán, http://cgg.mff.cuni.cz/~pepca 21 / 26
Průsečík P(A-B) rozdíl B P(A-B) A B P 0 p 1 A Intersection 2018 Josef Pelikán, http://cgg.mff.cuni.cz/~pepca 22 / 26
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ů! Intersection 2018 Josef Pelikán, http://cgg.mff.cuni.cz/~pepca 23 / 26
Množinové operace na paprsku A B AB AB AB Intersection 2018 Josef Pelikán, http://cgg.mff.cuni.cz/~pepca 24 / 26
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 alternativa matice pro normály: M n = (M -1 ) T Intersection 2018 Josef Pelikán, http://cgg.mff.cuni.cz/~pepca 25 / 26
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 Intersection 2018 Josef Pelikán, http://cgg.mff.cuni.cz/~pepca 26 / 26