Jazyk VRML
Technologie vývoje webových aplikací Marek Skalka, Adam Horáček 31.5.2008
Obsah Co je VRML? ...................................................................................................................... 3 Prohlžení VRML světů........................................................................................................ 3 Navigační režimy................................................................................................................ 3 Avatar ................................................................................................................................. 4 Základní tělesa ve VRML...................................................................................................4 Příklad: kompletní VRML soubor...................................................................................... 4 Skládání základních těles.................................................................................................. 5 Textury................................................................................................................................. 6 Světla................................................................................................................................... 6 Zvuk..................................................................................................................................... 6 Prototypy............................................................................................................................. 6 Speciální uzly...................................................................................................................... 7 Dynamické akce................................................................................................................. 7 Skriptování.......................................................................................................................... 8 External Authoing Interface............................................................................................... 9 X3D...................................................................................................................................... 9 Odkazy................................................................................................................................. 9
Co je VRML? VRML (Virtual Reality Modeling Language) je jazyk pro popis virtuální reality resp. interaktivní trojrozměrné vektorové grafiky. Standardizovaný textový formát jazyka VRML je textový, používá příponu souborů *.wrl a dá se relativně dobře komprimovat. Používá stromovou strukturu pro popis scény, není však založen na XML ani žádném jiném SGML jazyku. První verze vznikla v roce 1994. Verze VRML 97 (též známá jako VRML 2) byla v roce 1997 standardizována organizací ISO.
Prohlžení VRML světů VRML svět je možné zobrazit buď samostatně prostřednictvím některého z prohlížečů VRML souborů, nebo v rámci webové stránky, do které je VRML svět vložený podobným způsobem, jako třeba flash objekty nebo java applety. Do (X)HTML webové stránky vložený VRML objekt zvládnou dnes zobrazit téměř všechny webové prohlížeče, je ale zapotřebí mít nainstalovaný patřičný plugin pro přehrávání VRML scén. Jak samostatné prohlížeče, tak pluginy, jsou dostupné od několika společností jako open source i jako komerční řešení a jsou k dispozici pro různé platformy. Některé z komerčních produktů bývají pro domácí použití zdarma. Nejjednodušší cestou pro nainstalování pluginu do prohlížeče je použít „rozcestník“ http://cic.nist.gov/vrml/vbdetect.html, který kromě přehledu a doporučení vhodného software umí také detekovat již nainstalované pluginy v prohlížeči. Mezi nejznámnější programy pro prohlížení VRML scén patří třeba FreeWRL, FluxPlayer, CosmoPlayer, Cortona3D nebo Swirl3D. Samotné vkládání VRML do HTML se řeší pomocí elementů EMBED nebo OBJECT, viz následující příkald:
Vložení VRML Vložení VRML
Níže je zobrazen svět sample.wrl:
<embed src="demo.wrl">
Navigační režimy Ve VRML existují tři navigační režimy (Walk, Fly a Examine). Volba navigačního režimu určuje, jakým způsobem se bude ve virtuálním světě pohybovat avatar - virtuální postavička, která vás reprezentuje. V režimu Walk funguje detekce kolizí (nedá se tedy procházet skrz předměty) a funguje gravitace, v režimu Fly funguje detekce kolizí, ale gravitace nikoliv, a v režimu Examine režimu nejsou žádná omezení na procházení scény. Ve VRML světě je také možné přepínat (teleportovat) se mezi předdefinovanými viewpointy (místy ve scéně). Je také možné vytvořit odkazy fungující ve VRML scéně stejným způsobem, jako kotvy na HTML stránkách.
Avatar Virtuální postava, která reprezentuje vaší přítomnost ve scéně, má přibližně rozměry a schopnost pohybu běžného člověka. Fyzicky jde o válec s nožičkama dole a jedním okem nahoře, přičemž rozměr válce a délka nožiček určují, kam se avatar vejde a jak velkou překážku (schod) překročí. Avatar je ale sám pro sebe neviditelný. V místě oka má typicky navíc rozsvícenou „baterku“ - headlight - kterou si osvětluje scénu. Všechny parametry avatara lze nastavovat v uzlu NavigationInfo.
Základní tělesa ve VRML Celý trojrozměrný svět ve VRML je postaven z následujících základních těles:. Jak uvidíme později, následující základní tvary jsou hodnotou parametru geometry u uzlu Shape, který reprezentuje nějaký 3D objekt ve scéně. Box - kvádr s definovanými rozměry, umístěný svým těžištěm do středu souřadného systému (0, 0, 0) a orientovaný podle jeho os. Příklad: Box { }
size 2.0 2.0 2.0
Cone - jehlan - kromě rozměrů je možné nastavit také (ne)zobrazování podstavy Cylinder - válec. Opět možné nastavit (ne)zobrazování podstav. Sphere - koule. IndexedFaceSet - jakýkoliv 3D objekt sestavený z plošek. Definuje se polem bodů v prostoru a dále seznamem indexů bodů tvořících vrcholy jednotlivých plošek. Extrusion - 3D objekt vytvořený tažením nějakého 2D profilu prostorem po úsečce nebo lomené čáře. IndexedLineSet - množina čar tlustých 1px. Spíše než na zobrazení něčeho reálného se hodí pro zobrazení různých os a podobně. PointSet - množina bodů 1x1 px Text - text vygenerovaný z truetypového písma. Vzhledem k množství jeho polygonů se pro nápisy z důvodu optimalizace častěji používají textury. ElevationGrid - zvrásněná plocha. Definuje se dvourozměrným polem, kde jednotlivá čísla udávají výšku (například terénu) v jednotlivých bodech mřížky.
Příklad: kompletní VRML soubor Každý VRML soubor začíná hlavičkou. #VRML říká ze se jedná o VRML soubor. V2.0 udává verzi VRML používanou v tomto souboru, následuje kódování souboru - může být použito ascii nebo utf8.
#VRML V2.0 utf8 Shape { geometry Cone { bottomRadius 0.75 height 1.6 } appearance Appearance { material Material { diffuseColor 1 0 0 } } }
Za hlavičkou se mohou objevovat uzly (nodes), prototypy (prototypes), routy (routes). Jednotky rozměrů jsou brány jako metry a úhly nejsou měřeny ve stupních, ale v radiánech. Veškeré viditelné objekty jsou definované v uzlu Shape. Parametr appearance se používá pro nastavení barvy a textury a dalších vlastností geometrického objektu určeného parametrem geometry. Appearance je volitelný, když není definovaný, tak se použije výchozí hodnota. Zde je výsledek, který získáme (na linuxu s použitím programu FreeWRL) spuštěním z příkazové řádky $freewrl sample.wrl:
Skládání základních těles Všechny složité světy jsou sestaveny z výše jmenovaných jednoduchých těles. K tomu je potřeba tato základní tělesa skládat do větších celků. K tomu se ve VRML používají následující uzly: group - slouží jen k seskupení několika těles (uzlů typu Shape, případně jiných group či transform uzlů). Tato tělesa tvoří prvky pole children, které je parametrem uzlu group. transform - funguje jako group, navíc ale umožňuje transformaci objektu nebo seskupených objektů, a to změnu měřítka, rotaci a posunutí. Tyto transformace se
provádějí v uvedeném pořadí, při požadavku na jiné pořadí transformací je nutné zanořit několik uzlů transform do sebe. inline - slouží pro vkládání externích souborů identifikovaných svým url. Prostřednictvím konstrukce DEF jméno deklarace je možné blok (například těleso) pojmenovat a prostřednictvím zápisu USE jméno takový blok znovu použít.
Textury Textury lze zadávat pomocí pole barev pixelů (dělat to ručně je ovšem nepředstavitelná práce), pomocí obrázků (png, jpeg nebo gif) nebo pomocí videosouborů (mpeg, gif). Textury nahrazují vlastnost diffuseColor u daného materiálu. Mohou být také transparentní. ImageTexure { url [ ] repeatS TRUE repeatT TRUE }
# textura zadaná pomocí obrázku # zdroj obrázku # jestli se má opakovat svisle # jestli se má opakovat vodorovně
Světla Ve VRML existuje několik druhů světel: Avatarova
baterka: světelný zdroj, který osvětluje scénu z aktuáního pohledu avatara (kamery), chová se jako DirectionalLight. DirectionalLight:
nemá definovanou žádnou polohu, jen směr, chová se jako zdroj světla umístěný daleko od modelovaného světa, podobně jako Slunce od Země. PointLight:
je světlo umístěné v modelovaném světě. Od jeho umístění se paprsky šíří do všech směrů. Chová se podobně jako žárovka. SpotLight:
chová se podobně jako PointLight, až na to, že směr šíření je omezen jako
u reflektoru. VRML bohužel neumí pracovat se stíny. Světlo osvětluje jen objekty, jenž jsou definovány v uzlech, které jsou sourozenci a potomci sourozenců definovaného světla (tak lze ale zařídit, aby lampička v pokoji neosvětlovala místnosti ve sklepě). Počet zdrojů světla může být technicky omezený (na typicky 8 současně svítících zdrojů světla) - další zdroje světla se buď nezobrazují, nebo je scéna vykreslována bez HW podpory (tedy neúnosně pomalu). Pomocí skriptování je ale možné světla vypínat a zapínat.
Zvuk Ve VRML lze nastavit také zdroje zvuku, a to pomocí uzlu Sound a vnořeného uzlu AudioClip. AudioClip definuje stopu, která má hrát a také její vlastnosti (jestli se má opakovat ve smyčce, kdy začít, kdy zkončit, zdrojový soubor a případně i popis). AudioClip je hodnotou parametru source uzlu Sound, který určuje umístění zdroje zvuku ve VRML světě a jeho další vlastnosti - oblast, ve které bude zvuk slyšet, útlum... VRML podporuje jen zvuky ve formátu wav v kódování PCM. Vetšina prohlížečů však umí také formát mp3, ačkoliv to není zcela v souladu se standardem. Veškeré zvuky jsou mono a do sterea se přepočítávají podle vzájemné polohy avatara a zdroje zvuku.
Prototypy Prototypy jsou předdefinované objekty nebo kousky virtuálního světa. Svou
myšlenkou odpovídají procedurám v programovacích jazycích - samotný prototyp se na scéně neobjeví, ale lze ho do scény opakovaně vkládat. Může mít parametry, podle kterých se změní jeho vlastnosti. Tím se také liší od výše popsané konstrukce DEF. Prototypy mohou být i externí, uložené v samostatném wrl souboru - knihovně. Ne úplně prakticky je ale třeba do všech souborů, v nichž bude prototyp použit, znovu opisovat jeho hlavičku.
Speciální uzly Kromě již zmíněných typů uzlů existuje ve VRML i několik zvláštních typů uzlů: Background - definuje pozadí scény. Sám o sobě umí až dva gradienty (obloha a země) a šest stěn nekonečně veliké krychle kolem světa. Obě možnosti pozadí lze kombinovat. Fog - mlha, která určuje viditelnost ve VRML světě. LOD - Level of detail - speciální uzel, který pro jednotlivé objekty skutečného světa umožní definovat několik VRML reprezentací. Ty se pak používají podle vzdálenosti objektu od pozorovatele. Billboard - plocha, zpravidla otexturovaná, orientovaná vždy kolmo na pozorovatele. Používá se především kvůli nenáročnosti na rychlost zobrazení. WorldInfo - informace o světě - místo určené k podpisu autora scény.
Dynamické akce Základním schématem dynamických akcí je senzor -> logika -> časovač -> engine -> target Senzory jsou schopné detekovat nějakou událost a předat o ní informaci. Ve VRML jsou k dispozici následující senzory: ●
anchor - odkaz jinam do scény
●
CylinderSensor - manipulace kroucením
●
PlaneSensor - manipulace posouváním
●
SphereSensor - manipulace otáčením
●
TouchSensor - detekce dotyku (kliknutí)
●
Collision - detekce kontaktu s avatarem
●
ProximitySensor - detekce přítomnosti avatara
●
VisibilitySensor - detekce viditelnosti objektu
Úkolem logiky je vyhodnotit, zda na základě impulsu od senzoru provést nějakou akci či nikoliv. K tomu je ve VRML nutné použít skriptování, které bude popsáno později. Časovač (TimeSensor) generuje informace o probíhajícím čase a řídí tak průběh animace nebo jiné dynamické uálosti.
Engine převádí informaci o čase (float 0.0 až 1.0) na hodnoty použitelné jako úhel, poloha atd. Ve VRML je definováno několik lineárních interlolátorů, další engine je možné naskriptovat. ●
ScalarInterpolator - změna měřítka
●
ColorInterpolator - změna barvy
●
OrientationInterpolator - změna orientace
●
PositionInterpolator - změna polohy (po lomené čáře)
●
CoordinateInterpolator
●
NormalInterpolator
Target - cíl dynamické akce - může být jakákoliv rozumná vlastnost nějakého objektu, kterou lze nastavovat, například úhel otočení hodinové ručičky. Jednotlivé elementy podílející se na dynamické akci se propojují deklarací ROUTE. Na následujícím příkladě spustí kliknutí na Senzor časovač, který je propojen s interpolátorem, který otáčí NejakymObjektem. ROUTE Senzor.touchTime TO Casovac.startTime ROUTE Casovac.fraction_changed TO Interpolator.set_fraction ROUTE Interpolator.value_changed TO NejakyObjekt.rotation
Senzory CylinderSensor, PlaneSensor a SphereSensor mohou být routovány přímo na target (senzor -> target) a umožit tak měnit přímo orientaci nebo polohu nějakého objektu. Těmto třem senzorům se při tomto použití říká též manipulátory. Ve VRML 2.0 může skoro každý uzel přijímat i vysílat informace o událostech, což ve verzi 1.0 nešlo. Uzel vyšle událost při změně objektu, pokud se s tímto objektem nějak manipuluje, přesouvá, mění jeho viditelnost a podobně. Událostí může být jakákoliv typovaná hodnota. Pro lepší pochopení další kapitoly ještě osvětlíme, jak je to přesně s parametry uzlů: Ty mohou být jednoho ze tří typů:
eventIn: lze použít jako cíl pro událost (například set_fraction u interpolátoru)
eventOut: lze použít jako zdroj události (například touchTime u TouchSensoru)
exposedField: lze použít oběma způsoby (typicky všechny parametry jako poloha, úhel, barva)
Skriptování Skripty ve VRML se zapisují do uzlu script a píší se v jazyce ECMAScript, což je jiný název pro JavaScript, který se ve VRML používá z formálních a historických důvodů. Vlastní script může být buď součástí wrl souboru, nebo může být připojen jako externí javascriptový soubor. Kromě použití pro dynamické akce (logika, engine) a manipulace s uzly scény je možné nascriptovat také interakci s prohlížečem nebo síťovou komunikaci. Následující příklad ukazuje použití scriptu pro výpočet rotace a vysunutí hydraulického pístu podle dané rotace ramena bagru:
DEF SkriptPist Script { eventIn SFRotation rotaceRamena eventOut SFRotation rotacePistu eventOut SFVec3f vysunutiPistu url "javascript: function rotaceRamena(value, time) { x1 = Math.sin( value[3]-.472 )*1.25 + .61; y1 = Math.cos( value[3]-.472 )*1.25 - .06; uhelPistu = Math.atan( x1/y1 ); posunPistu = Math.sqrt( (x1)*(x1) + (y1)*(y1) )/2; rotacePistu = new SFRotation(0, 0, 1, uhelPistu-1.6); vysunutiPistu = new SFVec3f(0, .45+posunPistu, 0); } " }
External Authoing Interface EAI je rozhraní mezi VRML a programovacím jazykem, například ve webovém prostředí používanou Javou. Prostřednictvím tohoto rozhraní je možné z programovacího jazyka manipulovat s uzly ve scéně a posílat, číst a odposlouchávat události, které ve scéně probíhají.
X3D Zkratka X3D znamená Extensible 3D a je označením pro nástupce jazyka VRML. Oproti v tomto referátu popsanému VRML nabízí především více formátů pro popis scény (XML syntaxe, VRML syntaxe nebo binární formát). Dále definuje různé profily a rozšíření přinášející novou funkcionalitu. Také X3D je dnes již ISO standardem.
Odkazy Detekce VRML / X3D pluginu v prohlížeči http://cic.nist.gov/vrml/vbdetect.html Prof. Ing. Jiří Žára: VRML 97 – Laskavý průvodce virtuálními světy http://www.cgg.cvut.cz/LaskavyPruvodce Pavel Tišnovský: seriál o VRML http://www.root.cz/clanky/vrml-jazyk-pro-popis-virtualni-reality Specifikace návrhu http://www.vrml.org/WorkingGroups/vrml-eai/Specification International Standard ISO/IEC 14772-1:1997 http://www.web3d.org/x3d/specifications/vrml/ISO-IEC-14772-VRML97/ Wikipedia.org http://en.wikipedia.org/wiki/VRML