Ray tracing alapok Flag'98 Coder-l előadás TomCat/Abaddon[tomcat@szif.hu]
Ez a dokumentum azt célt szeretné szolgálni, hogy a kedves coderek
ismerkedjenek meg a ray tracing alapjaival és így a jővőben minél több
olyan magyar demo vagy intro készüljön, ami ezt a technikát is használja.
A doksi a köv. részekből áll:
A fotorealisztikus ábrázolás jelentőségét két részre bonthatjuk, egyrészt a valóság nagyon pontos mását készíthetjük el vele, másrészt pedig a fantáziánkat elengedve, olyan képeket alkothatunk, melyeken a megjelenő elképzelt világ a nézőben hihető valóság érzetét kelti. S minél pontosabban modellezzük a fény és a látás fizikai tulajdonságait, a kapott kép annál valósághűbb lesz, de a modell számítási igénye is ezzel párhuzamosan nő.
Figyeljétek meg a képen a modell jellegzetes jegyeit: az objektumok egymásra vetett árnyékait, a többszörös tükröződéseket, a fény csillanásait !
Az egyszerű objektumokból bonyolultabbakat is összeállíthatunk, például ez a csiga több ezer gömbből áll.
A ray tracing lényege röviden a következő: egy háromdimenziós koordinátarendszerben matematikai függvényekkel leírt környezetből fotoszerű képet számolunk ki a fénytan törvényeinek segítségével. Ehhez a fény útját kell nyomonkövetni, vagyis, hogy a fényforrás által kibocsátott fotonok milyen úton jutnak a szemünkbe, közben milyen tárgyaknak ütköznek, azok pedig a fény mely részét nyelik el, eresztik át vagy tükrözik vissza. Az ábrán a szemünkbe érkező fény útja figyelhető meg. Megjegyzés: ez a modell a fény hullámtulajdonságát elhanyagolja.
De mivel a fényforrás legtöbb fotonja nem jut a szemünkbe, ezért sokkal gyorsabb visszafelé végigjárni a fény útját, s megnézni azt, hogy az az irány, amelyben nézünk az eltalál-e fényforrást.
Mi végeredményként egy digitális képet szeretnénk, ezért konkrétizálva a feladat az, hogy mind enegyes képpontban találjuk meg az oda beérkező fények színét.
Nézzük mi is kell ahhoz, hogy a szemtől elindítsunk egy sugarat:
Ezek alapján egy duplaciklussal minden képponthoz indíthatunk egy-egy sugarat E-ből S irányába. A ciklusváltozó Px és Py lesz, melyek értéke -1-től 1-ig nő x' és y' léptékkel. Bővebben lásd az ábrát, ahol:
S = M + Px * H + Py * V x' = 2 / x0 y' = 2 / y0 H = ( d * tan( théta ) ) * X V = ( d * tan( fí ) ) * Y X = G × U Y = X × G G = M - E d = | G |
A ray tracing legidőigényesebb feladata a metszéspont keresés. A sugarat az egyenes egyenletével írjuk fel: X = P + D * t. Pontosabban csak egy fél egyenesnek értelmezzük, mert a nézőpont mögötti tér nem érdekes. Tehát a t csak pozitív értéket kaphat.
Példaként nézzük a gömb egyenletét: ( X - C ) * ( X - C ) = r * r.
A metszéspont mindkét egyenletet kielégíti, ezért X helyére beírjuk
a sugár egyenletét. Így egy másodfokú egyenletet kapunk,
ahol a = D ˇ D, b = 2 * D ˇ V, c = V ˇ V - r * r és V = P - C.
A megoldóképlet diszkriminásának negatív, nulla és pozitív értékeihez tartozó
fizikai jelentéseket az ábra mutatja.
Nos igen, ez az eljárás egyertelműen gyorsított a metszéspont kereséseken.
De most vessünk ismét egy pillantást az ábrára. Mi lenne, ha az ábrán
látható négyzet egy befoglaló téglatest vetülete lenne. Akkor az valószinűleg
megint gyorsítana a metszéspont keresésen, hiszen például ha a szemsugár nem
találna el tárgyat, akkor a hat befoglaló gömb helyett csak egy befoglaló
téglatestre kéne elvégezni a metszéspont vizsgálatot. Tehát a fejlesztés útja
a hierarchikus befoglaló tárgyak használata lesz.
A kédés csak az, hogy milyen struktúra lenne a legmegfelelőbb ?
Ezen az ábrán kb. 8000 gömb van, ezek hierarchiája jól látható, de ezt a hierarchikus csoportosítást a géppel automatikusan elvégeztetni nem egyszerű feladat.
Végül vizsgáljuk meg egy jelenet matematikai leírását:
b 0.1 0.1 0.1 v from 0 -3 0 at 0 0 0 up 0 0 1 angle 80 hither .001 resolution 512 512 l 2 -3 7 .9 .9 .9 f 1 1 1 .9 .667 1000 0 1 s 0 0 0 1 f 1 .5 .5 .9 .667 1000 0 1 s 1.2 -.5 1 .6 f 1 .5 1 .9 .667 1000 0 1 s -.5 -1 -.9 .4 f 1 1 .5 .9 .667 1000 0 1 s -.8 -1 .6 .7 f .5 1 1 .9 .667 1000 0 1 s 0 -6 0 2 f .5 1 .5 .9 .667 1000 0 1 s .3 -.7 0 .1 f .5 .5 1 .9 .667 1000 0 1 s 3 -3 -3 4Ez a hét gömb kiszámolva így néz ki: