4.6. A Fénysugár-követés módszere (ray-tracing) Mi látható a képernyőn, egy-egy képpontban ? (4.4.LÁTHATÓSÁG) A képponton át a szembe jutó fénysugár melyik tárgyról jön ? És az ott milyen színű ? (4.7. ÁRNYALÁS)
2
Tárgytér-módszerek: Tárgytér: valódi távolságok és szögek (N 0 ) SzKR: szem-(kamera-)KR Nézetmező: csonkagúla Közelsík (és távolsík) Mélységvágás (k,t) Oldalvágás (2D)
A fénysugár-követés módszere Fénysugár-követés (ray-tracing) A tárgytérben (SZKR) minden K i j képpontban: ott mi látszik? (melyik felület-elem?) és ott milyen színárnyalat látszik? kiszámítása „megvilágítási módszerrel” „Valószerű képek” (realistic images) egyik módszere fényforrások, árnyékok, fény-visszaverődés, átlátszó testek
Az FSK eljárás váza Előtte: VKR SzKR (tárgytér), vágás (jelöléssel) Keret kijelölése; raszter: K i j képpontok „fénysugarak:” C K i j X = O + t · (K i j - O) = t · K i j ; O = (0,0,0) a legközelebbi felület? (ciklus a laplistán végig) C i j = {r, g, b}, megvilágítás C 0 ; C i : visszaverődés, árnyékok, átlátszó felületek
A kép kerete A szemtől (O) d (~ 50 cm) távolságra a b (~30 40 cm) oldalú K i j képpontok: i = 0,1,…,umax, j = 0,1,…,vmax x i = - a / 2 + du y j = - b / 2 + dv for j := 0 to vmax do for i := 0 to umax do begin … end; A fénysugár: X = t · K i j ; t > 1
A ciklus magja: // minden i és j-re (azaz: minden képpontra): sugár : „ X = t · K i j ” ; zxy := zmax; lapxy := háttérlap; // a háttér följegyzése foreach felületelem do begin „P(x,y,z, u,v,t) := döféspont”; // -ot keresünk if (van döféspont) then if z < zxy then begin // közelebb van? zxy : = z; lapxy := lap; // a f.elem följegyzése end; // if-if end; // foreach lap putPixel(i,j, „a lapxy színe a zxy pontban”); // árnyalás
A metszéspontok kisszámítása Időben kritikus: minden képpontnál - minden lapra Felület-elem: háromszög, gömb, másodrendű paraméteres felület, stb. Sugár és háromszög metszéspontja: a sugár: X = t · K i j a háromszög: X = Q + u · (P - Q) + v · (R - Q) metszéspont a PQR síkkal: { u, v, t } if ( 0 u, v, u + v 1 ) then // a háromszögön belül Időben kritikus gyorsítás kell
Gyorsítások foreach y foreach x foreach lap … „vágás”: a kereten kívüliek megjelölése Testek-lapok dobozolása lapok rendezése legkisebb z szerint Szabályos (reguláris) térháló Nyolcasfa BSP-fa
Megjegyzések Láthatóság: (i,j) a K i j -ben látható háromszög, (x, y, z) putPixel(i,j, „a lapxy színe a zxy pontban”); // árnyalás az árnyalási modell szerint: F i j (lap, x, y, z): a képpont színe első közelítés „Láthatóság”: egy FF látható-e az (x.y.z)-ből !
Rekurzív FSK „Első ütközés”: a látott pont, színe: a közvetlen megvilágításból A testek között fény-visszaverődés (és átlátszó testeken fény áthaladás) Milyen fény esik a látott pontba másokról visszaverten? (A testen áteresztve?)
Rekurzív FSK és fénytörés Az ideális visszaverődés törvénye: (LN) szög = (SN) szög; egy síkban A fénytörés törvénye: sin / sin = n k / n b ; egy síkban s 1 : elsődleges sugár: a néző iránya s 2v : másodlagos, visszavert sugár s 2a másodlagos, áteresztett sugár; Jöhet-e fény s 2v és s 2a felől Jöhet-e fény ezek felől? Csak véges számú visszaverést számolunk Csak az ideális visszaverési irányt számoljuk
Olvasmány, a rekurzív fsk egy eljárásának vázlata:
for j := 0 to ymax do for i := 0 to xmax do begin s1 := „P= t · K ij ”; szin := FSK ( s1 ); putPixel(i,j, szin); end; {for i,j} Color function FSK( s1:Vector3D ); var mpt: Point3D; ksz: Color; begin (mpt,felület) := aLegközelebbi(s1,felületlista); if (nincs mpt) then FSK := háttérSzín; else begin ksz := megvilágításiModell(felület,mpt); FSK := ksz; end; {if-else: van mpt} end; {FSK function}
Color function rFSK(kpt:Point3D; s1:Vector3D; mélység:Integer); var mpt: Point3D; s2v,s2á:Vector3D; ksz,vsz,ász: Color; begin if mélység > korlát then rFSK := Fekete; else begin (mpt,felület) := aLegközelebbi(s1,felületlista); if (nincs mpt) then szín:=háttérSzín; else begin ksz := megvilágításiModell(felület,mpt); s2v := tükrözés(s1,felület,mpt); vsz := rFSK(metszéspt,s2v,mélység+1); s2t := megtörés(s1,felület, mpt); ász := rFSK(mpt,s2t,mélység+1) rFSK{szín} := kever(ksz,ksúly, vsz,vsúly, ász,ásúly); end; {if-else: van mpt} end; {if-else: mélység<korlát} end; {rFSK function}