Hlavní navigace

VRML: jazyk pro popis virtuální reality

8. 11. 2007
Doba čtení: 10 minut

Sdílet

V dnešním článku o grafických formátech se začneme zabývat jazykem VRML, což je jazyk určený pro popis trojrozměrných scén i aktivních objektů použitých v aplikacích virtuální reality. VRML se však postupem času stal i formátem často používaným pro přenos trojrozměrných dat mezi různými aplikacemi.

Obsah

1. Grafické formáty určené pro popis trojrozměrných scén a virtuální reality
2. Způsob zápisu prostorové scény ve VRML
3. Datové typy podporované ve VRML 1.0
4. Typy uzlů definovaných ve standardu VRML 1.0
5. Uzly definované v novějších standardech
6. Ukázka další 3D scény zapsané pomocí VRML
7. Odkazy na další informační zdroje
8. Obsah dalšího pokračování tohoto seriálu

1. Grafické formáty určené pro popis trojrozměrných scén a virtuální reality

V předchozích částech tohoto seriálu jsme se zabývali grafickými formáty, které byly určeny především pro popis rastrových obrázků, tj. bitmap, pixmap (šlo o formáty GIF, PNG, BMP, TGA, PCX, JPG a ICO) a také dvourozměrných vektorových objektů (prozatím jsme si popsali formáty HPGL, DXF, SLD, SVG, WMF, EMF a jazyk PostScript). Jedinou výjimkou z tohoto seznamu byl vektorový formát DXF, který lze použít jak pro ukládání plošných výkresů, tak i pro trojrozměrné modely reprezentované pomocí polygonů. Dnes si řekneme základní informace o jazyce VRML, který byl navržen především pro popis trojrozměrných scén obsahujících aktivní i pasivní objekty, použité například v aplikacích virtuální reality. Nejedná se samozřejmě o jediný formát (či jazyk) této kategorie, dnes se například poměrně razantním způsobem prosazuje formát X3D, který lze chápat jako ideového nástupce VRML a v minulosti si prakticky každá firma vytvářející 3D aplikace navrhla vlastní formát, ovšem doposud se z grafických formátů a deklarativních jazyků určených pro popis virtuální reality nejvíce rozšířil právě jazyk VRML, neboli Virtual Reality Modeling Language.

6301

Tento jazyk, který je mimochodem definován i normou ISO, se používá pro popis jednotlivých prostorových těles i celých rozsáhlých scén v aplikacích virtuální reality a také (i když v menší míře, než jeho tvůrci pravděpodobně předpokládali) na Internetu, kde slouží jako přenosový prostředek pro data popisující trojrozměrné modely. Prostorová tělesa lze v tomto formátu popsat pomocí seznamu souřadnic vrcholů a plochami specifikovanými indexy svých vrcholů do seznamu vrcholů – ve skutečnosti se jedná o poměrně úsporný způsob zápisu, především v porovnání s přímým zápisem vrcholů polygonů (většinou jsou vrcholy a hrany společné pro více polygonů). Pro základní geometrická tělesa, mezi něž patří krychle, koule, kužel apod., i pro objekt typu text jsou definována vlastní klíčová slova reprezentující uzly modelu, takže je není nutné rozkládat na trojúhelníky, což by bylo prostorově náročné a při přenosu modelů po Internetu i pomalé. Rozklad na trojúhelníky je ponechán na prohlížeči VRML, který musí spolupracovat s grafickým akcelerátorem, například přes API grafické knihovny OpenGL. Také je podporováno texturování, tělesa lze dokonce potáhnout texturou uloženou ve formě videa.

Tento formát ideově vychází z formátu používaného v Open Inventoru, o kterém vyšel na Rootu seriál (viz odkazy), takže je možné tvořit hierarchické stromové struktury těles a měnit vlastnosti (transformace, barvu, texturu apod.) pro každou větev stromu zvlášť. Zvláště výhodná je tato reprezentace při interaktivní změně některých parametrů, například posunu celého složitého modelu. V nových verzích tohoto formátu, konkrétně od VRML 2.0, je dokonce možné specifikovat animace a programovat reakce na různé události, takže se z na první pohled běžného souborového formátu stává celá platforma pro virtuální realitu. Soubory typu VRML, jež mají většinou koncovku .wrl (popř. po komprimaci koncovku .wgz), jsou textové, takže je možné je upravovat běžnými textovými editory, posílat je přes filtry, spojit více souborů (a tím i reprezentovaných modelů) do jednoho (s vymazáním hlaviček druhého či dalšího připojovaného souboru) atd. Samotný export do VRML je velmi jednoduchý, proto se z tohoto formátu stává prostředek pro komunikaci mezi různými 3D editory, renderovacími programy a prohlížeči 3D modelů.

