A VRML és a geometriai transzformációk

Itt már kissé tüzetesebben megvizsgáltuk a kamera néhány tulajdonságát. Ebből a vizsgálatból az derült ki, hogy a szemlélt objektum és a kamera kölcsönös helyzetét megváltoztathatjuk mind a kamerának, mind magának az alakzatnak a mozgatásával (transzformálásával).

Most ezzel az utóbbi kérdéssel fogunk kissé részletesebben megismerkedni, már csak azért is, mert az alakzatoknak a kamerához, ill. más ábrázolt alakzathoz való viszonyát ezeknek az un. koordináta-transzformációknak a segítségével határozhatjuk meg pontosan. Erre pedig bizony elég gyakran szükségünk lehet.

Előre is elnézést kérünk az olvasótól, amiért a téma kapcsán kissé több szó esik a matematikáról, ezen belül a különböző geometriai transzformációkról. Reméljük, nem fog megártani.

Lényegében két olyan geometriai transzformáció van a VRML nyelvben, amely nem változtatja meg az ábrázolt alakzat alakját, ill. méretét. Ez az eltolás és a forgatás.

Pl. - mint már volt róla szó - ha egy alakzat lerajzolását megelőzően beírjuk a

 Translation { translation 7 5 3 }

eltolásra vonatkozó utasítást, akkor az alakzatunk az ő koordinátarendszerében vett eredeti helyéhez képest a ( 7,5,3) pontba kerül. Ezt persze nem feltétlenül érzékeljük. Pl. a p1.wrl és a p2.wrl   vrml fájlokat beolvasva - melyek forrásprogramja p1.txt és p2.txt - a rajzokon először nem érzékelünk semmilyen különbséget. (Most, és a későbbiekben is a megállapításaink a Live3D megjelenítő alkalmazása esetén érvényesek.) Ha azonban a megforgatjuk a gömböt, már érzékelhető a különbség. Az első a saját középpontja körül forog, amely egyúttal a "világ-koordinátarendszer" origója. A másik ugyancsak a "világ közepe" körül forog, amelyhez képest eltoltuk a Z tengely mentén, azaz felénk.

A továbbiakban, hogy könnyebben érzékeljük a "mihez képest mozog " fogalmát, a vizsgált geometriai transzformációk hatását, felveszünk egy stabil koordinátarendszert, amelyet ugyan interaktívan tudunk mozgatni, de mégis tekintsük úgy, mintha ez lenne a "világ-koordinátarendszer". Még a kamerát is ehhez fogjuk rögzíteni. Az "alakzat"-ot ehhez a rögzített koordinátarendszerhez képest fogjuk mozgatni. Ezen a programrészleten legfeljebb annyit módosítunk, hogy - ha szükségesnek véljük - a perspektív ábrázolás helyett az axonometrikust alkalmazzuk. Ajánljuk olvasóinknak, hogy a fájlba belenyúlva időnként ezt (is) tegyék meg.

Példaként itt a p3.wrl alakzat a mely egy 0.5 sugarú gömb a (3, 5, 7) pontba eltolva. Íme a forrásfájl: p3.txt . A továbbiakban a forrásfájloknak csak az "alakzat" -hoz tartozó részét közöljük. Pl. így: p3a.txt .

A könnyebb tájékozódás kedvéért egészítsük most ki az ábránkat egy élvázas téglatesttel, amelynek az élei párhuzamosak a világ-koordinátarendszerrel, egyik csúcsa az origó, másik az előbbi gömb: p4.wrl , és a forrásfájlja: p4a.txt .

Most alkalmazzunk egy újabb - az egész alakzatra vonatkozó - eltolást: p5.wrl ; p5a.txt . Itt jegyezzük meg, hogy az eltolások sorrendje csak akkor cserélhető fel, ha nincs a kettő között rajzolást eredményező blokk (csomópont). Itt pl. a későbbi eltolás csak a gömbre, az előbbi az egész alakzatra vonatkozik.

