A kamera, ami elõtte és aki mögötte van.
Akkor, ha három dimenziós alakzatról egy kétdimenziós képet készítünk, és ezt precíz eszközökkel (azaz nem az ábrázolási módokat alkalmasint felrúgó, vagy keverõ „mûvészi" módon) tesszük, akkor mindenképpen azt kell megvalósítanunk, hogy egy képsíkra - a képernyõ síkjára - vetítjük a térbeli alakzatot, valamilyen egyértelmûen meghatározott módszerrel. A manapság divatossá vált 3D -s megjelenítés kifejezés tehát kissé félrevezetõ, hiszen a kép továbbra is két dimenziós, csak amit ábrázolunk, az térbeli.
Minden ilyen kép készítésekor a cél lényegében azonos: olyan képet szeretnénk készíteni, amilyennek magát a térbeli alakzatot látjuk. Ez persze nem megy, hiszen a térlátást a két szemünk biztosítja azzal, hogy a közöttük lévõ távolság miatt más-más kép keletkezik az egyik, ill. másik szemünkben, amelyet az agyunk dolgoz fel térbeli látvánnyá. Ezért a 3D -s ábrázolás lényegében az lenne, ha ilyen különbözõ képek kerülnének a szemünkbe. Vannak is ilyen eljárások, amelyek pl. piros - kék szemüveggel választják szét az egyik, ill. másik szemünkbe kerülõ képet. Mi most azonban maradjunk a monitorra kerülõ, és akár egy szemmel is nézhetõ képnél. (Ti. a másikkal is ugyanazt látjuk.)
Marad tehát a számunkra az a módszer, amellyel a térbeli alakzatot a képsíkra - jelen esetben a monitorra - vetítjük. Ezt megtehetjük úgy, hogy a tárgy pontjait a nekik megfelelõ képsíkra esõ kép-pontokkal összekötõ egyenesek - az un. vetítõsugarak párhuzamosak legyenek egymással, vagy úgy, hogy a tér egy adott pontjára - a vetítés centrumára - illeszkedjenek. Az elõbbi az un. axonometrikus, az utóbbi a centrális, vagy másképpen perspektív ábrázolás. Mindkettõvel van egy kis baj, de ez már nem az ábrázolás, hanem a nézõ problémája. Ugyanis nagyon távoli tárgyat kell néznünk ahhoz, hogy a szemünkbe jutó fénysugarakat gyakorlatilag párhuzamosoknak tekinthessük. Azt mondhatjuk, hogy az axonometrikus kép nem valószerû, mert a tér párhuzamos egyenesei a képen is párhuzamosak lesznek, miközben a valóságban azt látjuk, hogy összetartanak. Ugyanakkor a perspektív kép többnyire még kevésbé valószerû, mivel többnyire nem abból a pontból nézzük a képet, ahonnan készült. A legtöbbször az ábrázolás centruma közelebb van a képsíkhoz, mint ahonnan a képet szemléljük, emiatt túlságosan gyorsnak találjuk a térbeli párhuzamos vonalak összetartását a képen.
Ugyancsak elsõsorban a nézõ problémája, és nem az ábrázolásé, hogy mi történik, ha megmozdul a kép. Mi mozog, mihez képest, hogyan? Ez bizony nem könnyû kérdés. Ptolemaiosztól Einsteinig igen sok embert foglalkoztatott, és foglalkoztat. Talán nekünk sem árt kissé elgondolkoznunk rajta. Ahogyan ezt már kisgyerek korunkban is megtettük, amikor azt mondtuk a vonatablakból kinézve, hogy szaladnak a fák. Vagy mégsem szaladnak?
Az ábrázolt három dimenziós alakzat perspektív képe három „objektum", az ábrázolt tárgy, a képsík és a centrum egymáshoz viszonyított kölcsönös helyzetétõl függ.
Mivel a kép mérete minden rajz esetén korlátos - a mi esetünkben maga a képernyõ - ezért azt mondhatjuk, hogy azokról az alakzatokról tudunk perspektív képet készíteni, amelyek belül vannak egy olyan végtelen gúlán, melynek az un. vezérgörbéje a kép széle, csúcsa az ábrázolás centruma. Nevezzük ezt a gúla-palást által határolt térrészt látótérnek. Ha egy program úgy készül, hogy a - többnyire koordinátáival megadott - térbeli alakzatnak levágja azt a részét, amely kívül esik az aktuális látótéren, akkor elvileg bárhol elhelyezhetjük az alakzathoz képest az ábrázolás centrumát, akár az alakzat belsejében is. Számunkra az alakzatnak a látótérbe esõ része az ábrázolandó, ill. látható alakzat. Azt mondhatjuk, hogy a „kamera" tehát nem más, mint a centrum és a kép széle által meghatározott gúla. A kép - akár a képernyõn, akár a rajzasztalon keletkezik - többnyire téglalap alakú, vízszintes és függõleges élekkel. Szokványos esetben a centrumnak a képernyõre esõ merõleges vetülete ennek a téglalapnak a középpontja. Ekkor a gúla tengelye a centrumon átmenõ és a kép síkjára merõleges egyenes. A perspektív kamera legfontosabb jellemzõje az látószöge, melyet - rögzített képméret mellett - a képsík és a centrum távolsága határoz meg. A VRML nyelvben a látószögön az un. függõleges látószöget értjük. Ez az a szög, amelyet a centrumra illeszkedõ és a kép alsó ill. felsõ szélén átmenõ síkok zárnak be egymással. Ez persze a teljes kép látószöge. Ha egy alakzat teljes egészében belefér a látótérbe, akkor külön beszélhetünk az alakzat látószögérõl, amely ugyancsak az alakzat méretétõl és a centrumtól mért távolságától, általánosabban a centrumhoz viszonyított helyzetétõl függ.
Lényegesen egyszerûbb megadnunk az axonometrikus vetítési rendszert, különösen ha az un. ortogonális (merõleges) axonometriáról van szó, mint pl. a VRML nyelvben. Ebben az ábrázolási módban a térben elhelyezett tárgyakat egymással párhuzamos - és a képsíkra merõleges - vetítõsugarakkal vetítjük a képernyõ síkjára. Így a látótér egy (végtelen) hasábfelület által határolt térrész, amely hasábnak az alkotóira merõleges un. normálmetszete maga a kép. Persze a kamera - ha úgy tetszik, a nézõ - ekkor is van "valahol", hiszen itt is változtatható az ábrázolt alakzathoz való viszonya. Ezért a kamera helyét megadva itt is lezárjuk egyik irányban a hasáb palástjával határolt térrészt. Látni fogunk rá példát, hogy miként tûnik el a szemünk elõl a kamera mögé kerülõ része az ábrázolt tárgynak. Ferdeszögû (un. klinogonális) axonometrikus képet akkor kapunk, ha az egymással párhuzamos vetítõsugarak nem merõlegesek a képsíkra (jelen esetben a képernyõ síkjára). A kamera mozgatásával ilyen ábrát is elõ tudunk állítani, de elõbb nézzük, mit is értsünk mozgáson.
A mozgás
Az a kép, ami tárgynak a látótérbe esõ részérõl a képernyõre kerül, természetesen az ábrázolási mód megválasztásán túlmenõen függ még attól, hogy hol van a vetítés centruma, és onnan merre „néz" a kamera, azaz milyen irányba mutat a tengelye, milyen a látótérnek és a szemlélt alakzatnak az egymáshoz viszonyított kölcsönös helyzete. Ha ez a viszony (folytonosan) változik, akkor ezt valamiféle mozgásként érzékeljük.
Ha nem nagyon mocorgunk a kamera elõtt, akkor mondhatjuk, hogy azt látjuk, amit a kamera. Csak az a kérdés, hogy mit gondolunk a látottakról. Azt, hogy forog a kamera elõtt pl. egy kocka, vagy azt, hogy a kocka „ott van", és mi körbe nézzük innen, onnan, közelebbrõl távolabbról. Ez a két vélekedés ráadásul keveredhet is. Olykor úgy képzeljük, mi mozgunk a kamerával együtt, olykor úgy, hogy a tárgy mozog elõttünk. Ez bizony szubjektív megítélés kérdése, ami attól függõen is változhat, hogy az ábrázolt tárgy egy a kamera látóterébe beleférõ geometriai alakzat, vagy pl. egy „virtuális" táj, vagy város, amely inkább azt sugallja, hogy mi szemlélõdünk benne.
Valamit súgnak pl. a Live3D menüpontjai is: a „walk" (sétál) , „look" (körbenéz, , megszemlél) , „slide" (csúszik) igék, vagy fõnévi igenevek a kamera mozgására, míg a „spin" (forgás) szó az alakzat mozgására utal. A „view" (nézet) szó pedig arra a stabil (alap-) helyzetre, amely a kamera és a vizsgált tárgy között tartósan fennáll.
Addig, amíg mindezt interaktív módon kezeljük, nem is nagyon érdekes a kérdés. Amint azonban a forrásfájlba belenyúlva programból szeretnénk szabályozni a kamera és az alakzat kölcsönös helyzetét, pontos választ kell adnunk a „Mihez viszonyítva?" kérdésre.
Egy ilyen kapcsolat precíz leírása csak úgy lehetséges, ha felveszünk egy „világ- koordináta rendszert", és igyekszünk mindent ehhez viszonyítani. Esetünkben ez pl. úgy képzelhetõ el, hogy origója a képernyõ középpontja, az X tengelye onnan jobbra mutat vízszintes irányban, az Y felfelé, a Z felénk. Ebben helyezzük el a kamerát, a programunkba beírt adatokkal meghatározva a jellemzõ tulajdonságait, vagy ráhagyjuk a megjelenítõnkre, hogy mindezt automatikusan állítsa be, az ábrázolni kívánt alakzattól függõen.
Az ábrázolandó alakzatnak van még egy saját koordinátarendszere, amely alaphelyzetben az elõzõvel megegyezik. Ebben az utóbbi koordinátarendszerben adhatunk meg egy alakzatot, pl. csúcsai koordinátáinak a felvételével. Akkor, amikor egy alakzatot különbözõ eltolásoknak, forgatásoknak vetünk alá, lényegében ennek az alakzatnak a koordinátarendszerét transzformáljuk, a világ-koordinátarendszerhez viszonyítva. Ha most kiragadunk az alakzatból egy részletet, és azt tovább transzformáljuk, azt már az elõbb elmozdított koordinátarendszerhez viszonyítva tesszük. Így igen bonyolult mozgásokat, kapcsolatokat tudunk kialakítani. Ez is megérdemel egy részletesebb diszkussziót, erre a virágszálra azonban most csak egy pillantást vetettünk, mert egy másik, a kamera tulajdonságai és mozgása köti le a figyelmünket. Térjünk hát vissza erre a kérdésre.
A látószög
Vegyünk szemügyre egy "kézbe vehetõ" tárgyat, mondjuk egy kislemezt, amely durván 10 cm-es. Ha "jól" meg akarjuk nézni, akkor mintegy 40 cm. -re tartjuk a szemünk elé. Ez azt jelenti, hogy mintegy 15 fokos szögben látjuk. Vagy mondjuk az átlagos méretû képernyõt, durván 60 cm. -nyi távolságból nézve, függõleges irányban mintegy 20 foknyi a látószögünk. Ha azonban arra gondolunk, hogy a képernyõn szemlélt VRML kép magassága többnyire nem nagyobb 12 cm. -nél, az ezen ábrázolt tárgy pedig 6-8 cm-es, amelyet ugyaninnen mintegy 10 foknyi szögben látunk, akkor azt kell mondanunk, az lenne az ideális perspektív kép, amelynek a centruma a vizsgált objektumtól olyan távolságra van, amelybõl a tárgy mintegy 10 fok alatt látszik.
A VRML nyelv Live3D megjelenítõje - amennyiben nem határozzuk meg az ábrázolás módját és a kamera helyzetét - automatikusan perspektív kamerával dolgozik, úgy állítva be az ábrázolás centrumát, hogy a függõleges látószög automatikusan kapott értéke ennél lényegesen több, 45 fok. Egy 20 cm-es szakasz mintegy 24 cm-rõl látszik 45 fokban. tehát illene közelebb húzódnunk a képernyõhöz, ami viszont egyáltalán nem ajánlatos.
Azt, hogy a VRML kép függõleges látószöge valóban 45 fok, egy kísérlettel ellenõrizhetjük.
(A tárgyalt példaprogramokra vonatkozó megállapításaink VRML 1.0 -ás változatában írt, a Live3D megjelenítõvel készített képekre vonatkoznak, az ezekbõl levonható tanulságok azonban könnyen általánosíthatók.)
Ez a fájl, melynek itt a forrásprogramja, egy olyan négyzet alapú gúláról készít VRML képet, amelynek a szemközti oldallapjai 45 fokos szöget zárnak be egymással. Ha a walk menüponttal "közelebb megyünk" a gúlához a tengely egyenese mentén, azt tapasztaljuk, hogy a két négyzet képe éppen akkor fedi egymást, amikor a négyzetek a kép felsõ, ill. alsó szélét elérik. Ez jobban látszik, ha a Detail / Wireframe üzemmódra kapcsolunk. Javasoljuk, hogy ne az egérrel, hanem a billentyûzetrõl közelítsük meg az alakzatot. Persze programból is beállíthatjuk a kamerát. (Ez a forrás fájl) Ha a kamera helyét a Z tengely 24.01 értékû pontjába tesszük, akkor még látszanak a gúla csúcsába befutó élek, de a 24 -nél már nem. (A Wiew menüpont melletti felfelé mutató háromszögre kattintva változtatható a nézõpont. (Figyeljük meg, hogy a kamerát egy általános helyzetû pontba helyezve a négyzetek képe továbbra is négyzet lett, mivel a kamera irányát nem változtattuk meg.)
Módszerünket arra is használhatjuk, hogy megvizsgáljuk, különbözõ méretû alakzatok ábrázolásánál milyen távolságra húzódik a kamera ahhoz, hogy durván beleférjen a látótérbe az alakzat akkor is, ha kissé megforgatjuk. Erre itt van két kísérlet. (Érdemes kissé átnézni a forrásfájlokat is. A centrum helyének, valamint az alakzat jelenlegi látószögének a megkeresését az olvasóra bízzuk.)
csonkagúla1.wrl csonkagúla1.txt csonkagúla2.wrl csonkagúla2.txt
Azt tapasztaljuk a forrás fájlokat vizsgálva, hogy amennyiben nem mi állítjuk be a kamerát, az az alakzat méretétõl függetlenül, automatikusan úgy helyezkedik el, hogy az egész alakzat a látótérben maradjon. (Ez az automatizmus akkor lehet veszélyes, ha véletlenül megadunk egy igen távoli pontot - amit esetleg nem is használunk az alakzat rajzolásánál - és nem tudjuk, miért ment el messzire a kamera.)
A kamera mozgatásával, vagy elõre beállított kamerával némi számolás után tetszõleges csonka gúlához meg tudjuk keresni azt a centrumot, amelybõl a csonka gúla alap és fedõlapja - valamint minden alaplappal párhuzamos síkmetszete egybevágónak látszik. Ez a centrum a csonka gúla kiegészítõ gúlájának a csúcsa lesz.
Készítsünk most egy nagyon egyszerû fájlt egy kockáról, amelyet kissé elforgattunk, hogy a fájl beolvasásakor ne csak egy lapját lássuk. A méreteket nem tartalmazó Cube {} programrészlet egy alapértelmezés szerinti origó középpontú, 2 egységnyi élû kockát jelent. Ez a forrásprogramja.
Már említettük, hogy amennyiben nem határozzuk meg az ábrázolás módját, a Live3D automatikusan beállítja a - perspektív - kamerát egy optimális értékre. Így, ha az elõbbi kocka köré egy tízszer akkora masszív élvázas kockát építünk, a látvány kontúrjait tekintve megegyezik az elõzõvel. Ez az alakzat lesz a vizsgálódásunk tárgya. Érdemes mindegyik rajzot alaposan szemügyre vennünk azzal, hogy a kamerát - vagy a magát a kockát - mozgassuk meg, minden lehetõséget kihasználva.
Ebbõl a rajzból induljunk ki: Most nem adtunk semmilyen kamerára vonatkozó utasítást. A fájl forrásprogramját rendre egy helyen fogjuk módosítani azzal, hogy mindjárt a második sorába beszúrjuk a kamerára vonatkozó instrukcióinkat.
A látvány eléggé kiábrándító, az alakzatnak épp, hogy látjuk egyik sarkát, túl közel vagyunk hozzá. Ennek az az oka, hogy ekkor a perspektív kamera az alapértelmezés szerinti paraméter-értékeket kapja, ezek pedig a következõk:
Ezek közül az elsõt (fókusztávolság) a Live3D nem használja, más megjelenítõkhöz tartozó adat. Ezzel lehet pl egy alakzat képét úgy nagyítani, hogy eközben ne változzon a tárgy és a centrum viszonya, azaz a párhuzamosok összetartása. Második adatunk a kép függõleges irányban mért látószöge. Az alapértelmezett értéke 45 fok, csak ívmértélben kell megadnunk Ezt, valamint a vetítés centrumát fogjuk rendre megadni.
PerspectiveCamera{ position 0 0 80 }
PerspectiveCamera{ heightAngle .785398 position 0 0 80 }
Ez a két rajz nem különbözik egymástól, és talán a legelsõtõl sem, bár ez függ a képernyõ felbontásától.
PerspectiveCamera{ heightAngle .392699 position 0 0 160 }
Most a függõleges látószög 22,5 fok. Ahhoz, hogy közel ugyanakkora képet kapjunk feleakkora látószög mellett, kétszer akkorára kellett venni a tárgy és a vetítés centruma közötti távolságot.
PerspectiveCamera{ heightAngle .196349 position 0 0 320 }
Ismét megfeleztük a látószöget, ezzel együtt megkétszereztük a kamera távolságát az alakzattól. A látvány egyre jobban megközelíti az axonometrikus képet. Ha a Walk menüponttal próbáljuk közelebb hozni aaz alakzatot, ez egyre lassabban megy, ugyanakkor az egér bármilyen kicsi oldalirányú mozgásától elfordul a kamera a tárgytól. Tulajdonképpen keskeny a látótér, a centrumtól igen messzire van a tárgy, így könnyen kívül kerül rajta. Aki szokott teleobjektívvel fotózni, vagy videózni, bizonyára találkozott már ugyanezzel a jelenséggel: "beremeg" a kamera.
OrthographicCamera{ } Scale{ scaleFactor 0.02 0.02 0.02 }
Íme a kocka képe merõleges (ortogonális) axonometriában. Itt bizony hiába menne bármilyen messzire a kamera, a párhuzamos vetítés miatt ettõl nem változna a kép mérete. Itt már valóban számít, hogy mekkorára választjuk az alakzat koordinátáit. Ha az adatainkon nem szeretnénk változtatni, akkor a koordináta-tengelyeken kell megváltoztatnunk az egységnyi szakasz képernyõnkre kerülõ hosszát. Figyeljük meg, hogy most a Walk funkciót bekapcsolva nem tudunk közelebb menni az alakzathoz, ugyanakkor nem is olyan gyorsan kerül ki a képernyõrõl a kocka, mint az elõbb. A kameránk most "ott van" alaphelyzetben a ( 0 0 1 ) pontban, ezért ha mégis azon igyekszünk, hogy közelebb menjünk az alakzathoz, akkor egyszerre a kocka egy része - késõbb az egész - eltûnik, ti. mögé kerül a kamerának.
Most állítsunk ismét a kameránkon, vizsgáljuk meg, hogyan viselkedik egy "nagy látószögû" objektív!
PerspectiveCamera{ heightAngle 1.750796 position 0 0 40 }
PerspectiveCamera{ heightAngle 2.358119 position 0 0 30 }
PerspectiveCamera{ heightAngle 3.141592 position 0 0 20 }
Ezek itt rendre 135 fokos, 270 fokos, sõt 360 fokos "halszem optikák". Természetesen ezekkel sem látunk teljesen körbe, hiszen továbbra is egyenes vetítõsugarakkal vetítjük az alakzatot egy síklapra. Emiatt az alakzatnak csak azt a részét láthatjuk, amely a centrum elõtt van, ugyanúgy, mint az axonometrikus ábrázolásnál. Vagyis a látószögünk gyakorlatilag mégsem lehet nagyobb 180 foknál. A képek közötti különbség abban van, hogy egyre nagyobb látószöget megadva egyre közelebb kell tennünk az alakzathoz a centrumot, ha azt szeretnénk, hogy megközelítõleg ugyanakkora kép keletkezzék.
Foglaljuk össze mindezt egyetlen VRML fájlba, amely az elõzõ kamera-paramétereket együtt tartalmazza az axonometrikus ábrázolástól a halszem optikákig. (A kamerák közötti váltást a view menûpont melletti háromszögekkel tehetjük meg.)
A látvány magáért beszél.
Minden érdeklõdõnek az önálló felfedezés örömét, jó munkát kíván:
Kérjük, írja meg észrevételeit: szilassi@jgytf.u-szeged.hu