6302

2. Způsob zápisu prostorové scény ve VRML

Ve VRML je celá trojrozměrná scéna popsaná pomocí objektů, které jsou hierarchicky uspořádány ve stromové struktuře. V tomto ohledu se VRML podobá již zmiňovanému Open Inventoru. Ukazuje se, že stromová struktura je pro popis 2D i 3D scén ideální, protože se možné jednoduše manipulovat jak s jednotlivými objekty, tak i s celými skupinami objektů. Představme si například jednoduchý model auta. Ten se bude skládat z pěti objektů – čtyř kol a karoserie. Pro některé operace je vhodné uvažovat o autu jako o samostatném a nedělitelném objektu (posun auta ve scéně, zatáčení, řešení kolizí apod.), ovšem pro operace jiné například potřebujeme manipulovat s jednotlivými koly (otáčení). Pomocí stromové struktury lze tuto hierarchii vytvořit velmi jednoduše. Pro operace, které pracují s objekty vybíranými na základě jiných kritérií, než je jejich hierarchie, lze použít pojmenování objektů. Podrobnosti si ukážeme v navazujících částech tohoto seriálu.

6303

Samotný formát souborů uložených ve VRML je založen na textovém popisu scény. Ve VRML 1.0 se texty zapisují pomocí ASCII kódování, ale v dalších verzích je již možné použít populární kódování UTF-8. Na prvním řádku souboru se nachází hlavička začínající znakem # (což je ve všech ostatních řádcích počáteční znak poznámky), za kterým následuje verze VRML a způsob kódování. Pokud se vám poštěstí narazit na soubory určené pro Open Inventor (například jde o výstup z 3D skenerů Minolta Vivid), které nelze v běžných prohlížečích zobrazit, většinou pomůže přepis prvního řádku na sekvenci #VRML V1.0 ascii, protože jinak se tyto soubory s velikou pravděpodobností nebudou lišit. Celá stromová struktura 3D scény je reprezentovaná uzly zapisovanými způsobem „jméno_uzlu {vnitřní obsah}“. Uvnitř uzlu se samozřejmě mohou nacházet další uzly a také atributy uzlů, což jsou číselné, řetězcové, pravdivostní a další hodnoty, které určují například tvar objektů. Pomocí uzlu pojmenovaného příhodně Separator a Group lze uzly sdružovat.

Na níže uvedené ukázce je patrné, že je syntaxe VRML inspirovaná jazyky C-čkové větve. Nejedná se pouze o programovací jazyky, například i formát pro POVRay má podobnou strukturu. Osobně se mi způsob zápisu použitý ve VRML v mnoha případech zdá vhodnější, než „alternativní“ zápis pomocí XML (viz formát X3D), protože i jednoduché textové editory dokážou dohledat párové složené závorky, ale u XML značek je již zapotřebí použít sofistikovanější algoritmy (nehledě na úspornost zápisu závorek oproti značkám). Nicméně je pravda, že XML je dnes podporován v mnoha aplikacích i knihovnách a z hlediska budoucího vývoje se pravděpodobně více rozšíří formáty založené právě na tomto značkovacím jazyku.

#VRML V1.0 ascii
Separator {
    DirectionalLight {  # nastavení osvětlení
        direction 0 0 -1
    }
    PerspectiveCamera { # nastavení pozorovatele (kamery)
        position       -8.6 2.1 5.6
        orientation    -0.1352 -0.9831 -0.1233  1.1417
        focalDistance  10.84
    }
    Separator {   # červená koule
        Material {
            diffuseColor 1 0 0
        }
        Translation {
            translation 3 0 1
        }
        Sphere {
            radius 2.3
        }
    }
    Separator {  # zelená krychle
        Material {
            diffuseColor 0 0 1
        }
        Transform {
            translation -2.4 .2 1
            rotation 0 1 1  .9
        }
        Cube {}
    }
} 

3. Datové typy podporované ve VRML 1.0

Při zápisu atributů objektů (3D modelů, světel, kamery apod.) nebo celých skupin objektů se používá několik datových typů. Ve VRML 1.0 je možné pracovat celkem se šestnácti datovými typy, přičemž každý typ atributu vyžaduje jiný datový typ; například nemá smysl popisovat rotaci booleovskou hodnotou nebo jednoduchý atribut, zda válec obsahuje podstavu, zapisovat místo booleovské hodnoty maticí či vektorem. Datové typy podporované ve VRML 1.0 jsou vypsány v následující tabulce. V dalších částech tohoto seriálu si ukážeme i práci s dalšími datovými typy, které byly zavedeny ve vyšších verzích VRML.