Másik, a vrml -ben alkalmazható u.n. egybevágósági transzformáció a forgatás. Pl. Ebben a Transform { rotation  2  3  1   -1.3 } - találomra felírt forgatásban negatív, azaz az óramutató járásával megegyező irányba forgatjuk az alakzatunkat 1.3 radiánnyi szöggel egy olyan térbeli egyenes körül, melynek egyik pontja az alakzat origója, másik a (2, 3 1) pont. Itt az eredmény: p6.wrl , p6a.txt .  Az eltolás és a forgatás sorrendje természetesen befolyásolja a rajzot. Az eltérés főként akkor érzékelgető, ha mindkét sorrendet figyelembe véve lerajzoljuk az alakzatunkat. Most előbb a forgatást, majd az eltolást alkalmaztuk: p7.wrl , p7a.txt .Megkülönböztetésül az utóbbi alakzatnál zöldre festettük a gömböt. Nem meglepő, hogy a két alakzat párhuzamos helyzetű, hiszen a két forgatás tengelye párhuzamos, a szögük is megegyezik.

Tűzzünk most ki egy konkrétabban meghatározott célt. Például próbáljuk meg a p4.wrl alakzatunkat - egyetlen forgatással - úgy elforgatni, hogy a gömbünk illeszkedjék az X tengelyre! Ez esetben a forgatás szöge a (7, 5, 3) vektornak az X tengellyel bezárt szöge, vagyis annak a derékszögű háromszögnek a szöge, amelynek a keresett szög melletti befogója 7, az ezzel szemközti pedig az 5 és 3 oldalú, (XZ) síkkal párhuzamos téglalap átlója.

A forgatás egyenese merőleges erre a síkra. Ennek egy pontja lehet pl. a (0, -3, 5) pont. Ha ebből a pontból néznénk a forgatás síkjára, akkor a forgás szögét negatívnak, azaz az óramutató járásával megegyezőnek látnánk: p8.wrl  . Ez a forgás valóban az X tengelyre helyezte a gömbünket: p9.wrl  ,   p9a.txt .

Most oldjunk meg egy kissé összetettebb feladatot. Forgatással illesszük a gömböt a  Z tengelyre úgy, hogy a forgatás eredményeképpen az alakzatot alkotó téglatestnek az Y tengellyel párhuzamos élei továbbra is látsszanak függőlegesnek. Mintha elforgatnánk az alakzatot - tulajdonképpen a vizsgált tárgy koordinátarendszerét - a függőleges Y tengely körül, majd az origón átmenő vízszintes egyenes körüli újabb forgatással magunk felé döntenénk a kívánt mértékben.

Az előzőekhez hasonlóan okoskodva az első forgatás szöge , tengelyének egy pontja pl. a (0, 1, 0) pont, a forgás iránya ismét negatív: p10.wrl . A második forgatás szöge , egyenese az első forgatás után a képernyő síkjában fekvő vízszintes egyenes. Ennek egy pontja lehet pl. a (3, 0, -7) pont, amelyből nézve pozítív a forgásirány: p11,wrl   p11a.txt .

Ezt a két forgatást azért volt érdemes megismernünk, mert így kapunk egy alakzatról olyan (akár perspektív, akár axonometrikus) képet, mint ha az egy vízszintes síkon állna, amelyre kissé rálátunk. Több olyan 3D -s alakzat megjelenítésével (is) foglalkozó program van - pl. a legismertebb matematikai programok egyike a MAPLE - amely pontosan ennek a két forgatásnak a szögét adja meg változtatható paraméterként. Ez a két forgás elegendő ahhoz, hogy bármilyen helyzetbe beállíthassuk az alakzatunkat.

A fentiek illusztrálására bemutatunk egy "kisipari" módszerekkel készült (Pascal) programot, amely egyúttal példa arra, hogy a 3D-s alakzatok megjelenítéshez nem feltétlenül szükséges nagy apparátus. Javasoljuk, az olvasónak, hogy töltse le, majd futtassa ezt a programot: 7lap.exe

Végül oldjunk meg egy egészen általános - egyetlen forgatással megoldható - feladatot. vegyünk fel egy új (zöld) gömböt, amelyet eltolunk találomra , pl. a (-2, 1, 4) pontba. (Mivel a két gömböt külön elválasztó blokkba tettük, a két gömbre vonatkozó eltolás nincs egymásra hatással.)

