Ugrás a tartalomhoz

3D megjelenítési technikák

Dr. Fekete Róbert Tamás, Dr. Tamás Péter, Dr. Antal Ákos, Décsei-Paróczi Annamária (2014)

BME-MOGI

A megjelenítő cső

A megjelenítő cső

A mai képalkotó eszközök raszteres elven működnek, ezért a megjelenítéskor is raszteres eszközön működő grafikus rendszereket vizsgálunk. A (3.20. ábra - A megjelenítési cső) ábrát tanulmányozva végigkövethetjük egy 3D-s grafikus rendszer (OpenGL) képalkotási folyamatának lehetőségeit és lépéseit. Az OpenGL hardverfüggetlen programozási felületet biztosító háromdimenziós grafikus alprogram-rendszer, melyet a Silicon Graphics Inc. [3.9.] fejlesztett ki Unix alapú hálózatban működő számítógépekre. Az OpenGL megjelenítési szabvánnyá vált és API függvényhívásait használhatjuk a Windows rendszerekben is.

Az ábra bal oldalán, a belépési ponton látható, hogy lehetőségünk van arra, hogy térbeli objektumokat leíró csúcspontjaikkal (vertex) jellemezve adjunk át megjelenítésre. Közvetlenül elérhetjük a kép pontjait is, így szükség esetén magunk is definiálhatjuk a pixeleken megjeleníteni kívánt információt. Már itt érdemes megemlíteni, hogy az alapobjektumok sorozatát listába szervezhetjük (display lista), amelyet ezek után egyetlen rajzelemként kezel a rendszer.

3.20. ábra - A megjelenítési cső

A megjelenítési cső


A csúcspontokkal jellemzett térbeli elemek esetén a számító egység feladata, hogy a függvényként megadott térgörbéket és felületeket értelmezze. A vertex-szintű műveleteket végző modul számítja a megvilágítást, az előírt geometriai transzformációkat és kép méretre vágását. Az ilyen módon előkészített kép pontjainak adatait a raszterizáló határozza meg. Akár vektoros szemléletű, szabadformájú felületmodellel is van dolgunk, a megjelenítéshez a felület egyenlete alapján a raszterizáló apró háromszögekre („Felületek leírása háromszöghálókkal”) bontja a felületeket, és ezeket jeleníti meg. A képpontokat tartalmazó kép további részletpufferekben tárolt adatok segítségével kerül a képernyőmemóriába, megjelenítésre. Ilyen részletpuffert használhatunk a takarások meghatározására (Z-puffer). A színkeverő puffer segítségével áttetsző objektumokat jeleníthetünk meg, ha a színezéskor a háttérszíneket is figyelembe vesszük. A „stencilpuffert” használhatjuk, ha egy képet úgy szeretnénk megjeleníteni, ahogyan azt egy ablakon kitekintve látjuk, amikor az ablakkeretek takarják a kép egyes részeit.

Ahogy az ábrán nyomonkövethető, az OpenGL lehetővé teszi, hogy a megjelenítésre kerülő bitképes adatok közvetlenül a raszterizáló modulhoz kerüljenek. Az OpenGL textúra-megjelenítési lehetősége azt takarja, hogy a térbeli objektumokat bitképpel mintázott anyaggal is beboríthatjuk.

Ismerkedjünk meg először a képernyőn történő megjelenítés geometriai transzformációs hátterével!

A tér leképezése síkra

Térbeli pontokat két alapvető módon vetíthetünk síkba, párhuzamos és centrális vetítősugarakkal.

A párhuzamos sugarakkal való vetítést axonometriának hívjuk. A vetítés matematikai modelljét úgy állíthatjuk fel, hogy az x-y-z térbeli koordináta-rendszer párhuzamosan vetített képét berajzoljuk a ξ-η koordinátarendszerrel bíró síkbeli lapra. Feltételezzük, hogy a térbeli koordináta-rendszer origójának képe a síkbeli koordináta-rendszer origója. A (3.21. ábra - Az általános axonometria) ábrán az x-y-z térbeli koordináta-rendszer képe szaggatott vonallal látszik a folytonos vonallal rajzolt ξ-η koordinátarendszerben. Jelöljük az ábra szerint a ξ-tengely és az x-tengely által bezárt szöget α-val, a ξ-tengely és az y-tengely által bezárt szöget β-val és az η-tengely és a z-tengely által bezárt szöget γ-val! Mivel az x-y-z koordináta-tengelyek nem párhuzamosak a ξ-η síkkal, a koordináta-egységek képe a síkon rövidebbnek látszik. Az x-irányú egység qx(≤1)-nek, az y-irányú qy(≤1) és a z-irányú qz(≤1) hosszúnak látszik.