Označení Poznámka
SFBitMask pouze hodnoty 0 a 1
SFBool hodnoty true a false
SFColor zápis barvy ve formátu RGB
SFEnum interně se jedná o celé číslo
SFFloat IEEE float
SFImage pixmapa
SFLong celočíselná hodnota
SFMatrix matice (většinou transformační)
SFRotation rotace zadaná čtyřmi hodnotami
SFString ve VRML 1.0 většinou ASCII
SFVec2f 2D vektor
SFVec3f 3D vektor
MFColor vektor více barev
MFLong vektor více celočíselných hodnot
MFVec2f vektor 2D vektorů
MFVec3f vektor 3D vektorů

4. Typy uzlů definovaných ve standardu VRML 1.0

Ve VRML 1.0 je definováno celkem 36 typů uzlů, které je možné rozdělit do několika skupin. V první skupině se nachází uzly, které slouží především pro popis geometrie objektů, tj. jejich povrchu (pro mnoho aplikací jsou důležité právě tyto informace). Druhá skupina slouží pro úpravu vlastností objektů či textur. Ve třetí skupině se nachází uzly, pomocí nichž se popisují transformace, čtvrtá skupina obsahuje dva typy uzlů pro vytváření kamer (pozorovatelů) a pátá skupina obsahuje uzly určené pro definici světelných zdrojů. Do další skupiny patří uzly, pomocí nichž se 3D scéna hierarchizuje do stromové struktury a konečně je v poslední skupině pouze jeden typ uzlu pro vytvoření možnost vytvoření hypertextových odkazů a jejich cílů. Následuje výpis názvů jednotlivých typů uzlů rozdělených do skupin. V dalších částech tohoto seriálu si samozřejmě jednotlivé typy uzlů popíšeme podrobněji, včetně demonstračních příkladů a ukázek vytvořených trojrozměrných scén:

4.1 Popis geometrie objektů

AsciiText
Cone
Cube
Cylinder
IndexedFaceSet
IndexedLineSet
PointSet
Sphere

4.2 Vlastnosti objektů

Coordinate3
FontStyle
Info
LOD
Material
MaterialBinding
Normal
NormalBinding
Texture2
Texture2Transform
TextureCoordinate2
ShapeHints

4.3 Transformace

MatrixTransform
Rotation
Scale
Transform
Translation

4.4 Vytvoření pozorovatele (kamery)

OrthographicCamera
PerspectiveCamera

4.5 Vytvoření světelného zdroje

DirectionalLight
PointLight
SpotLight

4.6 Definice hierarchie objektů

Group
Separator
Switch
TransformSeparator
WWWAnchor

4.5 Speciální uzel

WWWInline

5. Uzly definované v novějších standardech

VRML ve své první verzi (1.0) je poměrně chudý jazyk, zejména se to týká způsobu definic objektů, které tvoří aktivní předměty v aplikacích virtuální reality (typickým objektem mohou být dveře, které je možné interaktivně otevírat a zavírat, složitějším objektem pak avatar, tj. objekt představující člověka vstupujícího do virtuální reality). Tyto typy objektů jsou podporovány v dalších verzích jazyka VRML spolu se způsobem definice spouštěčů událostí. U výše zmíněných dveří by například stačilo nadefinovat dva spouštěče – každý by se aktivoval při doteku kliky. Na vnitřní klice by spouštěč nastartoval animaci otevření dveří a na opačné straně by se naopak spustila animace zavírání dveří. Lze si samozřejmě představit i složitější typy spouštěčů a událostí, které mohou při jejich aktivaci nastat.

6. Ukázka další 3D scény zapsané pomocí VRML

Následuje ukázka složitější trojrozměrné scény s objektem, který je složený z plošek. To je rozdíl oproti scéně ukázané ve druhé kapitole, kde byly použity geometrické objekty typu krychle či koule, u kterých se zapisovaly pouze základní parametry (orientace, poloměr) a nikoli jednotlivé plošky tvořící jejich povrch. Také u uzlů představujících světla a materiály je použito více atributů, kdežto v předchozí scéně bylo mnoho atributů ponecháno na své přednastavené hodnotě. Zdrojový soubor s definicí trojrozměrné scény uložené ve formátu VRML 1.0 má tvar:

