Végül is akkor, hogyan alkotunk képet a képszintézis során? A kérdés, jogos. A válasz elméletben nagyon egyszerű. Van ugye nekünk egy modellterünk (benne a világ koordinátarendszer), mibe a képszintézis során egy általános helyzetű téglalapot helyezhetünk el. Ezután mögéje egy szemet vagy kamerát állítunk fel, és a világnak a szemből az ablakon keresztül látható részéről készítünk képet. Amit végül a képernyő nézetében jelenítünk meg.
Ehhez valahogy meg kell valósítani azokat a felületeket, amelyekről a fény a képre juthat. Erre az eszköz a térgeometria, ami során a tárgyakat geometriai objektumokkal fogjuk ábrázolni. A képszintézis során a program által kezelt alapobjektumok általában a geometria primitívek, mint például a poligon, gömb, fényforrás, stb. Manapság az elterjedt módszerek minden tárgyat háromszögekre (poligonokra) bontanak fel, mivel ez az a síkidom, ami szükségszerűen mindig konvex, vagyis alkotópontjai mindig egy síkban vannak. Ellenkező esetben ugyanis hibák és torzulások keletkezhetnek a képen. A háromszögünk meghatározásához kell három pont és az azokat összekötő élek, valamint egy normálvektor, ami a felületre merőleges, és megmutatja, hogy az objektum melyik irányból látható (lásd később). Erről egyelőre csak annyit, hogy gyorsasági okokból a 3D-s programok a tárgyakat mind üregesnek tekintik, és a felületüknek mindig csak az egyik, látható oldalát számítják. Még azt is elmondhatjuk, hogy kellő mennyiségű polinomból bármilyen görbe felület utánozható annyira, hogy a különbségek teljesen elvesznek. Gondoljunk csak bele, hogy egy 32 szöget milyen közelről kell megnéznünk, hogy ne kört lássunk belőle. Láthatjuk, hogy az emberi szem korlátait itt a magunk hasznára fordítottuk. Ezek a felületek, objektumok, amikről a fény a képre juthat, az általunk létrehozott virtuális világunkban foglalnak helyet. Ezért a képszintézis első lépése a virtuális világmodellnek a képszintézis program számára történő lefordítása. A világ-koordinátarendszerben rendelkezésre álló primitívek alapján, a képernyőn, azaz egy másik koordinátarendszerben kell képet készíteni. A koordinátarendszer váltáshoz szükségünk lesz a geometriai transzformációkra. 3D grafikában ez a transzformáció vetítést is tartalmaz, hiszen a modell 3 dimenziós, míg a kép mindig 2. Ezek után röviden átvesszük a képszintézis főbb részeit, természetesen később bővebben is tárgyaljuk azokat.
A távlat fogalma egyszerű: képzeld el, hogy a nézőpont nincs a képernyő felszínén, hanem bizonyos távolsággal mögötte helyezkedik el. Aztán konvertáld azt egy nézőpont-középpontú relatív koordinátarendszerré a következőképpen: a z koordináta a képernyő belseje felé nő. Most oszd el a koordinátáidat z-vel. Ennyi az egész. Persze nem kell az irányokat x, y és z-nek nevezned, ez a helyzethez illő leírástól függ. És persze el kell döntened, mi történjen a "képernyőből kifelé tartó irányú" dolgokkal - de ez már egy másik kérdés. Illetve még azt is el kell döntened, hány egységnyivel van a nézőpont a képernyő mögött (ezt kell hozzáadnod z-hez az osztás előtt). Sőt, ha talán még léptékezni is akarsz bizonyos dolgokat, hogy jobban nézzen ki az egész. Egyik sem túl nehezen megoldható. Ami viszont bosszantó, hogy nem akarsz osztást végezni minden a képernyőre rajzolandó pixelre. Ez például azt jelenti, hogy találkozhatsz olyan vonallal, amelynek mindkét vége a képernyőn kívül van, de bizonyos része látható. Ez viszont már az ütközések vizsgálatának problémája. Vagy még inkább a vágásé, ez csak egy előretekintés az arról szóló fejezetre. A háromdimenziós objektumok kétdimenziós képernyőre való rajzolása is fontos eleme a képszintézisnek. Sokféle módszer létezik ennek megoldására. Néhány megközelítés a látónégyszöget képezi le a helyszínre, minden pixelen keresztül sugarakat lövellve, majd a sugár által eltalált objektum szerinti színt kiválasztva. Más megközelítések a helyszínt képezik le a látónégyszögre, minden objektumot arra rárajzolva, és figyelembe véve melyik objektum melyik előtt helyezkedik el. A fenti leképezés tehát egyfajta levetítés, melyek közül a két legnépszerűbb a perspektív- és a paralell-projekció. A paralell-projekció elvégzéséhez például, csak el kell hagynod a z koordinátát és az objektumokat a látónégyszögre, kell vágnod. A perspektíva-projekció általános megközelítése szerint minden x és y értéket el kell osztanod z-vel, vagy annak valamilyen többszörösével. A képszintézis a modell azon részét fényképezi, amely a 2D ablakon belül, vagy a 3D ablak és a szem által definiált végtelen piramison belül van. Az ezeken kívül eső objektumokat, objektumrészleteket valamikor ki kell válogatni, és el kell hagyni. Ezt a folyamatot nevezzük vágásnak (clipping). A transzformációk több objektumot is vetíthetnek ugyanarra a képpontra. Ilyenkor el kell dönteni, hogy melyiket jelenítse meg, vagyis melyik takarja a többi objektumot. Ezt a lépést röviden takarásnak nevezzük. 3D grafikában nyilvánvalóan a szemhez közelebbi objektumot kell választani. Ha sikerült eldöntenünk, hogy egy képpontban melyik objektum látszik, akkor a képpontot ennek megfelelően ki kell színezni.
Először is, a tárgyaknak bizonyos felületi tulajdonságait kell meghatároznunk, például, hogy hogyan és mennyire veri vissza, illetve ereszti át a fényt, milyen színű és hasonlok. Ezek alapján lehet valamilyen módszerrel megállapítani, hogy milyen színű fény jut róla a kameránkba. Ugyanis a 3D grafikában a látható szín a térben fennálló fényviszonyoknak a függvénye, bár lehet egy szín is. Árnyalás a kép egyes pontjain keresztül a szembe jutó fény intenzitását határozza meg a hullámhossz függvényében. A hullámhosszfüggő intenzitás-eloszlás spektrumnak nevezzük. Ezen spektrum által keltett színérzetet kell a megjelenítőeszköz lehetőségeinek függvényében a lehető legpontosabban visszaadni, a spektrumot kell leképezni az eszköz által megjeleníthető hullámhosszokra és intenzitásokra (tone-mapping). Ezt az eljárást árnyalásnak nevezzük. Az árnyékoló algoritmusokra azért van elsősorban szükségünk, hogy egy tárgyat élethűen meg tudjunk jeleníteni. Ugyanis annál élethűbb egy tárgy minél több sokszögre tudjuk felbontani, ami viszont kezelhetetlen adatmennyiség. Itt jön be a csalás a dolgokba, az egyes poligonok felületet nem homogén színűnek ábrázoljuk, hanem egy árnyékoló algoritmussal módosítjuk. Így sokkal realisztikusabb képet kapunk. Azt próbáljuk kifejezni, hogy a természetben látható megvilágított felületek a fényforrástól, a felület térbeli helyzetétől, az anyag minőségétől, valamint a szemlélő helyzetétől függően különböző fényességűnek látszanak. Az árnyalt képet előállító algoritmusok, az előbb említett követelményeknek próbálnak eleget tenni. Természetesen minél élethűbb egy kép, annál hosszabb a kiszámításra fordított idő is.
A legtökéletesebb algoritmus a radiositys eljárás, ami teljesen valós fényszimuláción alapul. Hátrány az, hogy elméletileg végtelen számú visszaverődést kell kiszámítania. Ezek száma ugyan csökkenthető az élethűség rovására, de meg így is nagyon nagy a számításigénye. Sokszor nem is szükséges a grafikában, nagy erőforrásokat igénylő megjelenítést alkalmazni, például az oktatásban geometriai modellek bemutatására más algoritmus is kielégítő képet adhat. Viszont egy építész által megtervezett lakóház fotóminőségű képnek előállításra kiválóan használható, vagy gondoljuk a filmgyártásra. A ma használt legélethűbb módszer raytracing algoritmus, ami csak azokat a fénysugarakat követi végig, amelyek a kamerába jutnak (az árnyékokhoz is kellenek meg plusz fénysugarak), de ehhez fordítva kell haladnia a fény utján, a kamerából a tárgyakon át a fényforrásba elvégre máshogy nem tudható, hogy mely sugarak alkotják majd a képet. Ez az algoritmus is valós fizikai képleteket használ, de az ütközések száma itt is korlatozott egyébként két tükröződő tárgy között, a végtelenségig ugrálhatna a programunk. A raytracingnek igazából egyetlen nagy hátránya van, hogy még a mai nagyteljesítményű gépeken is időigényes a számítás. A nagy számításigény kiküszöbölésére számos alternatív eljárás született mára. Ezek közül a legegyszerűbb a Gouraud-árnyékolás (ő egy francia matematikus, aki kitalálta), ami főleg gyorsasága miatt kedvelt a játékokban. A lényege az, hogy egy egyszerű színátmenetet generál a poligon felületre, amit az átmenet irányának, valamint kezdő és végszínének gondos megválasztásával egész élethűre lehet hangolni. Ennél fejtettebb a Phong-algoritmus (vietnami matematikus). Ez mar a valós fényviszonyokat veszi figyelembe, és képes a felületi becsillanás (specular highlight) számítására is. A jelenség lényege az, hogy a fény a felület egy kis részéről nagyon erősen verődik vissza, nagyjából ott, ahol a fényforrás tükörképe lenne.
A grafikusok eszköztárak a fentieken kívül meg egy sor egyéb funkciót tartalmaznak általában. Füst, köd modellezése, a vetett árnyékok megjelenítése, a különféle, geometriai testekkel nem modellezhető tárgyak és jelenségek szimulálása, valamint a nem, vagy csak túl bonyolultan modellezhető felületi mintázatok megjelenítését szolgáló textúrázás. Számos példáját láthatjuk manapság a 3D-s játékokban is.
Felhasznált és ajánlott irodalomA távlat fogalma egyszerű: képzeld el, hogy a nézőpont nincs a képernyő felszínén, hanem bizonyos távolsággal mögötte helyezkedik el. Aztán konvertáld azt egy nézőpont-középpontú relatív koordinátarendszerré a következőképpen: a z koordináta a képernyő belseje felé nő. Most oszd el a koordinátáidat z-vel. Ennyi az egész. Persze nem kell az irányokat x, y és z-nek nevezned, ez a helyzethez illő leírástól függ. És persze el kell döntened, mi történjen a "képernyőből kifelé tartó irányú" dolgokkal - de ez már egy másik kérdés. Illetve még azt is el kell döntened, hány egységnyivel van a nézőpont a képernyő mögött (ezt kell hozzáadnod z-hez az osztás előtt). Sőt, ha talán még léptékezni is akarsz bizonyos dolgokat, hogy jobban nézzen ki az egész. Egyik sem túl nehezen megoldható. Ami viszont bosszantó, hogy nem akarsz osztást végezni minden a képernyőre rajzolandó pixelre. Ez például azt jelenti, hogy találkozhatsz olyan vonallal, amelynek mindkét vége a képernyőn kívül van, de bizonyos része látható. Ez viszont már az ütközések vizsgálatának problémája. Vagy még inkább a vágásé, ez csak egy előretekintés az arról szóló fejezetre. A háromdimenziós objektumok kétdimenziós képernyőre való rajzolása is fontos eleme a képszintézisnek. Sokféle módszer létezik ennek megoldására. Néhány megközelítés a látónégyszöget képezi le a helyszínre, minden pixelen keresztül sugarakat lövellve, majd a sugár által eltalált objektum szerinti színt kiválasztva. Más megközelítések a helyszínt képezik le a látónégyszögre, minden objektumot arra rárajzolva, és figyelembe véve melyik objektum melyik előtt helyezkedik el. A fenti leképezés tehát egyfajta levetítés, melyek közül a két legnépszerűbb a perspektív- és a paralell-projekció. A paralell-projekció elvégzéséhez például, csak el kell hagynod a z koordinátát és az objektumokat a látónégyszögre, kell vágnod. A perspektíva-projekció általános megközelítése szerint minden x és y értéket el kell osztanod z-vel, vagy annak valamilyen többszörösével. A képszintézis a modell azon részét fényképezi, amely a 2D ablakon belül, vagy a 3D ablak és a szem által definiált végtelen piramison belül van. Az ezeken kívül eső objektumokat, objektumrészleteket valamikor ki kell válogatni, és el kell hagyni. Ezt a folyamatot nevezzük vágásnak (clipping). A transzformációk több objektumot is vetíthetnek ugyanarra a képpontra. Ilyenkor el kell dönteni, hogy melyiket jelenítse meg, vagyis melyik takarja a többi objektumot. Ezt a lépést röviden takarásnak nevezzük. 3D grafikában nyilvánvalóan a szemhez közelebbi objektumot kell választani. Ha sikerült eldöntenünk, hogy egy képpontban melyik objektum látszik, akkor a képpontot ennek megfelelően ki kell színezni.
Először is, a tárgyaknak bizonyos felületi tulajdonságait kell meghatároznunk, például, hogy hogyan és mennyire veri vissza, illetve ereszti át a fényt, milyen színű és hasonlok. Ezek alapján lehet valamilyen módszerrel megállapítani, hogy milyen színű fény jut róla a kameránkba. Ugyanis a 3D grafikában a látható szín a térben fennálló fényviszonyoknak a függvénye, bár lehet egy szín is. Árnyalás a kép egyes pontjain keresztül a szembe jutó fény intenzitását határozza meg a hullámhossz függvényében. A hullámhosszfüggő intenzitás-eloszlás spektrumnak nevezzük. Ezen spektrum által keltett színérzetet kell a megjelenítőeszköz lehetőségeinek függvényében a lehető legpontosabban visszaadni, a spektrumot kell leképezni az eszköz által megjeleníthető hullámhosszokra és intenzitásokra (tone-mapping). Ezt az eljárást árnyalásnak nevezzük. Az árnyékoló algoritmusokra azért van elsősorban szükségünk, hogy egy tárgyat élethűen meg tudjunk jeleníteni. Ugyanis annál élethűbb egy tárgy minél több sokszögre tudjuk felbontani, ami viszont kezelhetetlen adatmennyiség. Itt jön be a csalás a dolgokba, az egyes poligonok felületet nem homogén színűnek ábrázoljuk, hanem egy árnyékoló algoritmussal módosítjuk. Így sokkal realisztikusabb képet kapunk. Azt próbáljuk kifejezni, hogy a természetben látható megvilágított felületek a fényforrástól, a felület térbeli helyzetétől, az anyag minőségétől, valamint a szemlélő helyzetétől függően különböző fényességűnek látszanak. Az árnyalt képet előállító algoritmusok, az előbb említett követelményeknek próbálnak eleget tenni. Természetesen minél élethűbb egy kép, annál hosszabb a kiszámításra fordított idő is.
A legtökéletesebb algoritmus a radiositys eljárás, ami teljesen valós fényszimuláción alapul. Hátrány az, hogy elméletileg végtelen számú visszaverődést kell kiszámítania. Ezek száma ugyan csökkenthető az élethűség rovására, de meg így is nagyon nagy a számításigénye. Sokszor nem is szükséges a grafikában, nagy erőforrásokat igénylő megjelenítést alkalmazni, például az oktatásban geometriai modellek bemutatására más algoritmus is kielégítő képet adhat. Viszont egy építész által megtervezett lakóház fotóminőségű képnek előállításra kiválóan használható, vagy gondoljuk a filmgyártásra. A ma használt legélethűbb módszer raytracing algoritmus, ami csak azokat a fénysugarakat követi végig, amelyek a kamerába jutnak (az árnyékokhoz is kellenek meg plusz fénysugarak), de ehhez fordítva kell haladnia a fény utján, a kamerából a tárgyakon át a fényforrásba elvégre máshogy nem tudható, hogy mely sugarak alkotják majd a képet. Ez az algoritmus is valós fizikai képleteket használ, de az ütközések száma itt is korlatozott egyébként két tükröződő tárgy között, a végtelenségig ugrálhatna a programunk. A raytracingnek igazából egyetlen nagy hátránya van, hogy még a mai nagyteljesítményű gépeken is időigényes a számítás. A nagy számításigény kiküszöbölésére számos alternatív eljárás született mára. Ezek közül a legegyszerűbb a Gouraud-árnyékolás (ő egy francia matematikus, aki kitalálta), ami főleg gyorsasága miatt kedvelt a játékokban. A lényege az, hogy egy egyszerű színátmenetet generál a poligon felületre, amit az átmenet irányának, valamint kezdő és végszínének gondos megválasztásával egész élethűre lehet hangolni. Ennél fejtettebb a Phong-algoritmus (vietnami matematikus). Ez mar a valós fényviszonyokat veszi figyelembe, és képes a felületi becsillanás (specular highlight) számítására is. A jelenség lényege az, hogy a fény a felület egy kis részéről nagyon erősen verődik vissza, nagyjából ott, ahol a fényforrás tükörképe lenne.
A grafikusok eszköztárak a fentieken kívül meg egy sor egyéb funkciót tartalmaznak általában. Füst, köd modellezése, a vetett árnyékok megjelenítése, a különféle, geometriai testekkel nem modellezhető tárgyak és jelenségek szimulálása, valamint a nem, vagy csak túl bonyolultan modellezhető felületi mintázatok megjelenítését szolgáló textúrázás. Számos példáját láthatjuk manapság a 3D-s játékokban is.
Foley, van Dam, Feiner, and Hughes: "Számítógépes grafika: Alapelvek és gyakorlat" c.
Dr. Szirmay-Kalos László: Számítógépes grafika, 2001
Füzi János: Interaktív grafika, 1997
0 megjegyzés :
Megjegyzés küldése