3.21. ábra - Az általános axonometria

Az általános axonometria


Ha tehát egy (x, y, z) koordinátájú pontnak keressük a (ξ,η) síkbeli koordinátáját, akkor a leképezést megvalósító függvénypár az (fξ, fη) (3.99) szerint.

 

(3.99)

A leképezést egyszerűen felírhatjuk ha arra gondolunk, hogy az origóból indulva a koordináta-tengelyek képeivel párhuzamosan, a rövidüléseknek megfelelően haladunk x, y és z egységnyit, akkor az (x,y,z) pont (ξ,η) képébe jutunk (3.21. ábra - Az általános axonometria). Ebből következik, hogy a piros nyilal ξ és az η irányú vetületeit összegezve az alábbi (3.100) módon adódnak a koordináták.

 

(3.100)

Az axonometria speciális esetei az izometrikus axonometria, amikor az x-y-z koordináta-tengelyek egymással 120°-ot zárnak be, a z-tengely képe az η-tengellyel esik egybe (α=30, β=30, γ=0) és a rövidülések qx=qy=qz=1 (3.22. ábra - Az általános axonometria)

3.22. ábra - Az általános axonometria

Az általános axonometria


Másik elterjed axonometria a Cavalier-féle, vagy katonai axonometria, ahol a vízszintes y-tengely, a ξ-tengellyel esik egybe a függőleges z-tengely, az η-tengellyel esik egybe, az x-tengely pedig a másik kettővel 135°-os szöget zár be (α=45, β=0, γ=0). A rövidülések: qx=0,5, qy=qz=1.

3.23. ábra - A katonai axonometria

A katonai axonometria


Az axonometrikus leképzés adott koordináta-irányban távolságtartó. Ezért a kocka hátsó éle ugyanolyan hosszúnak látszik mint az első él. A szemünkkel azonban nem ilyen képet kapunk. A szemünk centrálisan vetít.

Centrális vetítés egy pontba érkező sugarakkal vetíti a képsíkra a térbeli pontokat. Ahhoz, hogy a centrális vetítés egyszerű képleteit megkapjuk, tegyük fel, hogy a térbeli x-y-z koordináta-rendszer pontjait az x-y síkkal párhuzamos S képsíkra vetítjük! Jelöljük a térbeli x-y-z koordináta-rendszer kezdőpontját C-vel. C lesz a vetítés centruma. Az S síkon lévő ξ-η koordináta-rendszer kezdőpontja O, legyen olyan, hogy a térbeli rendszer z-tengelyén d távolságra van C-től! A S sík ξ-η koordináta-rendszerének tengelyei párhuzamosak az x- és y-tengelyekkel (3.24. ábra - Centrális vetítés). Keressük a centrális vetítés (3.99)-nek megfelelő leképezését.

3.24. ábra - Centrális vetítés

Centrális vetítés


Az ábrán látható módon legyen az origó centrum távolság d! Legyenek egy térbeli P pont koordinátái (x,y,z) és ennek P* képe a síkon (ξ,η) koordinátákkal. P pont vetülete az x-z síkra Pxz (ennek a z-tengelytől vett távolsága éppen az x-koordináta), az y-z síkra Pyz (ennek pedig a z-tengelytől vett távolsága éppen az y-koordináta). A Pxz képe az S síkon P*ξ, és ennek a síkbeli koordinátarendszer kezdőpontjától való távolsága éppen a ξ koordináta. A Pyz képe az S síkon P*η és ennek a síkbeli koordináta-rendszer kezdőpontjától való távolsága éppen a η koordináta! Mivel COP*ξΔ hasonló CTPxzΔ-höz, így

 

(3.101)

azaz

 

(3.102)

Hasonlóan az yz síkban CTPyzΔ hasonló COPηΔ-höz, így

 

