6. A 3D grafika alapjai 6.1. A 3D szerelőszalag fölépítése 6.2. Térbeli alakzatok képe 6.3. Térbeli képelemek és modell-adatszerkezetek 6.4. Képelemek összeállítása, leképezés és vágás (6.1-6.4 jórészt a 3. fejezet megfelelő részeit idézik föl.) 6.5. Láthatóság, takarás 6.6. A fénysugár-követési módszer 6.7. Árnyalás, a képpontok színe 6.8. Irodalom 6.9. Egyebek
Tárgytér-módszerek: Tárgytér: valódi távolságok és szögek (normál-vektor!) SzKR: szem-(kamera-)KR Nézetmező: csonkagúla Közelsík (és távolsík) Mélységvágás Oldalvágás (2D)
6.6. A fénysugár-követés módszere Fénysugár-követés (ray-tracing) A tárgytérben (SZKR) Minden képpontban: az ott látható felület-elem meghatározása Az ott látott színárnyalat 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ó felületek
Az FSK eljárás váza Előtte: mélységvágás és az oldalt kívül lévők megjelölése VKR -> SzKR (tárgytér) Keret; raszter: raszter: Kij képpontok C->Kij „fénysugár”; a legközelebbi felület? Iij(r,g,b)0 Iij(r,g,b): fényvisszaverődés, árnyékok, átlátszó felületek
A kép kerete C-től d (~50 cm) távolságra a b (~30x40 cm) oldalú Kij képpontok: i = 0,1,…,xmax, j = 0,1,…,ymax xi= -a/2 + a/xmax yj= -b/2 + b/ymax for j := 0 to ymax do for i := 0 to xmax do begin … end; A fénysugár: X = C + t·(Kij - C) = t·Kij; t>0
A ciklus magja: for j := 0 to ymax do for i := 0 to xmax do begin sugár := „P= t·Kij”; zxy := zmax; lapxy:=hatter; {a háttérlap följegyzése} foreach lap do begin sik := „a lap síkja”; {P=B+u·(A-B)+v·(C-B)} „P(x,y,z,u,v,t) := döféspont”; {sík és sugár} if 0 u,v,1-u-v 0 then {a háromszögben van} if z < zxy then begin {közelebb van?} zxy:=z; lapxy:=lap; {a lap följegyzése} end;{if-if} end; {foreach lap} putPixel(i,j, „a lapxy színe a zxy pontban”); {megvilágítás!} end; {for i,j}
Megjegyzések foreach y foreach x foreach lap … Gyorsítások: a kereten kívüliek megjelölése testek dobozolása (foreach test foreach lapja) lapok rendezése legkisebb z szerint térfelosztás putPixel(i,j, „a lapxy színe a zxy pontban”); Iij(r,g,b)0 := I(lap, x,y,z) „megvilágítási modell” Ez csak Iij(r,g,b)0 ; fény-visszaverődés: később
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 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 sugár: a látás iránya s2v és s2a másodlagos sugarak; milyen fény esik be arról? Csak véges számú visszaverést számolunk Csak az ideális visszaverési irányt számoljuk
for j := 0 to ymax do for i := 0 to xmax do begin. s1 := „P= t·Kij”; for j := 0 to ymax do for i := 0 to xmax do begin s1 := „P= t·Kij”; 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); 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}