#VRML V1.0 ascii
Separator {
    ShapeHints {
        vertexOrdering UNKNOWN_ORDERING
        shapeType UNKNOWN_SHAPE_TYPE
        faceType CONVEX
        creaseAngle 30.0
    }
    DirectionalLight {
        direction 1.0 2.0 3.0
        intensity 0.75
    }
    DirectionalLight {
        direction 3.0 -2.0 -1.0
        intensity 0.75
    }
    Separator {
        Material {
            diffuseColor 0.600000 0.200000 0.200000
            shininess 0.75
            specularColor 1.0 1.0 1.0
        }
        Coordinate3 {
            point [
                0.053033 0.000000 0.053033,
                0.074999 0.000000 0.000000,
                0.053033 0.000000 -0.053033,
                0.000000 0.000000 -0.074999,
                -0.053033 0.000000 -0.053033,
                -0.074999 0.000000 0.000000,
                -0.053033 0.000000 0.053033,
                0.000000 0.000000 0.074999,
                0.053033 1.000000 0.053033,
                0.074999 1.000000 0.000000,
                0.053033 1.000000 -0.053033,
                0.000000 1.000000 -0.074999,
                -0.053033 1.000000 -0.053033,
                -0.074999 1.000000 0.000000,
                -0.053033 1.000000 0.053033,
                0.000000 1.000000 0.074999
            ]
        }
        MaterialBinding {
            value OVERALL
        }
        IndexedFaceSet {
            coordIndex [
                0, 8, 9, 1, -1,
                1, 9, 10, 2, -1,
                2, 10, 11, 3, -1,
                3, 11, 12, 4, -1,
                4, 12, 13, 5, -1,
                5, 13, 14, 6, -1,
                6, 14, 15, 7, -1,
                7, 15, 8, 0, -1
            ]
        }
    }
} 

7. Odkazy na další informační zdroje

  1. Dr. Clue's VRML reference V2.0
    (dokument ve formátu WinHelp)
  2. Gavin Bell, Anthony Parisi, Mark Pesce: The Virtual Reality Modeling Language, Version 1.0 Specification,
    Silicon Graphics Inc., Intervista Software
    26-MAY-95
  3. Graef, G.L.: „Graphics Format“,
    Graphics Format
  4. Sládeček Hynek a kolektiv: „1000 File Formats“,
    (freeware encyklopedie – hypertextový dokument ve formátu HLP), 1997, 1998
  5. Žára J., Beneš B., Felkel P.: „Moderní počítačová grafika“,
    Computer Press, Praha, 1998, ISBN 80–7226–049–9
  6. Žára J., Limpouch A., Beneš B., Werner T.: „Počítačová grafika – principy a algoritmy“,
    Grada, 1992
  7. Wikipedia: VRML,
    http://en.wiki­pedia.org/wiki/Vrml
  8. Wikipedia: Open Inventor,
    http://en.wiki­pedia.org/wiki/O­pen_Inventor
  9. Wikipedia: Web 3D Consortium,
    http://en.wiki­pedia.org/wiki/Web3D_Con­sortium
  10. Wikipedia: List of vector graphics markup languages,
    http://en.wiki­pedia.org/wiki/Lis­t_of_vector_grap­hics_markup_lan­guages
  11. The Virtual Reality Modeling Language Specification,
    Version 2.0, ISO/IEC WD 14772
    http://graphcom­p.com/info/spec­s/sgi/vrml/spec/
  12. VRML 97 Specification,
    http://www.web3d­.org/x3d/conten­t/examples/Ba­sic/Vrml97Spe­cification/in­dex.html
  13. VRML Tutorial,
    http://www.lig­hthouse3d.com/vrml/tu­torial/
  14. Web 3D Consortium,
    http://www.web3d­.org/
  15. X3D Specification,
    http://www.web3d­.org/x3d/speci­fications/
  16. Onyx Graphics VRML Development,
    http://onyxgrap­hics.com/VRML­.html
  17. Open InventorTM,
    http://oss.sgi­.com/projects/in­ventor/
  18. VRML (Virtual Reality Modeling Language) and X3D,
    http://xml.co­verpages.org/vrml-X3D.html
  19. Root.cz: Seriál Open Inventor,
    /serialy/open-inventor/
  20. Root.cz: Seriál Grafická knihovna OpenGL,
    /serialy/graficka-knihovna-opengl/

8. Obsah dalšího pokračování tohoto seriálu

V následující části seriálu o grafických formátech a metaformátech si ukážeme způsob zápisu složitějších modelů popsaných v jazyce VRML. Také se budeme věnovat způsobům úpravy optických vlastností povrchů těles, tj. definicemi materiálů a nakonec práci se světly.

Autor článku

Pavel Tišnovský vystudoval VUT FIT a v současné době pracuje ve společnosti Red Hat, kde vyvíjí nástroje pro OpenShift.io.