(3.103)

azaz

 

(3.104)

Ezzel létrehoztuk a (3.99) leképezést, hiszen átrendezés után

 

(3.105)

adódik. A (3.105) képletekkel az a probléma, hogy a leképezés nem lineáris. Lineárissá tehetjük úgy, hogy megnöveljük a dimenziószámot (kettőről háromra), bevezetve a homogén koordinátákat. Tekintsük a [x, y,z] térbeli pont helyett a négydimenziós [x, y, z, 1] pontokat. Azaz az [x, y, z, w] négydimenziós térben a w=1 háromdimenziós altérben gondolkodunk. Ebben a térben a (3.106) leképezés

 

(3.106)

ami lineáris, hiszen átírható a (3.107) alakra.

 

(3.107)

Window-Viewport transzformáció

Miután a térbeli objektumot leképeztük a síkra, nincs más dolgunk, mint hogy azt a képernyő méreteire skálázzuk. A leképezett kép befoglaló téglalapja (window) nem hasonló a képernyő téglalapjához (viewport). A leképezett kép lehet nagyobb és kisebb, mint a képernyő.

3.25. ábra - A Window-Viewport transzformáció

A Window-Viewport transzformáció


A (3.25. ábra - A Window-Viewport transzformáció) ábrán a leképezett kép (window) befoglaló téglalap átellenes sarkainak koordinátái a (ξ11) és (ξ22). A megjelenítő befoglaló téglalap átellenes sarkainak síkbeli koordinátái (ξ33) és (ξ44). A leképezés során többféle stratégiát is követhetünk. Készíthetünk leképezést úgy, hogy a window sarkok a viewport sarkokba kerüljenek. Ilyenkor a kép nem méretarányos, de kitölti a képernyőt. Igazíthatjuk a képet a viewport valamelyik sarkához is. A következőkben azt az esetet számítjuk ki, amelyben a leképzett modell középpontja a képernyő középpontjába kerül. A vízszintes képéleket vízszintes képélekhez, vagy függőleges képéleket függőleges képélekhez igazító skálázások közül a kisebbet (amelyik a teljes képet a megjelenítőre viszi) választjuk.

Állapítsuk meg a leképezés nagyítását! Ez a viewport és window a vízszintes oldalainak, valamint a függőleges oldalainak hányadosai közül a kisebb.

 

(3.108)

A leképezés lineáris, amely egy α skálázásból és egy eltolásból áll. Keressük a transzformációt a (3.109) alakban!

 

(3.109)

Mint azt már rögzítettük, azt az esetet számítjuk ki, amelyben a leképzett modell középpontja a képernyő középpontjába kerül. Ebből meghatározhatjuk az ismeretlen és értékeket.

 

(3.110)

azaz

 

(3.111)

A láthatóság

A láthatóság meghatározásának legegyszerűbb módja a hátsó lap eldobásának módszere, aminek alapkoncepciója az, hogy ha a felületet (testet) alkotó háromszögháló kifelé mutató normálisa n egy irányba mutat a ránézés irányával r (3.26. ábra - Hátsó lap eldobás), vagyis n*r>0 akkor az a háromszög nem látható.

3.26. ábra - Hátsó lap eldobás

Hátsó lap eldobás


A mélységi rendezés (Depth Sort) algoritmus lényege, hogy rendezzük a képernyőtől (leképezési sík) való távolságuk szerinti sorrendbe a kirajzolandó objektumok felületét alkotó háromszögeket, majd hátulról előre rajzoljuk ki őket. Így amit később rajzolunk ki az átfesti (takarja) a hátrébb lévő elemeket. A probléma a sorbarendezéssel van, mint ahogy azt a 3.27. ábra - Nem sorbarendezhető háromszögek mutatja.

A mélységi rendezés algoritmusa:

