170 likes | 267 Views
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 )
E N D
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)
Tárgytér-módszerek: • Tárgytér: valódi távolságok és szögek (N0) • 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 jX = O + t ·(Ki j - O) = t ·Ki j ; O = (0,0,0) • a legközelebbi felület? (ciklus a laplistán végig) • Ci j = {r, g, b}, megvilágítás • C0; 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 jképpontok:i = 0,1,…,umax, j = 0,1,…,vmax xi = - a / 2 + du y j = - b / 2 + dv • for j := 0 to vmax dofor i := 0 to umax dobegin … end; • A fénysugár: X = t · Ki j ; t > 1
A ciklus magja: • // minden i és j-re (azaz: minden képpontra):sugár:„ X= t · Ki j ” ; zxy := zmax; lapxy := háttérlap; // a háttér följegyzéseforeach felületelem dobegin„P(x,y,z, u,v,t):= döféspont”; // -ot keresünkif (van döféspont) thenif z < zxy thenbegin // közelebb van?zxy : = z; lapxy := lap; // a f.elem följegyzéseend; // if-ifend;// 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 · Ki ja 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 Ki 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: Fi 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 a / sin b = nk / nb; egy síkban • s1: elsődleges sugár: a néző iránya • s2v: másodlagos, visszavert sugárs2a másodlagos, áteresztett sugár; • Jöhet-e fény s2v és s2a felől • Jöhet-e fény ezek felől? • Csak véges számú visszaverést számolunk • Csak az ideális visszaverésiirányt számoljuk
for j := 0 to ymax dofor i := 0 to xmax dobegins1 := „P= t·Kij”; szin := FSK ( s1 ); putPixel(i,j, szin);end; {for i,j} ColorfunctionFSK(s1:Vector3D);var mpt: Point3D; ksz: Color;begin(mpt,felület):=aLegközelebbi(s1,felületlista);if (nincs mpt) thenFSK :=háttérSzín;elsebeginksz:=megvilágításiModell(felület,mpt); FSK:= ksz; end; {if-else: van mpt}end; {FSK function}
ColorfunctionrFSK(kpt:Point3D; s1:Vector3D; mélység:Integer);var mpt: Point3D; s2v,s2á:Vector3D; ksz,vsz,ász: Color;beginif mélység > korlát then rFSK:=Fekete;elsebegin (mpt,felület):=aLegközelebbi(s1,felületlista);if (nincs mpt) then szín:=háttérSzín;elsebeginksz:=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}