Láthatósági kérdések
Láthatósági algoritmusok Adott térbeli objektum és adott nézőpont esetén el kell döntenünk, hogy mi látható az adott alakzatból a nézőpontból, vagy irányából nézve. Az algoritmusok két csoportba sorolhatók: Takart élek meghatározása (hidden line elimination) Vonalas megjelenítő (tollal rajzoló plotter, vektoros display) esetén célszerű használni. Takart felületek/lapok meghatározása (hidden surface elimination) Raszteres megjelentő (raszteres grafikus display, tintasugaras, vagy lézernyomtató) esetén alkalmazzák.
Láthatósági algoritmusok A láthatóság meghatározásának alapproblémája annak eldöntése, hogy a közös vetítősugárra illeszkedő pontok közül melyik látszik, vagyis a nézőponthoz melyik van közelebb. Kép-pontosságú algoritmusok: Sok láthatósági algoritmus arra épül, hogy a kép pixelekből áll, és ennek megfelelően az objektum ábrázolása azt jelenti, hogy a képet alkotó pixel színét kell meghatározni. Objektum-pontosságú algoritmusok: Az objektum látható részét határozzák meg a modelltérben. A gyakorlatban használt algoritmusok közül a következőkkel ismerkedünk meg: - Hátsó lapok eltávolítása (Backface culling) - Fénysugárkövető algoritmus - Mélység-puffer (z-puffer) algoritmus
Hátsó lapok eltávolítása (Backface culling) Konvex poliéderek esetén tökéletesen működő eljárás. Minden laphoz meghatározzuk a kifelé mutató normálvektort. Ehhez a lapok előállításához a modellt úgy kell felépíteni, hogy a lapot alkotó csúcsok kívülről nézve óramutató járásával ellentétes sorrendben legyenek felsorolva. Ekkor a kifelé mutató normálvektor két élvektor vektoriális szorzataként áll elő: n P P P P 1 2 1 3
Hátsó lapok eltávolítása (Backface culling) A modellt alkotó lapok közül ki kell válogatnunk azokat, melyek nem a nézőpont felé néznek. Hátsó lapok esetén a kifelé mutató normálvektor nem a nézőpont felé mutat. Ezt a tulajdonságot úgy tudjuk vizsgálni, hogy a pontból a nézőpontba egy vektort vezetünk, és a vektorok szögét vizsgájuk. Hátsó lapok esetén ez a szög 90, vagy annál nagyobb, míg a nézőpont felé forduló lapok (látható lapok) esetén 90 -nál kisebb. Látható lap Hátsó lap
Hátsó lapok eltávolítása (Backface culling) Ha szögeket a későbbiekben nem használjuk fel, akkor felesleges lenne a számításokat elvégezni, ezért a két vektor belsőszorzatának előjele alapján döntünk. Ha (v,n) 0, akkor a lap hátsó lap, ide értve azt a helyzetet is, amikor éppen élben látszik. Ezekkel a lapokkal nincs teendőnk, pontosabban nem kell megrajzolnunk a körvonalukat. Ha (v,n)>0, akkor a lap a nézőpont felé fordul, azaz látható lesz, és ebben az esetben a lap körvonalát meg kell rajzolnunk.
Hátsó lapok eltávolítása (Backface culling) Átlagos esetben nagyjából a lapok fele néz hátra. Konkáv, vagy összetett alakzat esetén már nem mindig működik jól, ezért további vizsgálatokra van szükség. Nem alkalmazható a hátsó lapok szűrése akkor sem, ha a lapok nem egy zárt térrészt határolnak (felületeket, héjszerkezetet modelleznek), ugyanis előfordulhat, hogy a normálvektor alapján hátsónak választott lap hátoldala mégis látszik.
Fénysugárkövető algoritmus (ray tracing, ray casting) Kihasználjuk, hogy a kép pontokból, pixelekből épül fel. Alapötlet: Meghatározzuk az ábrázolandó objektum azon pontját, amely egy adott pixelen látszik. A nézőpontot összekötjük a kép pixeleivel, azaz sugarat bocsátunk ki a nézőpontból a pixelen át a modelltérbe. (párhuzamos vetítés esetén az adott iránnyal párhuzamost húzunk) Ezekkel az egyenesekkel el kell metszenünk az ábrázolandó objektumot, objektumokat. Meghatározzuk a nézőponthoz legközelebbi metszéspontot, majd ennek a színét (fények, tükröződések figyelembevételével), és ezt a színt a pixelhez rendeljük.
Fénysugárkövető algoritmus (ray tracing, ray casting) Bár az algoritmus alapötlete nagyon egyszerű, mégis sok számítást kíván, időigényes. Az egyes pixelek színének meghatározása független egymástól, így alkalmas párhuzamos feldolgozásra.
Mélység-puffer (z-puffer) algoritmus 1974-ben Catmull kidolgozta, azonban még 2 évtizedet kellett várni, hogy költséghatékonyan megvalósítható legyen. A z-puffer algoritmus a modelltér elemeinek formájától független, így háromszög, poliéder vagy görbült felületek láthatóságának megállapítására egyaránt alkalmas. Alkalmazhatóságának egyetlen feltétele, hogy az objektumok felületi pontjaiban a nézőponttól való z távolság és az árnyalási információk (szín, megvilágítás, textúrák) meghatározhatók legyenek. Az algoritmusnak igen jelentős erőforrásigénye van, általában más eljárásokkal kombinálva szokták alkalmazni. A koordinátarendszer a szokásostól eltérően helyezkedik el, az (x,y) sík tulajdonképpen párhuzamos a megjelenítő síkjával (függőleges) és a z tengely pedig vízszintes, és ezzel a z koordináták adják mélységi információt. Meg kell adnunk egy olyan kellően nagy z értéket, amely után a térben már nem vesszük figyelembe semmit, és a modell az (x,y) sík és a tőle z távolságra lévő sík között helyezkedik el.
Mélység-puffer (z-puffer) algoritmus Az algoritmus két tárolóterületet használ: frame-puffert, mely a képernyő pixeleihez rendelt színértékeket tárolja, induló feltöltése a háttér színe, tulajdonképpen egy n*m-es, a kép felbontásától függő méretű mátrix, melyben az eljárás végén kialakul a kép. z-puffert, mely az egyes pixelekhez rendelt mélységi információkat (z koordinátát) tartalmazza, ez is egy n*m-es mátrix. Indulóértékként a mátrixot feltöltjük azzal a kellően nagy z értékkel, amely mögötti térrészt már nem veszünk figyelembe.
Mélység-puffer (z-puffer) algoritmus A modell lapjait egyenként kell vizsgálnunk. Először meghatározzuk a vetületét az (x,y) síkon (raszterizáció), majd a lap vetületében érintett pixelekre visszaszámoljuk modell lapján a megfelelő pont z koordinátáját. A lap vetületében érintett pixeleken végighaladva: Ha z értéke kisebb, mint a korábban a z-pufferben letárolt érték (azaz a vizsgált lap megfelelő pontja közelebb van a nézőponthoz), akkor ezzel a z mélység-értékkel felülírjuk a korábban letárolt értéket a z-pufferben, és egyúttal a neki megfelelő színinformációt (lap színe + fények, tükröződések alapján kiszámolt szín), beírjuk a frame-puffer megfelelő helyére. Az eljárást alkalmazzuk a modell összes lapjára, és végül a framepufferben előáll a raszteres kép. Az alapalgoritmus szempontjából közömbös, hogy az objektumokat, illetve a raszterpontokat milyen sorrendben teszteljük.