A Δ-kel közelített felület Δ elemeit a megjelenítési síktól mért legtávolabbi pontjuk távolsága szerint rendezzük sorba! Vizsgáljuk meg a sorrend összes háromszögpárjának (A és B) viszonyát! Az A<B sorrend helyes, ha

  1. az A Δ legtávolabbi pontja közelebb van a síkhoz, mint B Δ legközelebbi pontja. (Ez mindösszesen számok összehasonlítását jelenti.)

  2. A háromszögek befoglaló téglalapjai nem metszik egymást. (Ez kétszer három pont síkbeli koordinátáinak minimum-maximum keresését, és számok összehasonlítását jelenti.)

  3. Az A Δ vetített képe nem metszi B Δ vetített képét. (Az A Δ minden oldalára igaznak kell lennie annak, hogy a B Δ összes csúcsa és az A aktuális oldallal szemben fekvő csúcsa az oldalegyenes szembenfekvő oldalára esik)

  4. a B Δ mindhárom sarokpontja az A Δ síkja mögött helyezkedik el. (B háromszög összes csúcspontját be kell helyettesíteni A síkjának egyenletébe.)

Ha ezek egyike sem áll fenn, akkor az egyik háromszöget két részre kell vágni, és folytatni a módszert egészen addig, míg az összes háromszög sorbarendezhető.

3.27. ábra - Nem sorbarendezhető háromszögek

Nem sorbarendezhető háromszögek


A bináris térfelosztó (BSP - Binary Space Partitioning) algoritmus lényege az, hogy bármely sík három nagy halmazra osztja a tér objektumait: a sík felett lévők (az objektum összes pontja a sík normálvektorával egy irányban vagy a síkon van), a sík alatt lévők (az objektum minden pontja a normálvektorral ellentétes oldalon található) és végül azok az objektumok, amiket a sík elmetsz.

Legyen a testet reprezentáló háló egyik háromszögének síkja az első vágósík! Azokat az elemeket, amelyeket ez a sík kettévág, további háromszögekre bontjuk úgy, hogy ezek már vagy a sík alá vagy fölé kerülnek. Az eljárás rekurzív módon folytatható addig, ameddig a vizsgált halmaz egyetlen háromszögből nem áll. Ha a rekurzív vágásokat egy gráfban ábrázoljuk, akkor bináris fát kapunk, ahol a csomópontok a vágósíkok és a levelek tovább nem bontható háromszögek lesznek. A felbontás végén a leveleket (háromszögeket) hátulról előre (a 3.28. ábra - BSP fa ábrán piros nyíl) kifesthetjük, így az előbb lévő háromszög átfesti a takart elemet.

Az területfelosztásos (Area Subdivision) technika lényege az, hogy a Viewportot négy egyenlő részre bontjuk (3.29. ábra - Területfelosztás (Area Dubdivision)). A levetített háromszögek vizsgálata során megállapíthatjuk, hogy készen vagyunk a takarással, ha:

3.28. ábra - BSP fa

BSP fa


3.29. ábra - Területfelosztás (Area Dubdivision)

Területfelosztás (Area Dubdivision)


3.30. ábra - A területfelosztás esetei

A területfelosztás esetei


A takart részek eltávolításának manapság már legelterjedtebb algoritmusa a Z-puffer algoritmus. A grafikus kártyák már beépített Z-pufferrel és algoritmussal rendelkeznek, így ha megfelelő 3D-s rendszert használunk, akkor ezzel nincs gondunk. Az algoritmus lényege, hogy minden képernyőpixelhez a Z-puffer tartalmaz egy mélységi adatot. A Z-puffer tehát egy távolságlista, melynek elemei a képernyőpontokhoz tartoznak (3.31. ábra - A Z puffer és működése ábra bal oldala). Az algoritmus úgy működik, hogy mielőtt elkezdené a megjelenítést a Z-puffer minden egyes távolságadata a gyakorlati . A kép kirajzolása során minden egyes ponthoz kikereshető az aktuális távolságérték (Z-puffer érték). Ha az aktuális pont távolsága (z-koordináta) kisebb mint a Z-pufferben tárolt érték, akkor a pont kifestődik, és a Z-pufferbe a z-koordináta lesz az új, aktuális érték. Ha a z-koordináta értéke nagyobb, mint ami a Z-pufferben volt, akkor a ponttal és z-koordinátájával semmi teendő (3.31. ábra - A Z puffer és működése) jobb oldala. A Z-puffer tehát a kirajzolás során az adott képernyőpontban aktuálisan látható legközelebbi pont z távolságát tartalmazza.

3.31. ábra - A Z puffer és működése

A Z puffer és működése