Próbáljuk most ezt az utóbbit elforgatni úgy, hogy az origó, az első gömb, valamint a második elforgatottja essen egy egyenesbe. Lényegében azt a forgatást kell megadnunk, amellyel egy tetszőleges vektor egy ugyancsak tetszőleges másikkal egy irányba hozható. Ehhez ki kell számolnunk a forgatás tengelyének egy pontját, valamint a forgatás szögét. Ez bizony kissé komolyabb matematikai apparátust igényel. (Akit ez kevésbé érdekel, vagy éppenséggel ismeri, használni is jól tudja az itt bemutatott matematikai fogalmakat, tekintse meg az eredményt: p12.wrl , p12a.txt , és ugorja át ezt a csöppet sem kellemes, de a matematika iránt (is) érdeklődők számára talán hasznos részt.

Két, általános helyzetű, térbeli koordinátáival - azaz egy-egy ponthármassal - adott vektor szögének a meghatározására egyik legkönnyebben, minden esetben alkalmazható módszer egy a középiskolából ismert fogalmat, a vektorok skalárszorzatának a fogalmát használja.

Az a és b vektorok skalárszorzatán - melyet (ab) -vel jelölünk a két vektor hosszának, valamint az általuk bezárt szög koszinuszának a szorzatát értjük:

Mivel két vektor szögét úgy értelmeztük, hogy az nem nagyobb az egyenesszögnél, ezért a szög koszinusza egyértelműen meghatározza magát a szöget. Ha két vektor egyike sem null-vektor, akkor skalárszorzatuk akkor és csak akkor lesz 0 , ha merőlegesek egymásra. Be lehet látni, hogy a skalárszorzat rendelkezik egy csomó kellemes tulajdonsággal: pl. kommutatív, disztributív az összeadásra nézve. Ez ad lehetőséget arra, hogy ha két vektor koordinátáival adott, akkor skalárszorzatukat a megfelelő koordinátáik szorzatának az összegeként kiszámolhassuk:

Ugyanis az i, j, k egységvektorokat önmagukkal szorozva 1-et, bármely másikukkal szorozva 0 -t kapunk. A vektorok abszolútértéke az ismert pithagoraszi összefüggésből számítható, így esetünkben a (7, 5, 3) és a (-2, 1, 4) vektorok szöge nem túl sok számolással adódik:

A forgatás megadásához szükségünk lesz még egy vektorra, amely merőleges az előbbi vektorok által meghatározott síkra. Ehhez a vektorok vektoriális szorzatának a fogalmát fogjuk felhasználni. Két vektor - legyenek ezek a és b - vektoriális szorzatán azt az - a x b -vel jelölt vektort értjük, amely

.
Bár nem tartozik ide, de érdekességképpen megemlítjük, hogy ha valamilyen (pl. igen távoli) értelmes lényekkel tudnánk rádión keresztül (de csak így) kommunikálni, nagyon sok matematikai fogalmat el tudnánk nekik magyarázni, de azt nem, hogy mi mit nevezünk jobbsodrású rendszernek. Ez épp úgy a matematikán kívüli megállapodás kérdése, mint, hogy az óramutató negatív irányba forog.

A vektori szorzat tulajdonságait alaposan elemezve be lehetne látni, hogy miként lehet az a és b - koordinátáival adott - vektor vektori szorzatának a koordinátáit kiszámítani. Aki ismeri a determináns fogalmát, (amely lényegében bizonyos számokból adott szabály szerint képzett szorzat) annak a számára könnyebben megjegyezhető a következő képlet. Ugyanis a vektori szorzat egy olyan determináns első sora szerinti kifejtésével számítható ki, melynek első sorában az  i, j, k egységvektorok, másodikban az a vektor harmadikban a b vektor koordinátái vannak. Persze maga a képlet e fogalom nélkül is megjegyezhető:

Ezt a képletet a a mi (-2, 1, 4) és a (7, 5, 3) vektorainkra alkalmazva kapjuk a forgatás tengelyének egy pontját:

(Azért ebben a sorrendben vettük a vektorokat, mert így a forgatás tengelyén kiválasztott (-1, 2, -1) pontból pozitív irányú forgás viszi a (-2, 1, 4) vektort a (7, 5, 3) -vel megegyező irányba:

Transform { rotation   -1   2   -1    1.498876 } .

Ha mos felveszünk három olyan tetszőleges helyvektort - végpontjaikba egy-egy gömböt helyezve - melyekről tudjuk, hogy egymásra páronként merőlegesek, akkor nem lenne elvi akadálya annak, hogy egy, vagy több forgatással ezeket elmozdítsuk úgy, hogy mindhárom gömb a "világ-" koordinátarendszer egy-egy tengelyére illeszkedjen. p13.wrl , p13a.txt .

(Ha fel szeretnénk venni egy olyan vektort, amely merőleges a (7, 5, 3) vektorra, egyébként tetszőleges, akkor csak arra kell ügyelnünk, hogy elégítse ki a  7x + 5y + 3z = 0  egyenletet. A harmadikat ezekből már a vektori szorzat felhasználásával számíthatjuk ki.)

Ez az egyértelműen meghatározott célú transzformáció (sorozat) azonban már igen sok és kellemetlen számolást igényelne. E feladat megoldására vezette be a VRML alkotógárdája a mátrix transzformációt, amely egyetlen adatstruktúrával megoldja a problémát. Ennek az alkalmazása ugyancsak komolyabb matematikai meggondolásokat igényelne.  Az ezzel kapcsolatos ismereteket ismét átugorhatják  a téma iránt kevésbé érdeklődők, ugyanis a gyakorlatban megkímélhetjük magunkat ezektől a hosszadalmas és koránt sem egyszerű számolásoktól.

A mátrix transzformáció az alábbi matematikai összefüggésen alapszik. Legyen a,  b,  c  három, egymásra páronként merőleges, ebben a sorrendben jobbsodrású vektor. Ha az XYZ térbeli derékszögű koordinátarendszer ugyancsak jobbsodrású, akkor az a,  b,  c  vektorok rendre ráilleszthetők az X, Y, Z  tengelyekre egy térbeli mozgással (iránytartó egybevágósági transzformációval).

Jelölje rendre  az a, b, c vektoroknak az X, Y, Z tengelyekkel bezárt szögeit. Az a kérdés, hogy mik lesznek az (a, b, c) alakzattal együtt mozgó P(x, y, z) pontnak az új P(x' , y' , z' ) koordinátái? (A "mi mozog, mihez képest mozog?" kérdés alapján ugyanez úgy is fogalmazható, hogy mik lesznek a P pont koordinátái az új rendszerben?) A Választ az alábbi transzformációs képlet adja:

Ebben a képletben az előbbi szögek koszinuszai szerepelnek, amelyeket szerencsénkre könnyebb megadni, mint magukat a szögeket. Ha ugyanis az a, b c vektorok egyaránt egységnyi hosszúak, akkor a vektorok koordinátái éppen a szóban forgó szögek koszinuszai. Ezt pedig könnyen ki lehet számolni, hiszen elegendő minden koordinátát rendre elosztani aa adott vektor hosszával, amit viszont Pithagorasz tételével határozhatunk meg. AVRML -ben használt mátrix transzformáció lényegében ezeket az együtthatókat tartalmazza. A három gömbből álló alakzatunkat, melyet lényegében az   a(7 ,  5 , 3),   b(-2 , 1 , 3) és a  c( 2.4 , -5.4 ,  3.4) vektorhármas határoz meg, a

MatrixTransform  {    matrix
0.768    -0.535     0.352    0
0.549      0.267   -0.792    0
0.329      0.802    0.499    0
0            0           0          1     }

transzformációval tudtuk átvinni a kívánt helyzerbe: p14.wrl,   p14a.txt . Figyeljük meg, hogy mind az egy sorban, mind az egy oszlopban lévő számok négyzetösszege - a kerekítésekből adődó hibáktól eltekintve - 1 . Ha ez valamilyen téves beírásból adódóan nem teljesül, vagy valahol elvétünk egy előjelet, akkor a program fut ugyan, de többnyire igen vad alakzatot rajzol, amely az eredetinek valamilyen affin képe. Egyébként ebben a mátrixban megadhatjuk az alakzat eltolását is, az új koordinátarendszer origójának a régi rendszer-beli koordinátáit rendre az alsó sorba írva. Sőt megadhatunk egy un. affin transzformációt is, amennyiben egy-egy oszlopot megszorzunk az adott irány nyújtására vonatkozó tényezővel.

Ezeket a számolgatásokat szerencsére nem kell "kézzel" elvégeznünk.

Az itt bemutatott vrml szerkesztőprogram: szdemo.exe koordináta-transzformációval foglalkozó része - melléktermékként - előállítja azt a transzformációs mátrixot, amelyet alkalmazva pl. a fenti mátrixot előállíthatjuk.

Itt jegyezzük meg, hogy ez a vrml szerkesztő program (demo változata) kissé eltér az előzőleg közölt verziótól. Ez a változat már képes olyan VRML 1.0 fájlokat előállítani, amelyek a Cosmo Player megjelenítőn is futtathatók.

Végül, - ha már részben a matematikai ismeretek jegyében telt a kedves olvasónak az e cikk megismerésére fordított ideje - bemutatunk egy - ugyancsak matematikai -példát a VRML transzformációinak egy gyakorlati alkalmazására.

A középiskolai matematika anyag egyik igen érdekes, de sokak számára talán kevéssé szemléletes része az első n természetes szám négyzetösszegére vonatkozó összefüggés igazolása:

Ha arra nem is vállalkozunk, hogy minden igényt kielégítő bizonyítást adjunk erre az összefüggésre, megkíséreljük kissé szemléletesebbé tenni a problémát.

Elsőként vegyük szemügyre ezt a "tornyot" !

A torony egy egy rétege rendre, 1, 2, 3, . . .7 oldalhosszúságú nényzet alapú hasáb, így 1, 4, 9, .. 49 kockából áll. Ez azt jelenti, hogy maga a torony az első 7 pozitív egész szám négyzetösszgének megfelelő számú kockából áll. Ha hat ilyen tornyot megfelelően - mintegy térbeli puzzle-ként össze tudunk áll1tani egy téglatestté, amelynek élei rendre 7 ,   7+1 , ill 2*7+1, akkor ezzel n=7 -re pontosan beláttuk az összefüggést. Mivel azonban nincs elvi akadálya, hogy tornyunkat tovább növeljük, és  6  ilyen n rétegű toronyból összeállítsunk egy n(n+1)(2n+1) egység-kockányi téglatestet, azt mondhatjuk , hogy a bizonyításunk teljes.

A téglatest összeállíthatóságát ezek a vrml jelenetek mutatják:

2 torony , 3 torony  , 3 együtt ,   6 torony , téglatest.

A legutóbbi jelenet forrásfájljából kiderül, hogy az előző, "szellős" jeleneteket a most kiiktatott eltolásokkal kaptuk.

Végül, engedje meg a kedves érdeklődő, hogy kitűzzünk néhány olyan feladatot, amelyekben az itt megismert összefüggéseket alkalmazva készíthetünk - az előzőek alkalmazásaként - érdekes geometrjuai alakzatokat megjelenítőVRML jeleneteket:

Van egy érdekes geometriai konstrukció, az un. Sierpinski szivacs. Ezt úgy származtathatjuk a kockából, hogy felbontjuk 3*3*3 kisebb kockára. Ezek közül eltávolítjuk az összes olyat, amelynek nincs közös éle az eredeti kockával. A megmaradt kis kockákkal megísmételjük ezt a műveletet. Elvileg végtelen sokszor, ezen a rajzon csak egyszer.

Készítsünk vrml alakzatot erről a matematikai csodabogárról! (Megjegyezzük, hogy elegendő hozzá a Cube{} alakzat, valamint a Translation { translation ? ? ? } művelet.)

Ez a kép is egy VRML fájl alapján készült. Lényegében egy dolgot kellett megoldanunk: azt, hogy milyen irányú tengely körül, mekkora szöggel kell elforgatnunk a kockát, hogy ezt az alakzatot kapjuk. Mivel senkit nem szeretnénk megfosztani az önálló alkotás örömétől, itt most közöljük a kép elkészítéséhez használt VRML forrásprogramot, csak éppen a lényeget, a forgatások adatait nem adjuk meg.

Ennek a másik alakzatnak az előállításához pontosan ugyanazokat a forgatásokat kell alkalmaznunk. Az ehhez szükséges VRML fájl elkészítését teljes egészében az olvasóra bízzuk. Itt az a fő kérdés, hogy milyen alakzatból (poliéderből) kapjuk a megfelelő forgatásokkal a keresett alakzatot.

A most megismert lehetőségeink birtokában még várhatóan sok ilyen bogarat fogunk gombostű végre venni. Reméljük, a most felvillantott lehetőségek további ötletgazdag VRML konstrukciók megalkotására inspirálják olvasóinkat.

Minden érdeklődőnek az önálló felfedezés örömét, jó munkát kíván:

Szilassi Lajos
Kérjük, írja meg észrevételeit:      szilassi@jgytf.u-szeged.hu