Soukromá vyšší odborná škola a Obchodní akademie s. r. o.

Obor: Výpočetní technika a základy programování

 

 

 

 

 

 

 

 

 

JAZYK VRML

Absolventská práce

 

 

 

 

 

 

 

 

 

vedoucí diplomové práce

PaedDr. Petr Pexa

 

Martin Šik, České Budějovice 2000

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Anotace:

V této práci jsou popsány základy jazyka VRML, používaného ke tvorbě trojrozměrných světů virtuální reality na Internetu.

Jsou zde popsány všechny objekty tohoto světa i s jejich parametry. Většina objektů je také doplněna ukázkovými příklady.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Je mou milou povinností poděkovat na tomto místě PaedDr. Petru Pexovi za spolupráci, cenné rady, podnětné připomínky, které mi pomohli při vypracování této práce. Dále bych chtěl poděkovat své rodině a přátelům, za odborné rady při psaní této práce.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Prohlašuji, že jsem absolventskou práci na téma Jazyk VRML vypracoval samostatně a použil jsem jen pramenů, které cituji a uvádím v seznamu použité literatury.

V Českých Budějovicích dne 12.5. 2000

Martin Šik

Obsah

  1. 1 Historie VRML *

    2 Základní vlastnosti VRML *

    2.1 Hierarchická struktura scény *

    2.2 Struktura VRML souboru *

    3 Atributy *

    3.1 Typy atributů *

    4 Geometrická tělesa *

    4.1 Box *

    4.2 Cone *

    4.3 Cylinder *

    4.4 Sphere *

    4.5 ElevationGrid *

    4.6 Extrusion *

    4.7 IndexedFaceSet *

    4.8 IndexedLineSet *

    4.9 PointSet *

    5 Povrch geometrických těles *

    5.1 Material *

    5.2 Uzly pro nanášení textur *

    5.3 ImageTexture *

    5.4 MovieTexture *

    5.5 PixelTexture *

    5.6 TextureCoordinate *

    6 Text ve VRML *

    6.1 Text *

    6.2 FontStyle *

    7 Vázané uzly *

    7.1 Background *

    7.2 Fog *

    7.3 NavigationInfo *

    7.4 Viewpoint *

    8 Dynamické uzly *

    8.1 Senzory okolo uživatele *

    8.2 Senzory reagující na myš *

    8.3 TimeSensor *

    8.4 VisibilitySensor *

    8.5 TouchSensor *

    9 Závěr *

  2. Úvod

    Absolventská práce na téma Jazyk VRML pojednává o novém jazyce, který je úzce spojen se světem Internetu, WWW prohlížečů a virtuálního trojrozměrného světa. Pomocí tohoto jazyka může každý běžný uživatel osobního počítače připojeného k  Internetu procházet městem nebo zahradou či zemí, která se mohla zrodit ve fantazii někoho jiného nebo se jedná o model skutečné krajiny. Touto cestou si možná budeme vybírat za několik let dovolenou u své cestovní kanceláře nebo si podle návodu v jazyce VRML smontujeme skříň zakoupenou, v nesloženém stavu, ve virtuálním obchodě.

    Internet je celosvětová síť počítačů, do níž je připojeno stále více počítačů nejen u nás, ale i po celém světě. Řadou vlastností, pro které si získal oblibu na celém světě, lze Internet považovat za fenomén dnešní doby. Nabízí mnoho služeb mezi nimiž jsou elektronická pošta, přenos souborů, vzdálený přístup, poslech rádia, sledování televize, nákupy a téměř neomezený přístup k informacím všeho druhu. A nyní Vám chce otevřít brány do světa třetího rozměru pomocí VRML. Tato absolventská práce by svému čtenáři měla poskytnout jakýsi klíč ke vstupu do tohoto světa a naučit ho znát, jak svět pracuje a především jej zasvětit do tajů vytváření těchto světů.

    Pro tuto diplomovou práci jsou klíčová služba World Wide Web nebo také www, w3 či web, která je jednou z nejjednodušších dostupných systémů.

    Cílem diplomové práce je popis jazyka VRML, který využívá již zmiňovaný web. Tato práce se snaží zachytit jazyk VRML od prvních a jednoduchých tvarů a těles, přes složitější objekty a jejich povrchy, až k senzorům, které zajišťují dynamičnost virtuálního světa.

    Kvůli lepší přehlednosti jsou klíčová slova a příkazy průběžně zvýrazňovány odlišným písmem. Tato práce obsahuje základní informace s několika plně funkčními příklady pro ilustraci možností tohoto jazyka. Nedílnou součástí této práce je i CD–ROM s příklady a příslušným prohlížečem. CD–ROM také obsahuje absolventskou práci ve formátu HTML.

  3. Historie VRML

První zmínky o jazyku VRML můžeme zpozorovat již v 80. letech. Místem, kde historie tohoto jazyka začínala, byla dílna rodící moderní prostorovou grafiku, Silicon Graphics, Inc. Ta počátkem 80. let navrhla knihovnu pro práci s prostorovými objekty, nazvanou Inventor. Byla to následnice známé a úspěšné základní grafické knihovny GL. Počátkem let devadesátých došlo k inovaci a vznikla nová základní grafická knihovna s názvem OpenGL, jež se dnes hojně využívá v herním průmyslu. Ke knihovně OpenGL přibyla i nová aplikační knihovna OpenInventor. Právě tato knihovna se stala jakýmsi základním stavebním kamenem samotného jazyka VRML.

Prvopočátky VRML můžeme spojovat s jarem roku 1994. Na první World Wide Web (WWW) konferenci v Ženevě. Tim Berners–Lee a Dave Ragget zde zorganizovali zasedání nazvané Birds–of–a–Feather (BOF) týkající se virtuální reality spojené s WWW. Účastníci se shodli na potřebě vytvořit určité nástroje, které by umožňovaly uživatelům a tvůrcům WWW stránek pracovat s trojrozměrnými objekty. Každá stránka by tak mohla obsahovat dvojrozměrné informace (tabulky, obrázky…) vytvořené pomocí HTML a nově také informace trojrozměrné (koule, krychle, světla…) popsané nějakým novým jazykem. Tím se právě měl stát jazyk VRML.

Na podzim roku 1995 předkládá firma Silicon Graphics definici formátu VRML 1.0, který je rozšířením formátu OpenInventor o možnosti využívání prostorových dat ze sítě Internet, konkrétně v prostředí WWW.

Pro srovnání uvádím zdrojové kódy. První zapsaný pomocí formátu OpenInventor a druhý zapsaný ve formátu VRML 1.0. Výsledná scéna je zobrazena na obrázku O–1.

#Inventor V2.0 ascii

Separator {

Separator {

Material { emissiveColor 0.0 0.3 0.3 }

Separator {

Translation { translation 10.0 0 0 }

Sphere { radius 0.3 }

Cube { height 0.3

depth 10.0

width 0.3

}

}

Separator {

Material { emissiveColor 0.3 0.3 0.0 }

Rotation { rotation 1.0 1.0 0 0.78 }

Cylinder { height 1.0

radius 3.0

}

}

}

}

#VRML V1.0 ascii

Separator {

Separator {

Material { emissiveColor 0.0 0.3 0.3 }

Separator {

Translation { translation 10.0 0 0 }

Sphere { radius 0.3 }

Cube { height 0.3

depth 10.0

width 0.3

}

}

Separator {

Material { emissiveColor 0.3 0.3 0.0 }

Rotation { rotation 1.0 1.0 0 0.78 }

Cylinder { height 1.0

radius 3.0

}

}

}

}

Obrázek O–1: Vzorová scéna

Současně se vznikem VRML 1.0 je založena nezávislá skupina programátorů a návrhářů, nazvaná WAG (VRML Architecture Group). WAG si dala za cíl vybudovat veřejně známý, plně interaktivní standard, který by popisoval trojrozměrné virtuální světy. Členy skupiny tvořily osobnosti jako Gavin Bell (ACM), Brain Blau (Intervista), Rikk Carey (Best), John Marby (Microsoft), Tony Parisi (Intervista) a Mark Pesce (Netcom) a další.

Tato skupina stanovuje tři základní milníky potřebného budoucího vývoje jazyka VRML:

  1. nástroje pro popis statických světů (v dané chvíli pokryto formátem VRML 1.0)
  2. nástroje pro popis dynamických světů (nejbližší cíl)
  3. nástroje pro spolupráci více uživatelů ve virtuálním prostředí (vzdálenější cíl)

Skupina WAG oslovuje všechny významné tvůrce systémů pro virtuální realitu, tak i internetovou veřejnost a odborníky na počítačovou grafiku s výzvou k vytvoření specifikace budoucího jazyka VRML 2.0.

A takto vypadá scéna z obrázku O–1 zapsaná pomocí formátu VRML 2.0:

#VRML V2.0 utf8

Transform {

children [

Transform {

translation 10 0 0

children [

Shape {

appearance Appearance {

material Material {emissiveColor 0 0.3 0.3}

}

geometry Sphere {

radius 0.3

}

}

Shape {

appearance Appearance {

material Material {emissiveColor 0 0.3 0.3 }

}

geometry Box {

size 0.3 0.3 10

}

}

]

}

Transform {

rotation 1.0 1.0 0.0 0.8

children [

Shape {

appearance Appearance {

material Material {emissiveColor 0.3 0.3 0 }

}

geometry Cylinder {

radius 3

height 1

}

}

]

}

]

}

V dubnu roku 1996 je vybrána z osmi různých návrhů společná specifikace firem Silicon Graphics a Sony, která má pracovní název Moving Worlds. Tato specifikace se stává základem jazyka VRML 2.0. Je ve tvaru, který bude po dobu více jak jednoho roku upřesňován, modifikován a doplňován v otevřené diskusi probíhající průběžně na Internetu (www–vrml@vrml.org).

Z neformální skupiny WAG se tak stává oficiální sdružení VRML Consortium, Inc., které zahajuje spolupráci s mezinárodní standardizační organizací ISO na vzniku VRML v podobě mezinárodní normy. Ta nese pracovní název DIS 14772–1 a v dubnu roku 1997 získává jméno VRML 97. Po celý rok je upravována do podoby mezinárodně přijatelné normy ISO a
koncem roku je jazyk VRML oficiálně přijat za standard ISO s označením
ISO/IE
C 14772–1:1997.

  1. Základní vlastnosti VRML

VRML je jazyk, který dovoluje popsat skutečný svět téměř stejně věrohodně, jako ho vnímají lidské smysly. Tento skoro dokonalý model se nazývá virtuální realita. O VRML nehovoříme o virtuální realitě, ale o virtuálním světě, ve kterém se můžeme volně pohybovat všemi směry, prohlížet objekty ze všech stran, přemisťovat se z jednoho světa do druhého nebo pomocí různých tlačítek měnit tvary předmětů. Do tohoto umělého světa vstupujeme pomocí celosvětové sítě Internet, ke které jsme připojeni buď pevnou linkou nebo pomocí modemu a telefonní sítě. Samotné připojení by bylo samozřejmě zbytečné bez některého ze známých WWW (World Wide Web) prohlížečů, ať už Netscape a jeho Navigator nebo Microsoft a jeho Internet Explorer.

Tyto prohlížeče však ještě nezaručují možnost procházet virtuálními světy, jsou navrženy pro HTML stránky a jazyk VRML je jim cizí. Abychom naučili svůj počítač mluvit jazykem VRML, musíte si pořídit přídavný modul (plugin) do prohlížeče. Většina těchto modulů je volně přístupná na Internetu a distribuují se pod názvy Live3D nebo Cosmo Player, a to hned pro několik nejznámějších operačních systémů. Lze je dostat pro Windows 95, Windows 98, Windows NT 4.0, Irix, Solaris, Linux… Ovšem ne pro všechny operační systémy jsou názvy modulů vždy Live3D nebo Cosmo Player.

Pokud bychom se pohybovali v oblasti maximální abstrakce, potom lze o VRML říci, že je to pouze způsob, jakým se objekty čtou a zapisují do souboru. Tyto objekty by potom mohly obsahovat cokoliv, to znamená 3D entily (koule, válec, krychle…), geometrické transformace (posunutí, otočení…), zvukové pasáže, textury, světla atd.

Výhody VRML

Nevýhody VRML

    1. Hierarchická struktura scény
    2. Standard VRML 97 definuje množinu objektů pro vytváření trojrozměrných scén. Tyto objekty jsou definovány ve zvláštních strukturách zvané uzly (nodes), které jsou uspořádané do hierarchické struktury zvané strom (tree). Nejjednodušší strom tvoří jediný uzel. Tomuto uzlu říkáme kořen (root). Každý uzel může být propojen s několika dalšími uzly, kterým říkáme potomci (children). Naopak z pohledu potomků je předchozí uzel jejich rodičem (parent). Této situaci říkáme, že ve stromu vznikl cyklus. Celou scénu pak tvoří graf scény (scene graph), což je vlastně les stromů (graf složený z alespoň jednoho stromu). Každý strom v lese stromů je samostatný, na ostatních stromech nezávislý subjekt. Uzly v jednotlivých stromech spolu ale mohou komunikovat prostřednictvím událostí.

      Strom představuje mnohem více než pouhé seskupení uzlů. Tato struktura především určuje pořadí mezi uzly. Uzel, který je ve stromě dříve (rodič), může určovat vlastnost všech uzlů, které tvoří množinu všech jeho potomků.

    3. Struktura VRML souboru

Soubor VRML (přípona .wrl) se skládá z několika základních částí. První část tvoří hlavička, za ní následuje graf scény, definice prototypů a na samém konci souboru jsou umístěny směrovače (route) událostí (events).

Hlavička

Na začátku každého VRML souboru je hlavička:

#VRML V2.0 <typ kodovani> [pripadny komentar]

Je to jeden řádek textových informací oddělených pokud možno vždy jedinou mezerou. První položka stanoví, že jde o formát VRML, druhá udává verzi VRML, tedy verze dvě. Třetí důležitou položkou hlavičky je způsob kódování, typicky se používá utf8, což je vlastně zkratka pro kódování UTF–8 (jinak známé též pod názvem Unicode), které pro zápis základní sady znaků využívá běžným způsobem osm bitů, pro znaky národních abeced pak dvojice až šestice bajtů pro jeden znak. Vše, co následuje za třetí položkou, může být prohlížečem ignorováno.

Graf scény

V této části jsou uvedeny jednotlivé uzly popisující objekty a jejich vlastnosti. Aby byla zajištěna audiovizuální reprezentace objektů, je v této části také umístěna geometrie. Ta je hierarchicky děděna uzly synů toho kterého rodiče. Zde jsou také umístěny uzly podílející se na vysílání a řízení událostí.

Prototypy

Pomocí prototypů můžete rozšířit množinu uzlů o libovolný, vámi navržený uzel. Jeho definici můžete umístit buď přímo do souboru (PROTO), kterého se týkají, nebo ho můžeme odděleně zapsat do druhého souboru (EXTERNPROTO). Jestliže je umístěn v souboru VRML, může být v tělech jiných uzlů, nebo můžou být definovány pomocí rozšiřovacího mechanismu prohlížeče. Zápis prototypů je standardizován, naproti tomu jejich imple–mentace je závislá na tom kterém prohlížeči.

Pokud si budete přát přejmenovat např. uzel Box a dále používat jeho český překlad, můžete postupovat následovně:

#VRML V2.0 utf8

PROTO Kostka[ ] {

Box { }

}

Transform {

translation 1 1 0

children Shape {

geometry Kostka { }

}

}

Jestliže si budete chtít např. vytvořit databázi materiálů, můžete umístit do zvláštního souboru (matlib.wrl) následující seznam prototypů:

#VRML V2.0 utf8

PROTO Zluta [ ] { Material { … } }

PROTO Modra [ ] { Material { … } }

PROTO Cervena [ ] { Material { … } }

  1. Atributy
  2. Eventln

    Jedná se o logické receptory pevně svázané s určitým uzlem, které přijímají události vcházející do uzlu. Jejich jméno bývá často shodné se jménem vstupní události, kterou uzel tímto atributem přijímá.

    ExposedField

    Tento atribut je schopen přijímat události podobně jako atribut předešlý. Pokud se změní hodnota tohoto atributu, může to vyvolat vyslání události ven z uzlu, podobně jako je tomu u atributu typu eventOut.

    Field

    Hodnota tohoto atributu představuje neměnnou vlastnost určitého objektu (poloměr koule, délka hrany krychle), z čehož vyplývá, že ji nelze z vnějšku změnit určitou událostí.

    EventOut

    Tento typ je logický výstup, ze kterého jsou z uzlu vyslány jednotlivé události. Tyto výstupy jsou pevně svázány s daným uzlem a jsou v nich také uloženy naposled odeslané události.

    1. Typy atributů

    Podobně jako každý programovací jazyk, tak i VRML obsahuje určitou skupinu klíčových slov přestavujících datové typy. Ovšem ve VRML se tyto typy chápou spíše jako druhy vlastností některých uzlů. Tyto atributy se nazývají fields (pole). U některých speciálních uzlů se místo termínu fields používá termín events (události). Event je událost respektive zpráva zaslaná z jednoho uzlu do druhého nesoucí určitou hodnotu (hodnoty).

    Atributy se dělí na dvě hlavní skupiny. První skupina obsahuje vždy jen jedinou hodnotu (jedno číslo, vektor, obrázek) a na začátku jména se vždy objevuje zkratka SF (single field). Druhou velkou skupinu tvoří vlastnosti (události) s několika hodnotami uvnitř těla a se zkratkou MF (multiple field). Tyto hodnoty jsou seřazeny do seznamu, ve kterém jsou jednotlivé položky odděleny čárkami a celý seznam je uzavřen do hranatých závorek ( [ ] ). Pokud obsahuje pole pouze jedinou hodnotu, lze uzavírací závorky vynechat.

    SFBool

    SFBool je pole (událost) obsahující jedinou hodnotu, a to hodnotu TRUE (pravda) nebo FALSE (nepravda). Například

    konecBool False

    přestavuje SFBool pole, ve kterém je uložena informace FALSE, tedy že ještě není konec.

    SFColor a MFColor

    SFColor definuje právě jednu trojici RGB představující jednu barvu. MFColor definuje takových trojic nula a více. Ve VRML souboru jsou barvy zapisovány vždy pomocí trojice RGB, a to pomocí třech reálných čísel v rozsahu od 0 do 1. Například

    modraBarva [0 0 1]

    bilaBarva [1 1 1]

    RGB [1.0 0.0 0.0, 0 1 0.0, 0 0 1]

    jsou tři MFColor pole představující modrou, bílou a trojici RGB barev.

    SFFloat a MFFloat

    SFFloat definuje jednu hodnotu čísla s pohyblivou desetinnou čárkou (floating point number), naproti tomu MFFloat je pole obsahující několik těchto čísel. Například

    numFloat [ 1.25e–2 , 0.0125 , .0125 ]

    je MF pole obsahující třikrát hodnotu 0,0125.

    SFImage

    Tento druh pole nebo události se používá pro dvojrozměrné nekomprimované obrázky. Ve VRML souboru jsou tyto obrázky zapsány pomocí třech celých čísel, za kterými následuje výčet barev pro jednotlivé body v obrázku. Třetí atribut specifikuje počet tzv. komponent. Pokud bude toto číslo rovno jedné, potom se jedná o obrázek s 256 úrovněmi šedi. Bude–li tento počet roven třem, jedná se o obrázek true color. Hodnoty barev se budou v tomto případě pohybovat od 0x000000 (hexadecimální zápis nuly) až po 0xFFFFFF (256*256*256–1). Každá barva v tomto obrázku se bude skládat vždy z n–tice (trojice) hodnot 0x0–0xFF. Počet barev je určen součinem šířka*výška. Hodnoty jsou vždy odděleny mezerou:

    obrazekImage <sirka> <vyska> <pocet komponent> <hodnoty bodu>

    Hodnota 0x0 (desítkově 0) reprezentuje nejnižší možnou úroveň, naopak 0xFF (desítkově 255) je hodnotou nejvyšší. Pokud by uživatel definoval čtyři komponenty, pak poslední číslo představuje průhlednost (red–green–blue–transparency). Například hodnota 0xFFFF0080 představuje polopropustnou žlutou barvu. Hodnota 0xFF znamená pro danou barvu, že bude naprosto průhledná. 0x0 je barva neprůhledná. Například

    sedivyObr 2 2 1 0xFF 0x00 0xFF 0x00

    je obrázek 2*2 s jednou komponentou (256 úrovní šedi),

    rgbObr 2 1 3 0xFF0000 0xFF00FF

    je obrázek 2*1 s třemi komponentami (true colors).

    Obrázek se vždy začíná vykreslovat od levého dolního rohu a poslední bod reprezentuje horní pravý roh.

    SFInt32 a MFInt32

    Pole (událost) typu SFInt32 obsahuje 32bitovou reprezentaci celého čísla (Integer). Pole MFInt32 obsahuje takových čísel nula a více. Ve VRML souboru jsou zapsána v desítkové nebo šestnáctkové soustavě (číslo začíná znaky 0x). Například

    poleCisel [–75 , 0xAF2 , 3233 ]

    je MF pole obsahující tři 32bitové hodnoty.

    SFNode a MFNode

    Pole SFNode obsahuje jeden uzel (node) VRML. Pole typu MFNode obsahuje těchto uzlů nula a více. Následující příklad ilustruje platný zápis MF pole triUzly, které obsahuje tři uzly:

    triUzly [DEF Krychle Box{} Transform { translation 1 1 1 }

    USE Krychle]

    Tato pole mohou také obsahovat klíčové slovo (keyword) NULL (prázdný, nulový), což znamená, že jejich obsah je prázdný.

    SFRotation a MFRotation

    Pokud si přejete otočit objekt o libovolný úhel. použijete pole SFRotation, které definuje právě jednu rotaci. Pole MFRotation definuje těchto libovolných rotací několik. Ve VRML souboru jsou tyto rotace zapsány pomocí tzv. čísel s pohyblivou (plovoucí) čárkou. První tři hodnoty představují normalizované složky vektoru, kolem kterého se daná rotace uskuteční. Poslední hodnota definuje v radiánech úhel otočení (pravotočivá soustava). Například

    kolemOsy 1.0 0.0 0.0 3.14159

    představuje otočení okolo osy x o úhel 180 stupňů.

    SFString a MFString

    Tato dvě pole obsahují buď jediný řetězec znaků (SFString) nebo řetězců nebo řetězců několik (nula a více). Každá posloupnost znaků zapsaná do souboru VRML je uzavřena do uvozovek (např. ”vrml 2.0”). Speciální znaky (”,#) musí být uvozeny zpětným lomítkem (backslash). Uveďme si názorný příklad:

    nekolikVet [”první veta”, ”druha veta”,

    ”Veta s specialnimi znaky \”ahoj\” \#”]

    Toto pole MF obsahuje tři řetězce.

    SFTime

    Toto pole definuje hodnotu času. Do VRML souboru se zapisuje jako číslo s plovoucí desetinnou čárkou. Toto číslo představuje počet sekund od určitého pevného data. Typickým datem bývá první leden roku 1970, 0 hodin, 0 minut a 0 sekund GMT (Greenwich Mean Time).

    SFVec2f a MFVec2f

    2D vektor (pouze dvě složky) se ve VRML zapisuje pomocí pole typu SFVec2f. Několik 2D vektorů se realizuje pomocí MFVec2f. Jejich složky jsou zapsány pomocí reprezentace čísla s plovoucí desetinnou čárkou:

    dvaVektory [ 1.4 –5. 15 69]

     

    SFVec3f a MFVec3f

    Samotný 3D vektor se ve VRML zapisuje obdobně jako SFVec2f, ale přidává se ještě třetí složka. Několik 3D vektorů se realizuje pomocí MFVec3f. Jejich složky jsou zapsány opět pomocí reprezentace čísla s plovoucí desetinnou čárkou:

    dva2DVektory [ 1 2 3, 1.5 3.0 4.5 ]

     

  3. Geometrická tělesa
  4. Geometrická tělesa jsou jedním ze stavebních kamenů VRML. Můžeme je rozdělit do dvou skupin:

    První skupinu tvoří elementární tělesa. Pro nás, jako pro stavitele virtuálních světů jsou zde připravena pouze čtyři elementární tělesa – koule, kvádr, kužel a válec. Všechny jsou iniciálně umístěny tak, aby jejich těžiště bylo v počátku souřadné soustavy. K jejich přednostem patří jednoduchost a jednoduchá aplikovatelnost. Výjimkou je kužel, který je situován tak, že v počátku souřadnic leží střed jeho osy.

    Všechna tělesa jsou v paměti počítače převedena do množiny povrchových plošek. Jejich přesný počet známe pouze u kvádru – má jich právě šest. U ostatních těles nelze stanovit počet, a tedy přesnost, s jakou je oblý povrch tělesa nahrazen soustavou (trojúhelníkovitých) plošek. Tato vlastnost však není žádnou chybou, ba právě naopak – prohlížeč může dynamicky měnit kvalitu ploškové náhrady v závislosti na výkonu počítače samotného. Menší počet vykreslovaných ploch snižuje výpočetní nároky a uživatel se rád spokojí s nižší kvalitou zobrazení za cenu vyšší rychlosti při pohybu a práci ve virtuálním světě.

    Druhou skupinu geometrických těles tvoří uzly pro vytváření přírodních útvarů nebo složitých těles jako je např. pohoří nebo toroid (viz tabulka T–1). Mezi jejich výhody patří především schopnost dobře popsat obecná tělesa (někdy i za cenu vyššího objemu dat) nebo měnit svůj tvar (na rozdíl od jednoduchých elementárních těles).

    Název

    Význam

    ElevationGrid

    Výšková mapa (vhodná pro vytváření pohoří

    Extrusion

    Tažené těleso vytvořené z několika průzeřů

    IndexedFaceSet

    Obecné těleso složené z plošek

    IndexedLineSet

    Obecné těleso složené z úseček

    PointSet

    Obecné těleso složené z bodů.

    Tabulka T–1: Obecná geometrická tělesa

    V následující části se podrobněji seznámíme s elementárními geometrickými tělesy a uvedeme si jejich syntaxi, za nimi budou následovat tělesa obecná.

    1. Box
    2. Pomocí uzlu Box (krabice), můžeme vytvořit kvádr.

      typ parametru

      typ dat

      název

      iniciální hodnota

      význam

      field

      SFVec3f

      size

      2 2 2

      nezáporné rozměry kvádru

      Rodič:

      Shape (parametr geometry)

      Potomek:

      žádný

      Obrázek O–2: Kvádr

      Na obrázku O–2 tedy vidíme kvádr v prohlížeči. Základní syntaxe by nám k vykreslení kvádru stačila, avšak model by nebyl vidět, protože implicitní barva pozadí je černá a u kvádru také, ostatně jako u každého jiného tělesa. Jestliže bychom chtěli, aby si náš model mohl uživatel prohlížet, mě–li bychom změnit jeho barvu, nebo barvu pozadí a pro lepší 3D–efekt trochu pootočit. Výsledný kód by pak mohl vypadat asi takto:

      #VRML V2.0 utf8

      Transform {

      rotation 1 1 1 0.8 # otoceni kvadru

      children

      Shape {

      geometry Box {

      size 2 2 2

      }

      appearance Appearance {

      material Material { diffuseColor 1 1 0 } # zluta barva

      }

      }

      }

    3. Cone
    4. V uzlu Cone (kužel) jsou pomocí atributů nastaveny rozměry (poloměr a výška) kužele. Střed lokálních souřadnic určuje jeho střed. Atribut bottomRadius (poloměr základny) určuje poloměr a atribut height (výška) jeho výšku.

      typ parametru

      typ dat

      název

      iniciální hodnota

      význam

      field

      SFFloat

      bottomRadius

      1

      nezáporný poloměr podstavy kuželu

      SFFloat

      height

      2

      nezáporná výška

      SFBool

      side

      TRUE

      povolení vykreslování pláště

      SFBool

      bottom

      TRUE

      povolení vykreslování podstavy

      Rodič:

      Shape (parametr geometry)

      Potomek:

      žádný

      Pro názornost si opět ukažme, jak to vypadá v praxi. Vykreslení kódu uvedeného níže, je zobrazeno na obrázku O–3:

      #VRML V2.0 utf8

      Shape {

      geometry Cone {

      bottomRadius 2 # (0, ¥ ); r=2

      height 3.5 # (0, ¥ ); v=2

      }

      appearance Appearance {

      material Material { diffuseColor 1 1 0 } # zluta barva

      }

      }

       

      Obrázek O–3: Kužel

    5. Cylinder
    6. V uzlu Cylinder (válec) jsou pomocí jeho atributů nastaveny rozměry (poloměr a výška) válce. Střed lokálních souřadnic určuje střed tohoto válce. Atribut radius (poloměr) určuje poloměr a atribut height (výška) jeho výšku.

      typ parametru

      typ dat

      název

      iniciální hodnota

      význam

      field

      SFFloat

      radius

      1

      nezáporný poloměr

      SFFloat

      height

      2

      nezáporná výška válce

      SFBool

      side

      TRUE

      povolení vykreslování pláště

      SFBool

      bottom

      TRUE

      povolení vykreslování dolní podstavy

      SFBool

      top

      TRUE

      povolení vykreslování horní podstavy

      Rodič:

      Shape (parametr geometry)

      Potomek:

      žádný

      Opět si uveďme krátký příklad doprovozený obrázkem:

      #VRML V2.0 utf8

      Shape {

      geometry Cylinder {

      radius 1 # (0, ¥ ); r=1

      height 2.5 # (0, ¥ ); v=2,5

      }

      appearance Appearance {

      material Material { diffuseColor 1 1 0 } # zluta barva

      }

      }

      Obrázek O–4: Válec

    7. Sphere
    8. Uzel Sphere (koule) definuje kouli umístěnou ve středu souřadné soustavy. Pomocí atributu radius (poloměr) můžeme definovat její poloměr.

      typ parametru

      typ dat

      název

      iniciální hodnota

      význam

      field

      SFFloat

      radius

      1

      nezáporný poloměr koule

      Rodič:

      Shape (parametr geometry)

      Potomek:

      žádný

      #VRML V2.0 utf8

      Shape {

      geometry Sphere {

      radius 2 # (0, ¥ ); r=2

      }

      appearance Appearance {

      material Material { diffuseColor 1 1 0 } # zluta barva

      }

      }

      Obrázek O–5: Koule

    9. ElevationGrid

Uzel ElevationGrid (výšková mapa) definuje dvojrozměrné pole o rozměrech xDimension * zDimension s údaji o výškách v tom kterém bodě. Výška se počítá od roviny XZ, což znamená, že kladné hodnoty jsou nad a záporné pod touto rovinou.

typ parametru

typ dat

název

iniciální hodnota

význam

expozedField

SFNode

color

NULL

seznam barev v uzlu Color

SFNode

normal

NULL

seznam normál v uzlu Normal

SFNode

textCoord

NULL

seznam souřadnic textury v uzlu TextureCoordinate

field

SFInt32

xDimension

0

počet vzorků (vrcholů sítě) v ose x

SFInt32

zDimension

0

počet vzorků (vrcholů sítě) v ose z

SFFloat

xSpacing

1.0

kladná vzdálenost mezi vzorky v ose x

SFFloat

zSpacing

1.0

kladná vzdálenost mezi vzorky v ose z

MFFoat

height

[ ]

pole výšek všech vrcholů sítě

SFBool

colorPerVertex

TRUE

barvy v parametru Color se vztahují na vrcholy, jinak na celé plochy sítě

SFBool

normalPerVertex

TRUE

normály v parametru normal se vztahují na vrcholy, jinak na plochy

SFBool

ccw

TRUE

přivrácená strana mapy je vidět při pohledu shora (proti ose y)

SFBool

solid

TRUE

mapa je jednostranná

SFFloat

creaseAngel

0

nezáporný úhel, až do kterého jsou dvě sousední plochy považovány za oblé

eventIn

MFFloat

set height

změna parametru sítě

Rodič:

Shape (parametr geometry)

Potomek:

uzly Color, Normal a TextureCoordinate v příslušných parametrech

xDimension, xSpacing, zDimension a zSpacing

Rozměry pole určují atributy xDimension (šířka) a zDimension (výška). Rozměry jednotlivých obdélníků v mřížce určují parametry xSpacing a zSpacing.

To znamená, že xDimension udává počet uzlů mřížky ve směru x a zDimension ve směru z. Celková šířka objektu je tedy xDimension * xSpacing a celková výška zDimension * zSpacing.

set_height

V případě, že se rozhodneme animovat výškovou mapu, musíme zaslat do uzlu požadavek set_height (nastav výšku) typu MFFloat, ve které je pole výšek. Původní pole se tak nahradí novým a výšková mapa změní svůj tvar.

color

Aby mapa neměla pouze jednu fádní barvu, můžete v poli color (barva) definovat barvy pro:

a to v závislosti na hodnotě atributu colorPerVertex (viz colorPerVertex).

colorPerVertex

Tento atribut určuje, jestli barvy definované v poli color budou aplikovány na jednotlivé body mřížky nebo na jednotlivé obdélníky. Pokud nabývá atribut colorPerVertex (barva pro vrchol) hodnoty FALSE a pole color obsahuje (xDimension – 1) x (zDimension – 1) barev, budou se barvy přiřazovat obdélníkům.

V případě, že má hodnotu TRUE a v poli color xDimension x zDimension barev, budou se barvy přiřazovat vrcholům mřížky.

normal

V poli normal (normála) jsou umístněny normály k jednotlivým bodům k jednotlivým bodům mřížky (normalPerVertex = TRUE) nebo k jednotlivým obdélníkům (normalPerVertex = FALSE). Pokud je pole prázdné (hodnota NULL), musí normály vygenerovat prohlížeč sám.

normalPerVertex

Atribut normalPerVertex (normála na vrchol) určuje, zda se pole normál vztahuje k jednotlivým bodům mřížky nebo k jednotlivým obdélníkům mřížky. V případě, že nabývá hodnoty FALSE, pole normál by mělo být nejméně (xDimension – 1) x (zDimension – 1) dlouhé a jeho hodnoty se chápou jako normály k bodům mřížky. Atribut s hodnotou TRUE vyjadřuje, že hodnoty v poli normál se chápou jako normály k obdélníkům mřížky. Pak by pole mělo být xDimension x zDimension dlouhé.

texCoord

Pokud tato položka není prázdná, měla by obsahovat uzel TextureCoordinate, v kterém by mělo být umístěno nejméně xDimension x zDimension hodnot souřadnic pro textury. Každá hodnota je určena pro jeden vrchol mřížky. V případě, že v uzlu tento atribut chybí, použije se standardní textura.

#VRML V2.0 utf8

Shape {

geometry

ElevationGrid {

xDimension 3 # pocet vrcholu mrizky v ose x

zDimension 5 # pocet vrcholu mrizky v ose z

xSpacing 25 # sirka 1 obdelniku

zSpacing 10 # vyska 1 obdelniku

height[

9, 0, 3 # pole vysek 3 x 5

0, 10, 0

5, 3, 0

0, 0, 0

–9, 0, –3

]

}

appearance

Appearance {

material Material { diffuseColor 1 1 0 } # zluta barva

}

}

 

Obrázek O–6: Výšková mapa

    1. Extrusion
    2. Pomocí uzlu Extrusion (vytahování) lze vytvořit objekt, který vznikne posunem průřezu pro určité trajektorii. V průběhu posunutí může ještě docházet k otáčení, zmenšování či zvětšování průřezu.

      typ parametru

      typ dat

      název

      iniciální hodnota

      význam

      field

      MFVec2f

      crossSection

      [1 1, 1 –1, –1 –1, –1 1, 1 1]

      posloupnost bodů v rovině určující obrysovou křivku (obecně neuzavřenou)

      MFVec2f

      spine

      [0 0 0, 0 1 0]

      posloupnost bodů v prostoru určující trajektorii, po které je obrys tažen

      MFVec2f

      scale

      1 1

      seznam kladných měřítek (v rovině xz) pro každou polohu obrysu

      MFRotation

      orientation

      0 0 1 0

      seznam otočení pro každou polohu obrysu

      SFBool

      beginCap

      TRUE

      povolení vykreslování dolní podstavy

      SFBool

      endCap

      TRUE

      povolení vykreslování horní podstavy

      SFBool

      convex

      TRUE

      obrys je konvexní

      SFBool

      ccw

      TRUE

      obrys je zadán proti směru hodinových ručiček

      SFBool

      solid

      TRUE

      všechny plochy jsou jednostranné

      SFFloat

      creaseAngel

      0

      nezáporný úhel, až do kterého jsou dvě sousední plochy považovány za oblé

      eventIn

      MFVec2f

      set_crossSection

      změna parametru crossSection

      MFVec2f

      set_spine

      změna parametru spine

      MFVec2f

      set_scale

      změna parametru scale

      MFRotation

      set_orientation

      změna parametru orientation

      Rodič:

      Shape (parametr geometry)

      Potomek:

      žádný

      Způsob vytvoření objektu Extrusion

      Polygon reprezentující průřez (crossSection) je umístěn do roviny Y = 0, kde se provede nejprve jeho změna velikosti (první položka v poli scale). V dalším kroku se posune průřez (originál) do další polohy (první položka v poli spine). Změní se velikost s použitím druhé hodnoty. Následně se uskuteční rotace v první i v druhé poloze a konečně dojde ke spojení bodů, které si navzájem odpovídají.

      set_crossSection, set_orientation, set_scale a set_spine

      Tyto čtyři události se používají k animování celého objektu. Událost set_crossSection (nastav průřez) vyvolá změnu celého průřezu. Pokud do uzlu dorazí událost set_orientation (nastav orientaci), změní se otočení průřezu v jednotlivých bodech trajektorie. Změna velikosti průřezu během posunutí se provede událostí set_scale (nastav měřítko). Jestliže do uzlu přijde událost set_spine (nastav páteř), změní se jednotlivé body trajektorie, po které se průřez posouvá.

      beginCap a endCap

      Tyto dva parametry určují, zda se bude zobrazovat spodní základna – beginCap a horní základna – endCap. V případě, že atribut nabývá hodnoty TRUE, základna se vykresluje. Nebude se vykreslovat v okamžiku, kdy má parametr hodnotu FALSE.

      crossSection

      V tomto poli jsou umístěné jednotlivé body polygonu, který představuje průřez objektem. Body se chápou jako vrcholy orientovaného polygonu, tzn. že záleží na pořadí, v jakém jsou hodnoty do pole zapsány.

      orientation

      Pokud si přejete v některých bodech trajektorie otočit průřezem o určitý úhel, musíte pro každý bod křivky určit v poli orientation (orientace) úhel a osu otáčení. Jestliže uvedete méně nebo naopak více hodnost, nebude se akceptovat žádná z nich.

      scale

      V poli scale (měřítko) jsou umístěny hodnoty koeficientů pro změnu velikosti průřezu. První hodnota se vztahuje k ose X a druhá k ose Z. Transformace se vykoná vynásobením originální hodnoty souřadnice bodu odpovídajícím koeficientem. To znamená, že je–li hodnota scale rovna (1,1), zůstává průřez nezměněn. Když je v poli umístěno více hodnot, nadbytečné hodnoty se ignorují. Jestliže naopak je hodnot méně než bodů na trajektorii, výsledek je neurčitý. Jestliže je v poli pouze jedna hodnota a existuje několik průřezů, je hodnota přiřazena automaticky ke všem průřezům. To je např. vidět na implicitní hodnotě tohoto atributu, která je také pouze jedna.

      spine

      Trajektorie, která slouží k posunu průřezu, je definována pomocí pole spine (páteř). Její jednotlivé body jsou na rozdíl od pole crossSection umístěny v prostoru. A také netvoří uzavřenou křivku jako v případě crossSection.

      Použití nejdůležitějších parametrů uzlu Extrusion je uvedeno v následujícím příkladě:

      #VRML V2.0 utf8

      Shape {

      geometry Extrusion {

      creaseAngle 2

      crossSection [0 5,1 1,5 0,1 –1,

      0 –5,–1 –1,–5 0,–1 1]

      spine [0 0 0, 0 30 0, 0 30 30]

      orientation [0 1 0 0, 0 1 0 .78, 0 1 0 1.57]

      scale [0 0, 1 1, 2 2]

      }

      appearance Appearance {

      material Material { diffuseColor 1 1 0 }

      }

      }

      Obrázek O–7: Extrusion

    3. IndexedFaceSet

Uzel IndexedFaceSet (indexovaná množina ploch) definuje objekt složený z množiny polygonů. Polygony jsou konstruovány indexováním do pole bodů, čímž se může jeden bod využít hned několikrát.

typ parametru

typ dat

název

iniciální hodnota

význam

exposedField

SFNode

coord

NULL

seznam vrcholů v uzlu Coordinate

SFNode

normal

NULL

seznam normál v uzlu Normal

SFNode

color

NULL

seznam barev v uzlu Color

SFNode

texCoord

NULL

seznam souřadnic textury v uzlu TextureCoordinate

field

MFInt32

coordIndex

[ ]

posloupnosti indexů vrcholů jednotlivých ploch (zakončené číslem –1)

MFInt32

normaIndex

[ ]

posloupnosti indexů normál pro jednotlivé vrcholy či jednotlivé plochy

MFInt32

colorIndex

[ ]

posloupnosti indexů barev pro jednotlivé vrcholy či jednotlivé plochy

MFInt32

texCoordIndex

[ ]

posloupnosti indexů souřadnic textury pro jednotlivé vrcholy

SFBool

colorPerVertex

TRUE

barvy v parametru colorIndex se vztahují na vrcholy, jinak na plochy

SFBool

normalPerVertex

TRUE

normály parametru normalIndex se vztahují na vrcholy, jinak na plochy

SFBool

convex

TRUE

všechny plochy jsou konvexní

SFBool

ccw

TRUE

přivrácené strany všech ploch jsou zadávány proti směru hodinových ručiček

SFBool

solid

TRUE

všechny plochy jsou jednostranné

SFFloat

creaseAngel

0

nezáporný úhel, až do kterého jsou dvě sousední plochy považovány za oblé

eventIn

MFInt32

set_coordIndex

změna parametru coordIndex

MFInt32

set_normalIndex

změna parametru normalIndex

MFInt32

set_colorIndex

změna parametru colorIndex

MFInt32

set_texCoordIndex

změna parametru texCoordIndex

Rodič:

Shape (parametr geometry)

Potomek:

uzly Coordinate, Normal, Color a TextureCoordinate v příslušných parametrech

set_colorIndex, set_coordIndex,

set_normalIndex a set_texCoordIndex

V případě, že do uzlu dorazí událost set_colorIndex (nastav indexy barev), která s sebou nese nové hodnoty indexů barev, změní se pole indexů do pole jednotlivých barev. Událost set_coordIndex změní pole indexů souřadnic (bodů). Událost set_normalIndex změní pole indexů normál (vektory kolmé k povrchu polygonů) a událost set_texCoordIndex nastaví nové hodnoty indexů do pole souřadnic textur.

color, colorIndex a colorPerVertex

Do položky color (barva) lze umístit pouze uzel Color, ve kterém jsou definovány barvy. Do pole color v uzlu Color se potom přistupuje pomocí pole colorIndex (index do barev).

Jestliže je položka color prázdná, bude objekt pokryt standardním materiálem. Barvy jsou použity v závislosti na parametru colorPerVertex (barva na vrchol). Pokud má parametr colorPerVertex hodnotu TRUE, platí:

  1. Není–li pole colorIndex prázdné, potom je použita vždy jedna barva pro jeden vrchol polygonu. Je použita ta barva (z pole color v uzlu Color), která má stejné pořadové číslo, jako je hodnota příslušného indexu z pole colorIndex. V poli color musí být nejméně tolik indexů, jako je položek v poli coordIndex (včetně indexů –1). Jestliže je hodnota nejvyššího indexu v poli colorIndex N, musí uzel Color obsahovat v poli color nejméně N+1 hodnot.
  2. Je–li pole colorIndex prázdné, potom je použita vždy jedna barva pro jeden vrchol polygonu. Použita je ta barva (z pole color v uzlu Color), která odpovídá indexu z pole coordIndex. Pokud je hodnota nejvyššího indexu v poli coordIndex N, musí uzel Color obsahovat v poli color nejméně N+1 hodnot.

Když má parametr ColorPerVertex hodnotu FALSE, platí:

  1. Není–li colordIndex prázdný, potom je použita vždy jedna barva pro jeden polygon. Je použita ta barva (z pole color v uzlu Color), která má stejné pořadové číslo, jako je hodnota příslušného indexu z pole colorIndex. Jestliže je hodnota nejvyššího indexu v poli colordIndex N, musí uzel Color obsahovat v poli color nejméně N+1 hodnot.
  2. Je–li pole colorIndex prázdné, potom je použita vždy jedna barva pro jeden polygon. Barvy se použijí ve stejném pořadí, v jakém jsou zapsány v poli color v uzlu Color.

normal

V případě, že tato položka není prázdná, musí obsahovat uzel Normal hodnoty jednotlivých normál. Použití normál je závislé na parametru normalPerVertex (normála pro vrchol). Parametry normalPerVertex a colorPerVertex, normal a color, normalIndex a colorIndex jsou komplementární dvojice a jejich význam si můžete podrobně prostudovat v předchozí části.

Pokud je pole normal prázdné, měl by jednotlivé normály vypočítat prohlížeč. Ten ovšem pouze hádá a nemusí normály spočítat správně.

texCoord a texCoordIndex

Není–li pole texCoord prázdné, musí obsahovat uzel Texture–Coordinate (souřadnice textur). Potom jsou v tomto uzlu definovány souřadnice textur a tyto hodnoty se použijí takto:

  1. Jestliže není pole texCoordIndex prázdné, potom je použita vždy jedna hodnota pro jeden vrchol polygonu. Je použita ta hodnota, která má stejné pořadové číslo, jako je hodnota příslušného indexu z pole. V poli musí být nejméně tolik indexů, jako je vrcholů polygonů. Pokud je těchto indexů N, musí uzel TextureCoordinate obsahovat N+1 hodnot. Mezi hodnotami pro jednotlivé polygony musí být uveden oddělovač –1 (viz coord).
  2. Pokud je texCoordIndex prázdný, potom je použita vždy jedna hodnota pro jeden vrchol polygonu, podle obsahu pole coordIndex. Je–li v poli N indexů, musí uzel TextureCoordinate obsahovat N+1 hodnot.

Když je pole texCoord prázdné, použije se standardní nanášení textur. Vypočte se bounding box (nejmenší kvádr, který obklopuje celé těleso) a jeho nejdelší strana se použije jako osa S (viz ImageTexture). A druhá největší strana se použije pro osu T.

ccw, convex, creaseAngle a solid

Uzly Extrusion a IndexedFaceSet obsahují tři atributy typu SFBool. Jejich význam nemá charakter čistě geometrický, ale ocení ho především uživatelé počítačů s menším výpočetním výkonem.

Atribut ccw (counterclockwise) slouží k určení, zda jsou vektory v poli normál seřazeny. Pokud byl VRML soubor vytvářen člověkem, většinou seřazeny budou, pokud byl vytvářen počítačem, respektive pomocí nějakého modeláře, budou vektory nejspíše přeházené. Má–li atribut hodnotu TRUE, předpokládá se, že vektory jsou seřazeny a tvoří pravotočivou posloupnost (směr otáčení hodinových ručiček). V případě hodnoty FALSE se předpokládá, že posloupnost je levotočivá. Namísto automatického generování normál můžete použít uzel Normal, kde normály uvedete. Jestliže se nebude shodovat orientace normál v uzlu s deklarovanou orientací v atributu ccw, může být výsledek neurčitý.

Atribut convex indikuje, zda jsou všechny polygony objektu konvexní (TRUE). To znamená, že úsečka sestrojená mezi dvěma libovolnými body polygonu musí celá ležet v polygonu. Hodnota FALSE určuje, že polygony nejsou konvexní.

Při automatickém generování normál u uzlů ElevationGrid, Extrusion se používá hodnota atributu creaseAngle. Pokud je úhel mezi normálami dvou sousedních ploch menší než hodnota atributu creaseAngle, měly by být vypočítány normály tak, aby obě plochy byly rovnoměrně vystínovány napříč dělící hraně.

Atribut solid určuje, zda se má zobrazovat jedna či obě strany polygonu. Hodnota FALSE stanovuje, že se budou zobrazovat obě strany polygonu nezávisle na směru normály. V případě TRUE se vypočte rozdíl skalárního součinu polohy kamery a normály se skalárním součinem normály a libovolného bodu polygonu.

coord a coordIndex

Pokud není pole coord prázdné, musí obsahovat uzel Coordinate (souřadnice), ve kterém jsou umístěny souřadnice bodů jednotlivých polygonů. Počet těchto bodů není ničím omezen a ne všechny body musí být použity. V případě, že je pole prázdné, nemůžeme mluvit o nějakém objektu.

Pole coordIndex (indexy souřadnic) obsahuje indexy do pole souřadnic. Hodnota indexu představuje pořadové číslo hodnoty, která se má použít v uzlu Coordinate. Každá souřadnice představuje jeden vrchol polygonu. Protože každý polygon může být složen z různého počtu vrcholů, musí být jednotlivé polygony odděleny. Tímto oddělovačem je index s hodnotou –1. Za posledním polygonem se oddělovač uvádět nemusí. Jestliže má v poli coordIndex nejvyšší hodnotu N, musí být v uzlu Coordinate nejméně N+1 souřadnic. Indexy začínají od nuly.

Následující příklad ukazuje konstrukci čtyřbokého jehlanu pomocí uzlu IndexedFaceSet:

#VRML V2.0 utf8

Transform {

children Shape {

geometry IndexedFaceSet {

coord Coordinate { point [

1 0 0, 0 0 –1, # body postavy

–1 0 0, 0 0 1,

0 2 0 ] # vrchol jehlanu

}

coordIndex [3 2 1 0 –1, # podstava

0 1 4 –1, 1 2 4 –1, # stěny

2 3 4 –1, 3 0 4 –1]

}

}

}

 

 

Obrázek 0–8:Čtyřboký jehlan pomocí IndexedFaceSet

    1. IndexedLineSet

Pomocí uzlu IndexedLineSet se vytvoří objekt složený z lomených čar (polyline). Každá čára je definována dvěma vrcholy, které jsou umístěny v položce coord. Uzel bude z těchto bodů postupně vybírat hodnoty a sestavovat jednotlivé úsečky. Jaký bod bude z pole coord vybrán, záleží na hodnotě indexu z pole coordIndex. První bod z pole odpovídá hodnotě indexu 0. Aby bylo možné rozpoznat konec lomené čáry, uvádí se zvláštní index s hodnotou –1. Opět za poslední lomenou čárou se index –1 uvádět nemusí.

typ parametru

typ dat

název

iniciální hodnota

význam

exposedField

SFNode

coord

NULL

seznam vrcholů v uzlu Coordinate

SFNode

normal

NULL

seznam normál v uzlu Normal

SFNode

color

NULL

seznam barev v uzlu Color

SFNode

texCoord

NULL

seznam souřadnic textury v uzlu TextureCoordinate

field

MFInt32

coordIndex

[ ]

posloupnosti indexů vrcholů jednotlivých ploch (zakončené číslem –1)

MFInt32

normaIndex

[ ]

posloupnosti indexů normál pro jednotlivé vrcholy či jednotlivé plochy

MFInt32

colorIndex

[ ]

posloupnosti indexů barev pro jednotlivé vrcholy či jednotlivé plochy

MFInt32

texCoordIndex

[ ]

posloupnosti indexů souřadnic textury pro jednotlivé vrcholy

SFBool

colorPerVertex

TRUE

barvy v parametru colorIndex se vztahují na vrcholy, jinak na plochy

SFBool

normalPerVertex

TRUE

normály parametru normalIndex se vztahují na vrcholy, jinak na plochy

SFBool

convex

TRUE

všechny plochy jsou konvexní

SFBool

ccw

TRUE

přivrácené strany všech ploch jsou zadávány proti směru hodinových ručiček

SFBool

solid

TRUE

všechny plochy jsou jednostranné

SFFloat

creaseAngel

0

nezáporný úhel, až do kterého jsou dvě sousední plochy považovány za oblé

eventIn

MFInt32

set_coordIndex

změna parametru coordIndex

MFInt32

set_normalIndex

změna parametru normalIndex

MFInt32

set_colorIndex

změna parametru colorIndex

MFInt32

set_texCoordIndex

změna parametru texCoordIndex

Rodič:

Shape (parametr geometry)

Potomek:

uzly Coordinate, Normal, Color a TextureCoordinate v příslušných parametrech

set_colorIndex a set_coordIndex

V případě, že do uzlu dorazí událost set_colorIndex (nastav indexy barev), která s sebou nese nové hodnoty indexů barev, změní se pole indexů do pole barev. Událost set_coordIndex změní pole indexů do pole souřadnic vrcholů.

coord a coordIndex

V atributu coord se může nacházet pouze uzel Coordinate, v němž jsou obsaženy jednotlivé body, které budou tvořit vrcholy lomených čar.

Pomocí indexů z pole coordIndex se vytvoří jednotlivé čáry. V poli jsou umístěna pořadová čísla vrcholů z uzlu Coordinate. Prvnímu vrcholu odpovídá index s hodnotou nula, poslednímu pak index s hodnotou N – 1, kde N je počet vrcholů.

color, colorPerVertex a colorIndex

Do položky color (barva) lze umístit pouze uzel Color, ve kterém jsou definovány barvy. Do tohoto pole se potom přistupuje pomocí pole colorIndex (index do barev).

V případě že je položka color prázdná, bude objekt pokryt standardním materiálem. Barvy jsou použity v závislosti na parametru colorPerVertex (barva na vrchol). Pokud má parametr colorPerVertex hodnotu TRUE, platí:

  1. Není–li pole colorIndex prázdné, potom je použita vždy jedna barva pro jeden vrchol polygonu. Je použita ta barva (z pole color v uzlu Color), která má stejné pořadové číslo, jako je hodnota příslušného indexu z pole colorIndex. V poli color musí být nejméně tolik indexů, jako je položek v poli coordIndex (včetně indexů –1). Jestliže je hodnota nejvyššího indexu v poli colorIndex N, musí uzel Color obsahovat v poli color nejméně N+1 hodnot.
  2. Je–li pole colorIndex prázdné, potom je použita vždy jedna barva pro jeden vrchol polygonu. Použita je ta barva (z pole color v uzlu Color), která odpovídá indexu z pole coordIndex. Pokud je hodnota nejvyššího indexu v poli coordIndex N, musí uzel Color obsahovat v poli color nejméně N+1 hodnot.

Když má parametr ColorPerVertex hodnotu FALSE, platí:

  1. Není–li colordIndex prázdný, potom je použita vždy jedna barva pro jeden polygon. Je použita ta barva (z pole color v uzlu Color), která má stejné pořadové číslo, jako je hodnota příslušného indexu z pole colorIndex. Jestliže je hodnota nejvyššího indexu v poli colordIndex N, musí uzel Color obsahovat v poli color nejméně N+1 hodnot.
  2. Je–li pole colorIndex prázdné, potom je použita vždy jedna barva pro jeden polygon. Barvy se použijí ve stejném pořadí, v jakém jsou zapsány v poli color v uzlu Color.

Jestliže je položka color prázdná, použije se pro vykreslení všech čar barva z uzlu Material definovaná atributem emissiveColor. Není–li k dispozici ani uzel Material, použije se implicitní hodnota jeho atributu emissiveColor.

VRML V2.0 utf8

Transform {

children [

Shape {

geometry IndexedLineSet {

coordIndex [

0, 1, –1, 1, 2, –1, # predni stena

2, 3, –1, 3, 0, –1,

4, 5, –1, 5, 6, –1, # zadni stena

6, 7, –1, 7, 4, –1,

0, 4, –1, 1, 5, –1, # bocni hrany

2, 6, –1, 3, 7

]

coord Coordinate {

point [

–1 1 0, –1 –1 0 # body dolni zakladny

1 –1 0, 1 1 0,

–1 1 1, –1 –1 1, # body horni zakladny

1 –1 1, 1 1 1

]

}

color Color { # barvy

color [

1 0 0, 0 1 0,

0 0 1, 1 1 0,

1 0 1, 0 1 1,

1 1 1, 1 0 0,

0 1 0, 0 0 1,

1 1 0, 0 0 1

]

}

}

}

]

}

 

 

Obrázek 0–9:Kvádr pomocí IndexedLineSet

    1. PointSet

Uzel PointSet definuje množinu různobarevných bodů v prostoru. Celá množina se pak chová jako jedno těleso, takže transformace působí na všechny body současně. Velikost bodů není definována, většinou bývá rovna jednomu pixelu na obrazovce. Jednotlivé body nezpůsobují kolizi s Avatarem, nemají žádnou texturu a nejsou ani osvětleny. Jejich velikost je závislá na té které implementaci prohlížeče.

typ parametru

typ dat

název

iniciální hodnota

význam

exposedField

SFNode

coord

NULL

seznam vrcholů v uzlu Coordinate

SFNode

color

NULL

seznam barev v uzlu Color

Rodič:

Shape (parametr geometry)

Potomek:

v parametru coord uzel Coordinate, v parametru color uzel Color

coord

Atribut coord je typu SFNode a může obsahovat jeden uzel. Tímto uzlem může být pouze uzel Coordinate. V uzlu Coordinate jsou umístěny souřadnice jednotlivých bodů a uzel PointSet se zpracovává v pořadí, jak jsou uzly zapsány. Jestliže je atribut coord prázdný, nebude zobrazen žádný bod.

color

Není–li tento atribut prázdný, měl by obsahovat uzel Color. Uzel Color by měl obsahovat nejméně tolik barev, kolik je bodů v uzlu Coordinate, který je umístěn v atributu coord. Barvy budou použity v pořadí, v jakém jsou v uzlu zapsány.

Je–li atribut color prázdný, použije se pro všechny body barva emissiveColor z uzlu Material. Jestliže není ani uzel Material, použije se implicitní hodnota atributu emissiveColor.

  1. Povrch geometrických těles

Pokud potřebujeme přiřadit geometrickému tělesu barvu, materiál nebo texturu, můžeme využít uzel Shape. Uzel Shape ve svém těle obsahuje atribut appearance, který je typu SFNode a lze do něho umístit uzel Appearance. Tento uzel popisuje vizuální vlastnosti objektu – materiál nebo texturu a obsahuje tyto atributy:

Atribut material je typu SFNode a lze do něho umístit pouze uzel Material, ve kterém se určuje např. barva, průhlednost nebo lesklost tělesa.

#VRML V2.0 utf8

Shape {

geometry Sphere { }

appearance Appearance {

material Material {

diffuseColor 1 1 0

}

}

}

 

    1. Material
    2. Uzel Material (materiál) definuje povrch pro určitý objekt. Parametry uzlu určují, jakým způsobem bude objekt odrážet světlo a jakým způsobem bude zabarven.

      typ parametru

      typ dat

      název

      iniciální hodnota

      význam

      exposedField

      SFFloat

      ambientIntensity

      0.2

      světlost povrchu získaná odrazem od okolního světa, tedy bez ohledu na úhel dopadu světla na povrch

      SFColor

      diffuseColor

      0.8 0.8 0.8

      barva povrchu ovlivňovaná úhlem dopadu světla na povrch

      SFColor

      specularColor

      0 0 0

      barva světla odraženého od přímích zdrojů světla

      SFFloat

      shininess

      0.2

      rozmazané (0.0) nebo ostré (1.0) odlesky od přímých zdrojů světla

      SFColor

      emissiveColor

      0 0 0

      vyzařovaná barva, luminiscence; není ovlivňována žádnými zdroji světla

      SFFloat

      transparency

      0

      průhlednost

      Rodič:

      Appearance (parametr material)

      Potomek:

      žádný

      ambientIntensity

      Atribut ambientIntesity (okolní intenzita) určuje, jak mnoho okolního světla bude objekt odrážet. Tento druh světla je závislý na počtu světel, které k němu přispívají. Každé přispívající světlo má nastaveno atribut ambientIntensity na nenulovou hodnotu. Pokud má hodnotu nulovou, pak k intenzitě okolního světla nepřispívá. Výsledná barva okolního světla se vypočte jako součin ambientIntensity a diffuseColor.

      diffuseColor

      Položka diffuseColor určuje, jaká část světelného spektra se bude od objektu odrážet. Barva odraženého světla je závislá na úhlu mezi světelným zdrojem a kamerou (oko pozorovatel). V úvahu se také berou ostatní světelné zdroje a jejich barvy. Za povšimnutí stojí fakt, že implicitní hodnotou difúzní barvy je 80% bílá (čistě bílá je 1 1 1). To znamená, že pokud uvedete těleso bez určení materiálu, bude tomuto tělesu automaticky přidělena šedá barva (0,8 0,8 0,8).

      emissiveColor

      Pokud si přejete vytvořit objekt, který bude vyzařovat světlo, např. barevná žárovka, můžete použít atribut emissiveColor (emisní barva), která definuje barvu vyzařovaného světla.

      specularColor a shininess

      Atributy specularColor (barva odlesku) a shininess určují vlastnosti světelných odlesků, které vzniknou odrážením prudkého světla od povrchu lesklého objektu. Když je úhel mezi povrchem a světelným paprskem přibližně stejný jako úhel mezi pozorovatelem a stejným místem na povrchu tělesa, vznikne v tomto místě odlesk. Jeho barva je závislá na barvě objektu (diffuseColor), okolního světa a barvě odlesku (specularColor).Čím větší je hodnota parametru shininess, tím je poloměr odlesku menší a přechod mezi odleskem a barvou tělesa ostřejší.

      transparency

      V položce transparency (průhlednost) je definováno, jak mnoho světla bude procházet tělesem. Pokud bude atribut nastaven na hodnotu 1, veškeré světlo bude procházet tělesem, což působí jeho neviditelnost. Naopak hodnota 0 určuje, že do objektu nepronikne žádné světlo.

      V následujícím příkladu je demonstrováno použití průhlednosti, odlesků, vlastní barvy a implicitní nastavení na bílou barvu (kužel).

      #VRML V2.0 utf8

      Transform {

      translation 0 –1 –5

      children[

      Shape {

      geometry Cone {}

      }

      ]

      }

      Group {

      children[

      Shape {

      geometry Sphere {}

      appearance

      Appearance {

      material Material {

      diffuseColor .6 .6 0

      ambientIntensity 0.9

      shininess .9

      specularColor 1 1 0

      transparency 0.2

      }

      }

      }

      # na kouli sviti prime svetlo

      DirectionalLight(ambientIntensity 0.5)

      ]

      }

       

    3. Uzly pro nanášení textur

Způsob nanášení textury se provádí ve dvojrozměrném prostoru za pomoci souřadné soustavy. Spodní hrana obrázku odpovídá ose S a levá hrana ose T. Dolní levý roh obrázku určuje bod [0,0] a horní pravý roh odpovídá bodu [1,1].

Textury ve VRML mohou mít statický nebo dynamický charakter. Statické textury využijete prostřednictvím uzlu MovieTexture. Ucelenou představu o texturových uzlech získáte z následující tabulky.

Ve všech případech jsou textury nanášeny ve dvojrozměrném prostoru a texturu určuje obrázek, který je reprezentován polem hodnot. Hodnoty jsou chápány různě, a to v závislosti na formátu obrázku:

Ve většině grafických formátů se kanál nechápe jako průhlednost ale jako neprůhlednost, jinak řečeno alfa =1 – průhlednost.

Grafické formáty pro textury:

Dalším grafickým formátem je formát JPEG, který lze použít v uzlech Background a ImageTexture. Pokud je obrázek ve stupních šedi, vytvoří se textura intenzit. Posledním podporovaným grafickým formátem je formát GIF, který lze použít v uzlech Background a ImageTexture. Jeho použití se řídí stejnými pravidly jako u formátu PNG.

 

    1. ImageTexture
    2. Uzel ImageTexture (obrazová textura) definuje server, na kterém se nachází obrázek, a to zda se bude textura na povrchu opakovat.

      typ parametru

      typ dat

      název

      iniciální hodnota

      význam

      exposedField

      MFString

      url

      [ ]

      seznam adres s umístěním obrázku

      field

      SFBool

      repeatS

      TRUE

      povolení opakování textury ve vodorovném směru

      SFBool

      repeatT

      TRUE

      povolení opakování textury ve svislém směru

      Rodič:

      Appearance (parametr texture)

      Potomek:

      žádný

      url

      Textura se načítá ze serveru určeného URL. Pokud je položka url prázdná, uzel se bude ignorovat. Prohlížeče by měly podporovat grafické formáty JPG, PNG a GIF.

      Formát GIF by měl být podporován i s průhledným pozadím. Některé další prohlížeče také podporují formát CGM.

      repeatS a repeatT

      V případě, že má parametr repeatS (opakuj S) hodnotu TRUE, bude se textura na objektu opakovat ve směru osy S. To znamená, že jakmile je s = 1 (konec obrázku), začne se obrázek nanášet znovu. Pokud je má hodnotu FALSE, nanášení skončí v okamžiku, kdy platí, že s = 1. Parametr repeatT je analogií parametru repeatS pro osu T.

      V příkladu použití uzlu ImageTexture je naneseno logo VRML 97 na krychli o délce hrany 3 m.

      #VRML V2.0 utf8

      Transform {

      translation 0 6 0

      children[

      Shape {

      geometry Box { size 3 3 3}

      appearance Appearance {

      texture ImageTexture { url ”textury/vrml97.gif”}

      }

      }

      ]

      }

       

      Obrázek O–10: Na krychli je nanesena textura v podobě loga VRML

    3. MovieTexture
    4. Uzel MovieTexture (pohyblivý obrázek) definuje časově závislý uzel, který v sobě obsahuje odkaz na soubor s videozáznamem a parametry umožňující řídit běh videa a nanášení videa na objekty. Tento uzel může být také použit ke specifikování zvukového souboru pro uzel Sound. To je ovšem velmi specifický případ. V okamžiku, kdy se video zastaví, zůstane na objektu poslední obrázek videa jako textura.

      typ parametru

      typ dat

      název

      iniciální hodnota

      význam

      exposedField

      MFString

      url

      [ ]

      seznam adres s umístěním videosouboru

      SFTime

      startTime

      0

      čas zahájení přehrávání

      SFTime

      stopTime

      0

      čas ukončení přehrávání

      SFFloat

      speed

      1.0

      rychlost přehrávání; záporná hodnota znamená přehrávání pozpátku

      SFBool

      loop

      False

      povolení přehrávání ve smyčce

      field

      SFBool

      repeatS

      TRUE

      povolení opakování textury ve vodorovném směru

      SFBool

      repeatT

      TRUE

      povolení opakování textury ve svislém směru

      eventOut

      SFTime

      duration_changed

      původní délka sekvence v sekundách; je vyslána pro načtení souboru do paměti

      SFBool

      isActive

      bylo zahájeno nebo ukončeno přehrávání sekvence

      Rodič:

      Appearance (parametr texture) nebo Sound (parametr source)

      Potomek:

      žádný

      Videotextura se nanáší na povrch v dvojrozměrném prostoru za pomoci souřadné soustavy.

      url

      Videotextura se načítá ze serveru určeného URL. Soubor na tomto serveru by měl být ve formátu MPEG, a to ve verzi MPEG1–Systems (zvuk spolu s videem) nebo ve verzi MPEG1–Video (jen video).

      duration_changed

      V okamžiku, kdy se celé video dostane ze serveru do počítače, vyšle se událost duration_changed. V ní je obsažena délka celého videa v sekundách. Pokud je hodnota události rovna –1, video není ještě celé nahrané a nemělo by smysl ho přehrávat.

      loop, startTime, stopTime a isActive

      První tři atributy patří do skupiny atributů ExposedField a používají se k určení, kdy bude uzel aktivní či bude zastaven. Čtvrtý atribut patří do skupiny atributů eventOut a slouží jako sdělení, zda je uzel aktivní.

      speed

      Atribut speed (rychlost) určuje, jakou rychlostí má prohlížeč videosekvenci přehrávat. Například hodnota 2 říká, že se video má přehrávat dvakrát rychleji. Tento atribut ovšem nijak neovlivní hodnotu vysílané události duration_changed. Pokud se právě video přehrává a do uzlu dorazí zpráva set_speed (nastav rychlost), bude zpráva ignorována. Záporná hodnota atribut znamená, že se video má přehrávat pozpátku.

      repeatS a repeatT

      V případě, že se má parametr repeatS (opakuj S) hodnotu TRUE, bude se textura na objektu opakovat ve směru osy S. To znamená, že jakmile je s=1 (konec obrázku), začne se obrázek nanášet znovu. Má–li hodnotu FALSE, nanášení skončí v okamžiku, kdy platí, že s=1. Parametr repeatT je analogií parametru repeatS pro osu T.

    5. PixelTexture
    6. Uzel PixelTexture definuje texturu pomocí pole jednotlivých bodů a dvou parametrů sloužících k určení opakování v jednotlivých osách.

      typ parametru

      typ dat

      název

      iniciální hodnota

      význam

      exposedField

      SFImage

      image

      0 0 0

      typ, šířka, výška a definice vzorku barevných bodů

      field

      SFBool

      repeatS

      TRUE

      povolení opakování textury ve vodorovném směru

      SFBool

      repeatT

      TRUE

      povolení opakování textury ve svislém směru

      Rodič:

      Appearance (parametr texture)

      Potomek:

      žádný

      repeatS a repeatT

      V případě, že se má parametr repeatS (opakuj S) hodnotu TRUE, bude se textura na objektu opakovat ve směru osy S. To znamená, že jakmile je s=1 (konec obrázku), začne se obrázek nanášet znovu. Má–li hodnotu FALSE, nanášení skončí v okamžiku, kdy platí, že s=1. Parametr repeatT je analogií parametru repeatS pro osu T.

    7. TextureCoordinate

Uzel TextureCoordinate obsahuje v poli point množinu dvoj–rozměrných bodů. Každý bod je reprezentován dvěma souřadnicemi S a T.

typ parametru

typ dat

název

iniciální hodnota

význam

exposedField

MFVec2f

point

[ ]

seznam bodů v rovině

Rodič:

ElevationGrid a IntexedFaceSet (parametr texCoord)

Potomek:

žádný

Pokud je v poli point umístěna hodnota 0 0 (s=0, t=0), znamená to, že určitému vrcholu polygonu/výšce (viz IndexedFaceSet/ElevationGrid) odpovídá bod na textuře o souřadnicích

  1. Text ve VRML
  2. Ve virtuálních světech lze snadno použít psaného textu. Tento text velmi připomíná reálnou podobu textu, jak jej známe z běžného života. Prakticky to znamená, že text ve virtuálním světě je plochý, namalovaný na nějakém podkladu. K tomuto účelu se používá uzel Text. Typ písma, druh zarovnání a další parametry jsou obsaženy v uzlu FontStyle.

    1. Text
    2. typ parametru

      typ dat

      název

      iniciální hodnota

      význam

      exposedField

      MFString

      string

      [ ]

      posloupnost textových řetězců

      SFFloat

      maxExtent

      0.0

      nezáporná hodnota omezující maximální rozměr nápisu ve směru daném stylem písma; hodnota 0 ruší jakékoliv omezení

      MFFloat

      length

      [ ]

      seznam nezáporných délek pro každý z řetězců; hodnota 0 znamená libovolnou délku

      SFNode

      fontstyle

      NULL

      styl písma v uzlu FontStyle

      Rodič:

      Shape (parametr geometry)

      Potomek:

      v parametru fontStyle uzel FontStyle

      string

      V tomto poli jsou umístěny všechny textové řetězce. Každý řetězec představuje jeden řádek textu. Nemusí však platit, že řádky budou pod sebou.

      maxExtent

      Pomocí tohoto atributu lze předepsat maximální délka všech řetězců. Pokud délka nějakého řetězce přesáhne povolenou délku, pak dojde ke zhuštění napsaného řetězce. Zhuštění se provede ve směru psaného textu mezi jednotlivými znaky. U řetězců kratších než tato povolená mez k žádné úpravě nedojde.

      length

      Toto pole uchovává hodnoty délek jednotlivých řetězců. V případě, že psaný text je delší než tato hodnota dochází ke zhuštění textu. Naopak při kratším textu dojde k jeho natažení na danou velikost. Jestliže je v tomto poli umístěno méně hodnot, než je počet řetězců, pak je chybějící hodnota nahrazena nulou, která představuje libovolnou délku textu.

    3. FontStyle

    V prvním případě se jedná o parametr uzlu Text, který má samostatného potomka, uzel FontStyle. V tomto uzlu je pak definován druh písma, jeho velikost, zarovnání a jazyk.

    typ parametru

    typ dat

    název

    iniciální hodnota

    význam

    field

    SFFloat

    size

    1.0

    kladná výška písma

    SFFloat

    spacing

    1.0

    nezáporná hodnota, definující vzdálenost mezi řádky jako spacing x size

    MFString

    family

    "SERIF"

    seznam rodin písma

    SFString

    style

    "PLAIN"

    styl pro danou rodinu písma

    SFBool

    horizontal

    TRUE

    psaní ve vodorovném směru

    SFBool

    leftToRight

    TRUE

    psaní na řádku zleva doprava

    SFBool

    topToBottom

    TRUE

    psaní řádku zhora dolů

    MFString

    justify

    "BEGIN"

    hlavní a vedlejší způsob umístění textu

    SFString

    language

    ""

    dvojznaková zkratka použité abecedy

    Rodič:

    Text (parametr fontStyle)

    Potomek:

    žádný

    size

    Atribut určuje velikost písma. Tato velikost je určena vzdáleností mezi linkou paty písma a horní linkou verzálek. Hodnota by měla nabývat kladných čísel.

    spacing

    Položka spacing nastavuje vzdálenost mezi dvěma řádky textu. Jedná se o relativní vzdálenost mezi dvěma bezprostředně za sebou následujícími patami řádků textu. Skutečná vzdálenost mezi dvěma řádky pak bude spacing * size.

    family

    Jak už napovídá název, jedná se o rodiny. V tomto případě je tím míněno rodiny druhů písem. Rozlišují se tři základní rodiny písem:

    ”SERIF” patkové písmo např. TimesRoman

    ”SANS” bezpatkové písmo např. Arial, Helvetica

    ”TYPEWRITER” písmo s pevnou šířkou znaků např. Courier

    Dále lze pak libovolně používat název typu písma dle pojmenování operačním systémem počítače. Implicitně je užívána rodina písem ”SERIF”.

    style

    Tímto atributem se určuje styl písma. Tato položka může nastavit pouze tyto styly:

    ”PLAIN” standardní písmo

    ”ITALIC” skloněné písmo tzv. kurzíva

    ”BOLD” tučné písmo

    ”BOLDITALIC” kombinace dvou předchozích tzv. tučná kurzíva

    horizontal, leftToRight a topToBottom

    Všechny tyto parametry určují směr, jakým bude napsaný text orientovaný. Mohou nabývat logických hodnot TRUE, FALSE. Parametr horizontal udává, zda bude text psaný směrem vodorovným či svislým v hlavním směru. Dle tohoto hlavního směru se pak budou chovat další dva parametry leftToRight (zleva doprava) a topToBottom (shora dolů).

    justify

    Jedná se o ovlivnění zarovnání psaného textu. Položka obsahuje dvě hodnoty vztahující se k hlavní resp. vedlejší ose. Hlavní osou je míněno osa rovnoběžná s linkou, na které je napsaný text. Každá z obou hodnot může nabývat čtyř různých nastavení zarovnání.

    Pro hlavní osu:

    BEGIN a FIRST zarovnání dle počátku

    MIDDLE zarovnání dle středu

    END zarovnání dle konce

     

    Pro vedlejší osu:

    BEGIN najde vnější začátek textu a posune text, aby začátek ležel na ose

    FIRST najde začátek linky textu a posune text, aby začátek ležel na ose

    MIDDLE najde střed textu a posune text, aby střed ležel na ose

    END najde vnější konec textu a posune text, aby konec ležel na ose

     

    language

    Definuje národní jazyk, v němž je text napsán. Používá se dvojznaková zkratka národní abecedy, užívaná v normě UniCode.

  3. Vázané uzly
    1. Background
    2. Uzel Background se používá především k simulaci exteriéru, jako je např. povrch planety. Toho lze dosáhnout poměrně jednoduchým způsobem. Stačí definovat nebe (sky), zem (ground) nebo panorama a vznikne poměrně věrohodná podoba planetární krajiny.

      typ parametru

      typ dat

      název

      iniciální hodnota

      význam

      exposedField

      MFString

      backUrl

      [ ]

      seznam adres s umístěním obrázku pro zadní stěnu obklopující krychle

      MFString

      bottomUrl

      [ ]

      seznam adres s umístěním obrázku pro dolní stěnu obklopující krychle

      MFString

      frontUrl

      [ ]

      seznam adres s umístěním obrázku pro čelní stěnu obklopující krychle

      MFString

      leftUrl

      [ ]

      seznam adres s umístěním obrázku pro levou stěnu obklopující krychle

      MFString

      rightUrl

      [ ]

      seznam adres s umístěním obrázku pro pravou stěnu obklopující krychle

      MFString

      topUrl

      [ ]

      seznam adres s umístěním obrázku pro horní stěnu obklopující krychle

      MFColor

      skyColor

      0 0 0

      seznam barev pro postupné přechody na sférické obloze

      MFFloat

      skyAngle

      [ ]

      rostoucí posloupnost nezáporných úhlů, pro které jsou dány barvy oblohy

      MFColor

      groundColor

      [ ]

      seznam barev pro postupné přechody na sférické zemi (podlaze)

      MFColor

      skyColor

      0 0 0

      rostoucí posloupnost nezáporných úhlů, pro které jsou dány barvy země

      eventIn

      SFBool

      set_bind

      aktivování pozadí

      eventOut

      SFBool

      isBound

      pozadí se stalo aktivním nebo naopak bylo nahrazeno jiným

      Rodič:

      žádný nebo skupinový uzel (parametr children)

      Potomek:

      žádný

      Zvláštnost:

      V každém okamžiku je z více uzlů tohoto typu aktivní právě jeden

      set_bind

      Pokud dorazí do uzlu událost set_bit s hodnotou TRUE, potom se uzel přesune na první příčku zásobníku, což znamená, že se toto pozadí stane pozadím právě zobrazovaným. Když do uzlu dorazí událost set_bind s hodnotou FALSE, pak se tento uzel odstraní z vrcholu zásobníku a přestane se zobrazovat.

      skyColor

      Atribut skyColor (barva oblohy) určuje barvy oblohy, a to při určitých úhlech pohledu. První položka definuje barvu oblohy na horizontu, poslední položka určuje barvu v nadhlavníku.

      skyAngle

      Každá barva oblohy (atribut skyColor) je definována jen pro určitou výseč, která je určen úhlem (angle) umístěným v tomto poli (atribut typu MFFloat). Pokud je definováno n barev oblohy, pak by v tomto poli mělo být umístěno n–1 úhlů, protože první položka implicitně definuje barvu na horizontu, tedy úhel 0 radiánů. Barva oblohy mezi dvěma hodnotami barev z pole skyColor se získá lineární interpolací.

      groundColor

      Barvy povrchu země (ground) se určují v poli groundColor. Každá položka v tomto poli odpovídá jedné barvě mezi dvěma úhly (definuje pole groundAngle), až na první položku, která definuje barvu přímo pod virtuální postavou (0 radiánů).

      groundAngle

      V tomto poli jsou specifikovány úhly, mezi kterými se bude interpolovat barva, jež je určena v poli groundColor.

      backUrl, bottomUrl, frontUrl, leftUrl, rightUrl a topUrl

      Místo pouhé barvy můžete určit přímo texturu, která bude tvořit panorama. Panorama se skládá ze šesti částí, které jsou umístěné na pomyslné krychli. Každá textura je přidělena jedné stěně krychle. Položky backUrl,
      bottomUrl, frontUrl, leftUrl, rightUrl a topUrl určují URL zadní (back), spodní (bottom), přední (front), levé (left), pravé (right) a horní (top) textury pomyslné krychle. Tím vznikne dojem, že se uživatel dívá na skutečné panorama. Pokud se v obrázku vyskytuje průhledná nebo poloprůhledná barva, prohlížeč by ji měl nahradit barvou nebe (země) nebo ji smíchat dohromady. Jako vhodné grafické formáty se ukázaly JPG, GIF a PNG.

      V příkladu je prakticky ukázáno použití uzlu Background. Uzel vytvoří iluzi nebe přechodem od sytě modré (0, 0,1) až po světle modrou (0,8; 0,8; 1) od horizontu až po nadhlavník (skyAngle 1,57). Dále pak vytvoří iluzi povrchu s trávou přechodem od sytě zelené (0, 1, 0) až po světle hnědou
      (0,8; 0,4; 0) od nohou uživatele až po horizont. Na povrch je přitom ještě přidána textura trávy (bottomUrl"obr/trava.jpg"):

      #VRML V2.0 utf8

      Background {

      skyColor [0 0 1, .8 .8 1] # nebe

      groundColor [0 1 0, 0.8 0.4 0] # povrch

      bottomUrl "obr\trava.jpg" # spodní textura

      skyAngle 1.57 # interpolace od horizontu az

      # pod nadhlavnik

      groundAngle 1.57 # interpolace od horizontu az k

      # noham uzivatele

      }

    3. Fog
    4. Ve VRML je také možné simulovat mlhu (fog), jejíž barva (color) se přidá k barvě objektů. Intenzita přidané barvy je závislá na vzdálenosti objektu od uživatele.

      typ parametru

      typ dat

      název

      iniciální hodnota

      význam

      exposedField

      SFColor

      color

      1 1 1

      barva mlhy ve složkách RGB

      SFString

      fogType

      "LINEAR"

      způsob houstnutí mlhy ("LINEAR" nebo "EXPONENTIAL")

      SFFloat

      visibilityRange

      0

      seznam barev v uzlu Color

      SFNode

      texCoord

      NULL

      seznam souřadnic textury v uzlu TextureCoordinate

      eventIn

      SFBool

      set_bind

      aktivování mlhy

      eventOut

      SFBool

      isBound

      mlha se stala aktivním nebo naopak byla nahrazena jinou mlhou

      Rodič:

      žádný nebo skupinový uzel (parametr children)

      Potomek:

      žádný

      Zvláštnost:

      V každém okamžiku je z více uzlů tohoto typu aktivní právě jeden

      color

      Atribut color (barva) definuje, jakou barvu bude mlha mít. Tato barva se přidává ke všem objektům ve scéně.

      fogType

      Atribut fogType (druh mlhy) určuje způsob výpočtu výsledné barvy objektu. Můžete si vybrat ze dvou možných druhů. Prvním druhem je mlha zvaná LINEAR, u níž je míchaná barva přímo úměrná vzdálenosti (lineární závislost). Druhý typ je na vzdálenosti závislý exponenciálně, proto název EXPONENTIAL. Tento typ mlhy je o něco přirozenější, ale zase náročnější na výpočetní výkon.

      visibilityRange

      Parametr visibilityRange (rozsah viditelnosti) určuje, do jaké vzdálenosti je ještě objekt možné spatřit. Pokud uživatel tuto vzdálenost překročí, celý objekt bude již zahalen do mlhy, tedy lépe řečeno, bude mít její barvu. Pokud má atribut hodnotu 0, znamená to, že prohlížeč má uzel Fog ignorovat.

      Dále je uveden uzel Fog v konkrétním provedením:

      #VRML V2.0 utf8

      Shape{

      geometry Cone {} # kuzel

      appearance

      Appearance {

      material Material {diffuseColor 1 1 0} # zluta barva

      }

      }Fog {

      color 0 0 1 # modra barva

      visibilityRange 2

      fogType "EXPONENTIAL"

      }

    5. NavigationInfo
    6. Uzel NavigationInfo v sobě obsahuje informace o tom, jak bude uživatel procházet virtuálním světem. Virtuální postava, která reprezentuje uživatele ve virtuálním světě, se nazývá Avatar. Právě v tomto uzlu se nastavují vlastnosti uživatelova Avatara.

      typ parametru

      typ dat

      název

      iniciální hodnota

      význam

      exposedField

      MFFloat

      avatarSize

      [0.25, 1.6, 0.75]

      trojice kladných čísel, určujících rozměry avatara: šířku (resp. její polovinu), výšku očí a výšku kolen (překonatelné překážky)

      SFBool

      headlight

      TRUE

      zapnutí svítilny na pomyslném čele avatara; svítilna vyzařuje plné bílé světlo, ale nepřispívá k ambientnímu osvětlení světa

      SFFloat

      speed

      1.0

      rychlost pohybu avatara v m/s; nezáporné číslo

      MFString

      type

      ["WALK", "ANY"]

      seznam povolených způsobů přesunu avatara v prostoru; možnosti: ANY, WALK, EXAMINE, FLY, NONE

      SFFloat

      visibilityLimit

      0.0

      dohled avatara; nezáporné číslo

      eventIn

      SFBool

      set_bind

      aktivování vlastností avatara a způsobu jeho ovládání

      eventOut

      SFBool

      isBound

      uzel se stal aktivním nebo naopak byl nahrazen jiným

      Rodič:

      žádný

      Potomek:

      žádný

      Zvláštnost:

      V každém okamžiku je z více uzlů tohoto typu aktivní právě jeden

      Uzel NavigationInfo je považován za potomka uzlu Viewpoint nezávisle na tom, kde se uzel Viewpoint v grafu scény nachází. Jakmile se stávající uzel Viewpoint mění, musí se aktuální uzel NavigationInfo stát potomkem nového uzlu Viewpoint. Tento úkon provádí prohlížeč. Když se mění stávající Navigation, musí se nový uzel stát potomkem původního uzlu Viewpoint, který obsahoval starý uzel jako potomka. Při načítání souboru se naváže první uzel NavigationInfo, který se ze souboru načte. Tento uzel se automaticky naváže a bude ovlivňovat ovládací prvky pro prohlížení.

      set_bind

      Pokud přijde do uzlu tato událost s hodnotou TRUE, uzel se přemístí na vrchol zásobníku všech uzlů NavigationInfo. Jestliže je uzel na vrcholu, použije ho prohlížeč k zobrazení a nastavení ovládacích prvků uživateli a uzel 0je navázán jako následník aktuálnímu uzlu Viewpoint. Všechny nové vlastnosti se samozřejmě do nového stanoviště promítnou. Událost s hodnotou FALSE odebere uzel z vrcholu a vyšle se z uzlu událost isBound s hodnotou FALSE. Potom se naváže další uzel, který byl na zásobníku za odebíraným uzlem. Tento nový uzel se musí také vyměnit s původním uzlem Viewpoint.

      type

      Parametr type určuje, pomocí jakých ovládacích prvků se bude uživatel ve světě pohybovat. Každý prohlížeč by měl podporovat nejméně tyto druhy:

      ANY,

      WALK,

      EXAMINE,

      FLY,

      NONE.

      Tyto druhy představují jednotlivé názvy skupin ovládání. Například pokud je atribut type nastaven na hodnotu WALK, bude uživateli umožněno procházet světem v podobě chodce, který stojí nohama na podložce a má oči (kameru) v určité výšce.

      V případě hodnoty ANY (nějaký) si může prohlížeč vybrat podle toho, který prohlížecí model je nejvhodnější. Tuto hodnotu také prohlížeči oznamujeme, že si může uživatel sám vybrat libovolný prohlížecí model. Když se v poli type nenachází položka ANY znamená to, že se mají zakázat všechny ostatní ovládací prvky pro procházení světem kromě uvedených v poli type. Prohlížeč by neměl ani dovolit uživateli přepnout se do ostatních prohlížecích režimů. Jestliže se položka ANY v poli nachází, prohlížeč by měl poskytnout některou z prohlížecích metod a do ostatních by měl uživateli povolit se přepnout. První prohlížecí metodou, která se objeví uživateli na monitoru, bude první specifikovaný model v poli type.

      Hodnota WALK (chodit) je určena pro model, kdy se svět prochází pěšky nebo v nějakém vozidle po povrchu. Uživatelův Avatar musí vědět, která rovina určuje povrch, aby se dokázal na tuto rovinu postavit. Normála k povrchu by měla být rovnoběžná s osou Y, aby se zajistilo, že objekty mají výšku v kladném směru osy Y. V tomto prohlížecím modelu by měl prohlížeč striktně dodržovat kontrolu kolizí.

      Model FLY (letět) je srovnatelný s modelem WALK s tím rozdílem, že mohou být ignorovány přepínače gravitace (gravity) a sledování povrchu (terrain following). V tomto prohlížecím modelu by měl prohlížeč striktně dodržovat kontrolu kolizí.

      Model EXAMINE (zkoumat) je určen k prohlížení určitého objektu ze všech stran. Tato podmínka nemusí být nutně splněna prohlížečem, některé prohlížeče tento režim zjednodušily. V lepším provedení se Atavar otáčí okolo středu zkoumaného objektu, v zjednodušeném provedení se Atavar otáčí okolo středu souřadné soustavy.

      Model NONE (žádný) odebere všechny ovládací prvky a dovolí uživateli procházet světem pouze pomocí prvků ve VRML světě (přenášení, pohyb mezi stanovišti).

      V případě položek WALK, FLY, EXAMINE nebo NONE (ne ANY) nebo jejich kombinace by měl být implementován plynulý přechod mezi dvěma stanovišti. Tento přechod lze uskutečnit přímo v prohlížeči.

      Každý prohlížeč si může vytvořit svůj vlastní prohlížecí model. Jeho název musí být specifický, aby se předešlo možným komplikacím.

      speed

      Parametr speed (rychlost) definuje rychlost v metrech za sekundu, jakou se bude Avatar pohybovat světem. Přestože může být rychlost měněna jak uživatelem, tak prohlížečem, tato hodnota představuje implicitní hodnotu. Pokud se uživatel nachází v prohlížecím modelu EXAMINE, jeho rychlost by neměla ovlivnit rychlost, s jakou se bude Avatar otáčet. Ovšem změna měřítka (scaling), která se zdědí z rodičovských uzlů, bude ovlivňovat hodnotu rychlosti. Hodnota rychlosti by měla být kladná, v případě, že je nulová, jedná se o statickou pozici. V této pozici se Avatar může pouze otáčet na místě. Jestliže je prohlížecí model NONE, nemá tento atribut žádný význam.

      avatarSize

      Atribut avatarSize (Avatarova velikost) určuje "tělesné" proporce uživatelova Avatara. V tomto poli je umístěno několik hodnot. První hodnotou je minimální vzdálenost mezi polohou Avatara a objektem, při které ještě nedochází ke kolizi. Druhou hodnotou je Avatarova tělesná výška, respektive výška nad povrchem, v jaké se pohybuje uživatelova kamera. Třetí hodnotou by měla být výška nejvyššího objektu, na který může Avatar vystoupit. Tato hodnota se používá např. ke konstrukci schodů. Všechny tři hodnoty mohou být ovlivněny transformací scale uvnitř rodičovského uzlu Viewpoint. Transformace posunu a otočení nezmění hodnoty pole avatarSize.

      visibilityLimit

      Tento atribut určuje vzdálenost, kam až je uživatelův Avatar schopen dohlédnout. Všechny geometrické objekty za touto hranicí nebudou zobrazeny. V případě, že má atribut hodnotu 0, dohlédne až do nekonečna. Hodnota atributu musí být nutně záporná.

      Atributy speed, avatarSize a visibilityLimit jsou ovlivňovány transformací scale, a to z právě navázaného uzlu Viewpoint. Pokud není navázán žádný uzel Viewpoint, parametry se vztahují ke globálním souřadnicím. Tím je umožněno automatické přizpůsobení v okamžiku navázání na uzel Viewpoint s transformací scale.

      headlight

      Atribut headlight (čelní světlo) říká prohlížeči, zda má rozsvítit světlo, které svítí směrem rovnoběžným se směrem pohledu Avatara. To si lze představit asi tak, jako by měl Avatar na čele lampičku, kterou svítí na cestu vpřed. Jestliže má atribut hodnotu TRUE, světlo bude zapnuté a mělo by mít nastaveny následující parametry: intensity = 1, color = (1 1 1), ambientIntensity = 0 a direction = (0 0–1). V případě hodnoty FALSE bude světlo vypnuté.

    7. Viewpoint

Uzel Viewpoint definuje stanoviště, ze kterého uživatel pozoruje scénu. Uzel patří ke skupině vázaných uzlů a v důsledku toho zde musí existovat zásobník těchto uzlů. Pokud je uzel umístěn na vrcholu zásobníku, je aktivní a uživatel se právě nachází v jim definovaném stanovišti.

typ parametru

typ dat

název

iniciální hodnota

význam

exposedField

MFFloat

fieldOfView

0.785398

zorný úhel v rozsahu (0, π)

SFVec3f

position

0 0 10

poloha avatara v libovolných souřadnicích

SFRotation

orientation

0 0 1 0

natočení avatara podle osy a úhlu; osa se zadává vektorem s hodnotami v rozsahu [–1,1], úhel je libovolný

SFBool

jump

TRUE

povolení plynulého přechodu na stanoviště

field

SFString

description

" "

jméno stanoviště uváděné prohlížečem

eventIn

SFBool

set_bind

aktivování stanoviště, tj. umístění avatara do dané polohy a orientace

eventOut

SFTime

bindTime

čas aktivace stanoviště

SFBool

isBound

stanoviště se stalo aktivním nebo naopak bylo nahrazeno jiným stanovištěm

Rodič:

žádný nebo skupinový uzel (parametr children)

Potomek:

žádný

Zvláštnost:

V každém okamžiku je z více uzlů tohoto typu aktivní právě jeden

Ve velmi rozsáhlém světě potřebujete mnohdy uživateli ukázat několik důležitých míst. Aby se na tato místa uživatel dostal, musí se na ně nějakým způsobem upozornit, např. nápisem na zdi nebo několika šipkami, které uživatele vedou. Tento způsob je poněkud pracný a např. šipek si uživatel nemusí pokaždé všimnout. Právě pro tento případ připravili autoři VRML uzel Viewpoint, u kterého stačí definovat parametry stanoviště a uživateli se v prohlížeči zobrazí jeho název (description). Pak si již uživatel pouze vybere některé ze stanovišť a prohlížeč s ním prolétne celou scénu až na příslušné místo.

Uzel Viewpoint podléhá rodičovským transformacím, které ovlivňují jeho atributy. Praktické důsledky mohou být až prapodivné, protože objekty, které se z jednoho stanoviště zdají být zkosené nebo zvětšené, se mohou z jiného jevit normálně a jiné objekty mohou v tomto stanovišti zase vypadat deformovaně.

Na stanoviště se lze také přenést pomocí uzlu Anchor, jestliže má uzel ve svém atributu url umístěno např. .../budova.wrl#Vchod a uživatel aktivuje uzel, přenese se na stanoviště v souboru budova na stanoviště s názvem "Vchod".

Pokud je v parametru url uveden pouze název stanoviště

url "#Vchod",

je stanoviště ve stejném souboru, jako se nachází uživatel. Na stanoviště se může také odkazovat přímo URL v některém HTML dokumentu:

<A HREF="http://.../vrml/budova.wrl#Vchod">Muj dum</A>

 

set_bind a isBound

Přijde–li do uzlu událost set_bind s hodnotou TRUE, uzel se přemístí na vrchol zásobníku všech uzlů Viewpoint. Pokud je uzel na vrcholu, použije ho prohlížeč k zobrazení scény z daného stanoviště. Událost s hodnotou FALSE odebere uzel ze zásobníku a vyšle z uzlu událost isBound s hodnotou FALSE. Jestliže byl uzel na vrcholu, naváže se další uzel, který byl na zásobníku za odebíraným uzlem. Nový uzel definuje nové stanoviště, do kterého se uživatel přenese. V okamžiku, kdy se uzel dostane na vrchol zásobníku, vyšle událost isBound s hodnotou TRUE.

bindTime

Událost bindTime se z uzlu vysílá, pokud se uzel právě navazuje, nebo se naopak stává nenavázaným. Tato zpráva se vysílá:

position a orientation

Atribut position určuje polohu stanoviště ve scéně. Poloha je závislá na poloze počátku lokální souřadné soustavy. Atribut orientation definuje směr, kterým se bude uživatel na scénu dívat. Tento atribut je typu SFRotation, což znamená, že si jeho pomocí lze uživatelovu kameru otočit kterýmkoliv směrem. Implicitní hodnota atributu position je 0 0 10 a atributu orientation 0 0 1 0, což znamená, že se uživatel dívá podél osy Z (záporným směrem) z bodu Z = 10 a horizont mu tvoří osa X. Tento pohled se stal základem při určování intuitivních směrů. Což znamená, že "vzadu" je kladným směrem osy Z. "Nahoře" znamená kladný směr osy Y a "vpravo" je kladný směr osy X.

jump

Atribut jump umožňuje zakázat (FALSE) nebo naopak povolit (TRUE) přechod z jiného do tohoto stanoviště. Během přechodu prochází uživatel všemi objekty bez detekce kolizí a ani žádné senzory nevysílají zprávy o přítomnosti či kolizi uživatele. Tím mohou ovšem vzniknout problémy, protože nacházel–li se uživatel před přechodem např. v ProximitySensoru, musí senzor jeho odchod nějakým způsobem dát najevo. Vyšle tedy událost exitTime (čas opuštění) ve stejném okamžiku, kdy přijde do uzlu Viewpoint událost set_bind. Obdobný problém může nastat, nachází–li se cílové stanoviště v ProxomitySensoru. Senzor vyšle událost enterTime (vstupní čas) ve stejný okamžik, kdy se navázal uzel Viewpoint.

fieldOfView

Atribut fieldOfView definuje zorný úhel uživatelova pohledu ze stanoviště. Pokud je jeho hodnota malá (0,1), je vidět pouze malý výsek ze scény, ale všechny objekty jsou zvětšené. Je–li jeho hodnota naopak velká, je vidět poměrně velká část scény, ale všechny objekty jsou zmenšené.

description

V atributu description můžete několika slovy dané stanoviště popsat. Tento popis může posloužit prohlížeči k zobrazení popisu uživatelském prostředí. Jestliže u stanoviště popis chybí, většina prohlížečů toto stanoviště uživateli nenabídne.

V krátkém příkladu jsou použita pouze dvě stanoviště. První se naváže při načítání souboru a je umístěno ve stejné souřadné soustavě jako žlutá krychle. Druhé stanoviště je umístěno do transformované souřadné soustavy spolu se zelenou krychlí. V okamžiku, kdy se uživatel nachází v tom kterém stanovišti, je jeho pohled ovlivněn transformacemi souřadné soustavy, do které bylo stanoviště v souboru umístěno. Proto se mohou některé objekty z jiných soustav poněkud zdeformovat:

#VRML V2.0 utf8

Viewpoint{ # toto stanoviste se navaze hned pri cteni souboru

description "Deformovana zelena"

}Shape {

geometry Box {} # zluta krychle

appearance Appearance {

material Material {

diffuseColor 1 1 0

}

}

}Transform {

translation 3 1 1 # stred lok. soustavy je v

#[3,1,1]

rotation 0 0 1 0.78 # lok. soust. je otocena o pi/4

# okolo Z

scale 2 1 1 # X–ove hodnoty jsou

scaleOrientation 1 1 1 0.78

children [

Viewpoint{ description "Deformovana zluta"}

Shape {

geometrz Box {} # zelena krychle

appearance Appearance {

material Material {

diffuseColor 0 1 0

}

}

}

]

}

 

  1. Dynamické uzly
  2. Pokud nastane nějaká kritická situace (uživatel vstoupí do místnosti), každý senzor vyšle určitou událost. Na jaké události ten který senzor reaguje, je detailně popsáno v příslušných odstavcích této kapitoly.

    Mezi senzory lze vytvořit závislost. Například pokud se uživatel pohybuje ve scéně a "šlápne" na dotykový senzor, může se objevit tlačítko na otvírání dveří.

    1. Senzory okolo uživatele
    2. Senzorem z této skupiny je TimeSensor (časový senzor). Tento senzor představuje jakýsi spouštěcí (ukončovací) mechanismus, který v určitý okamžik spustí nějakou akci. Senzor pracuje v podstatě jako časový spínač. V některých případech je třeba zjistit, zda uživatel již měl možnost vidět nějaký objekt. K tomuto účelu se používá VisibilitySensor (senzor viditelnosti).

    3. Senzory reagující na myš
    4. Tento typ senzorů reaguje na událost přijaté od myši. Aby mohl být objekt senzorem, který bude reagovat na myš, musí být ve zdrojovém souboru jeho tělo společně s tělem daného senzoru v poli children daného skupinového uzlu.

      Když senzory vysílají zprávy typu (rotation nebo translation)_changed jako odezvu na aktivaci myši, je ve zprávě obsažen součet všech transformací od místa poslední aktivace. Pokud má atribut autoOffset při deaktivaci hodnotu TRUE, nastaví se atribut offset na hodnotu naposledy vyslané zprávy (rotation nebo translation)_changed a vyšle se z uzlu zpráva offset_changed s hodnotou nového offsetu. Takto se mohou změny postupně kupit a uživatel může používat senzor např. jako prostorový trackball. Atribut autoOffset s hodnotou FALSE zakazuje při deaktivaci nastavovat offset a vysílat změny offsetu z uzlu.

    5. TimeSensor
    6. Tento uzel slouží k nařízení jakýchsi vnitřních hodin, které se využívají k vyvolání různých dějů.

      typ parametru

      typ dat

      název

      iniciální hodnota

      význam

      exposedField

      SFTime

      startTime

      0

      absolutní čas, po jehož dosažení zahájí časovač práci

      SFTime

      stopTime

      0

      absolutní čas, po jehož dosažení ukončí časovač práci

      SFTime

      cycleInterval

      1

      nezáporná délka časové smyčky; v sekundách

      SFBool

      loop

      FALSE

      povolení generování časových událostí v nekonečné smyčce

      SFBool

      enabled

      TRUE

      povolení práce časovače

      eventOut

      SFBool

      isActive

      bylo zahájeno či ukončeno generování časových událostí časovačem

      SFTime

      time

      plynule generovaný absolutní čas

      SFTime

      cycleTime

      absolutní čas zahájení další časové smyčky

      SFTime

      fraction_changed

      plynule generovaná poměrná hodnota uplynulého času v rámci jedné smyčky, tj.v rozsahu [0,1]

      Rodič:

      žádný

      Potomek:

      žádný

      cycleInterval

      Položka cycleInterval (délka cyklu) je typu SFTime a slouží k nastavení délky jednoho cyklu. Tato délka se určuje v sekundách.

      enabled

      Pokud má atribut enabled (povoleno) hodnotu TRUE, znamená to, že senzor je aktivní. Hodnota FALSE znamená, že senzor není aktivní. Tato hodnota se může během času změnit v případě, že do uzlu dorazí událost set_enabled (nastav, zda aktivní). Ta nahradí hodnotu enabled svou hodnotou.

      loop

      Hodnota TRUE atributu loop (smyčka) znamená, že po skončení jednoho cyklu se cyklus bude znovu opakovat. V případě hodnoty FALSE se hodiny zastaví a nebude následovat další opakování.

      cycleTime

      S každým novým spuštěním cyklu se vyšle událost cycleTime (čas cyklu), která obsahuje čas, kdy se toto spuštění provedlo.

      fraction__changed

      Účelem této události je monitorovat, jak velká část cyklu již proběhla. Číslo 0 představuje začátek cyklu a konec představuje 1. Mezi těmito okamžiky se vysílá číslo z intervalu (0,1), které odpovídá aktuální pozici.

      isActive

      V okamžiku, kdy se spouští hodiny, vyšle se z uzlu událost isActive (je aktivní) s hodnotou TRUE. Zároveň s ukončením cyklu se vyšle událost isActive s hodnotou FALSE.

      time

      Tento atribut je podobný atributu fraction_changed, ale s tím rozdílem, že se vysílá absolutní čas namísto procentuálního vyjádření.

      V následujícím příkladu je ukázána funkce časového mechanismu. Pokud uživatel klikne na žlutou kouli, spustí hodiny, které odměří přesně dvě sekundy (cycleInterval = 2). V okamžiku aktivace časového mechanismu se změní barva koule na červenou. Nad koulí bude zobrazena hodnota vysílané zprávy fraction_changed, a když se hodiny zastaví, vrátí se barva koule opět na žlutou.

      #VRML V2.0 utf8

      Transform{

      translation 0 –2 0

      children[

      Shape {

      geometry Sphere{}

      appearance

      Appearance {

      material DEF mujMat Material {

      diffuseColor 1 1 0 # zluty material

      }

      }

      }

      DEF tlacitko TouchSensor{} # koule bude reagovat

      # na stisknuti tlac. na mysi

      DEF casovac TimeSensor{

      cycleInterval 2

      }

      ]

      }

      Shape{

      geometry

      DEF tabule Text {

      string "Klikni na kouli!" # informace pro uzivatel, co

      # ma delat

      fontStyle

      FontStyle {

      size .5 # velikost pisma

      justify "MIDDLE" # vystredene pismo

      }

      }

      }

      DEF java Script{

      eventIn SFFloat input

      eventIn SFBool jeAktivni

      eventOut MFString outputStr # vystupni retezec pro uzel Text

      eventOut SFColor outputColor # vystupni barva pro uzel

      # Material

      url"javascript:

      function input(value){

      outputStr[0]='fraction_changed'; # na prvnim radku je

      # nazev atributu

      outputStr[1] =value; # na druhem jeho

      # hodnota

      }

      function jeAktivni(value){

      outputColor[0] = 1; # prvni polozka je u

      # zlute i u cervene 1

      outputColor[2] = 0; # treti polozka je u obou 0

      if (value) # a ted to zavisi na stavu

      # casoveho spinace

      outputcolor[1] = 0; # je aktivni: barva bude 1 0 0

      #(cervena)

      else

      outputColor[1] = 1; # je pasivni: barva bude 1 1 0

      #(zluta)

      }

      "

      }

      # takto buudou putovat udalosti:

      # stiskem tlacitka se spusti cas, jako pocatek se bude brat

      # cas stisku

      ROUTE tlacitko.touchTime TO casovac.startTime

      # vystup z casovace se prevede na vstup javascriptu

      ROUTE casovac.fraction_changed TO java.input

      # udalost isActive urcuje barvu koule, ale musi se zpracovat

      # ve Scriptu

      ROUTE casovac.isActive TO java.jeAktivni

      # vysledny retezec putuje k zobrazeni do uzlu Text

      ROUTE java.outputStr TO tabule.string

      # vysledna barva se musi dostat k uzlu Material

      ROUTE java.outputColor TO mujMat.diffuseColor

      Obrázek O–11: Použití senzoru TimeSensor

    7. VisibilitySensor
    8. Uzel VisibilitySensor se používá k detekci míst nebo objektů, které jsou v zorném poli uživatele. Uzel dá tuto skutečnost najevo pomocí, jejichž zásluhou mohou být spuštěny další akce, např. spuštění animace.

      Pokud se ve scéně vyskytne několik senzorů najednou, pracuje každý senzor nezávisle na ostatních. To platí i při několikanásobné detekci, posílání a přijímání zpráv. Nemůže se stát, že nějaká zpráva zabloudí k jinému senzoru.

      typ parametru

      typ dat

      název

      iniciální hodnota

      význam

      exposedField

      SFVec3f

      center

      0 0 0

      těžiště kvádru, jehož viditelnost je sledována

      SFVec3f

      size

      0 0 0

      nezáporné rozměry kvádru

      SFBool

      enabled

      TRUE

      povolení práce detektoru

      eventOut

      SFBool

      isActive

      část kvádru se objevila na obrazovce, resp. Kvádr přestal být viděn (zobrazován)

      SFTime

      enterTime

      čas, ve kterém nabude parametr isActive hodnoty TRUE

      SFTime

      exitTime

      čas, ve kterém nabude parametr isActive hodnoty FALSE

      Rodič:

      žádný

      Potomek:

      žádný

      center a size

      Těleso, které má být detektováno, určuje atribut center a atribut size. První atribut určuje jeho střed a atribut size jeho velikost. Oba atributy jsou ovlivňovány zděděnými transformacemi od rodičů.

      enabled a isActive

      Pomocí atributu enabled lze senzor zprovoznit nebo ho vyřadit z provozu. Pokud bude hodnota TRUE v provozu, hodnota FALSE ho z provozu vyřadí. V případě, že je senzor v provozu a do zorného pole uživatele se dostane inkriminovaný objekt, vyšle senzor zprávu isActive s hodnotou TRUE. Je–li senzor v provozu a objekt zmizí uživateli z obzoru, vyšle se zpráva isActive s hodnotou FALSE. Není–li uzel v provozu, nebude vysílat žádné zprávy.

      enterTime a exitTime

      Jestliže je vysílána z uzlu zpráva isActive s hodnotou TRUE, ve stejném okamžiku se zjistí čas a vyšle se ze senzoru v podobě události enterTime (čas vstupu). Naopak v okamžiku, kdy se objekt ztratil z obzoru, vyšle se ze senzoru zpráva exitTime (čas opuštění) s hodnotou aktuálního času. Tato událost je vysílána současně s událosisActive, ovšem pouze má–li hodnotu FALSE.

      V následujícím příkladu byla použita žlutá krychle jako testovací objekt pro detekci "viditelnosti". Pokud má uživatel tuto krychli vidět, bude vedle ní svítit nápis "Krychle je videt". Otočí–li se uživatel tak, aby neviděl krychli, ale aby viděl nápis, bude na něm svítit "Krychle neni vidět".

      #VRML V2.0 utf8

      Transform {

      children [

      Shape { # testovana zluta krychle

      geometry Box {}

      appearance Appearance {

      material Material {

      diffuseColor 1 1 0

      }

      }

      }

      DEF VS VisibilitySensor { # senzor zjistuje, zda uzivatel

      # vidi krychli

      size 2 2 2

      }

      ]

      }Transform {

      translation 3 0 0

      children

      Shape { # napis s informaci, zda je ci

      # není krychle videt

      geometry

      DEF TXT Text { # na pocatku se nevypisuje nic

      #(chybi atribut string)

      }

      }

      }DEF java Script{

      eventIn SFBool input # prichozi zprava od senzoru

      eventOut MFString output # vystupni zprava pro uzel Text

      url "javascript:

      function input(val){

      if (val) output[0] = 'Krychle je videt';

      if (!val) output[0] = 'Krychle neni videt';

      }

      "

      }

      # putovani zprav:

      # senzor preda udaj je/neni videt do JavaScripu pres fci input

      ROUTE VS.isActive TO java.input

      # napis se preda do uzlu Text (pojmenovan TXT)

      ROUTE java.output TO TXT.string

       

      Obrázek O–12: Použití uzlu VisibilitySenzor

    9. TouchSensor

    Tento uzel definuje vlastnosti tlačítka. Pokud je synem některého z rodičovských uzlů společně s uzlem Shape, potom se tento uzel stává tlačítkem.

    typ parametru

    typ dat

    název

    iniciální hodnota

    význam

    exposedField

    SFBool

    enabled

    TRUE

    povolení práce detektoru

    eventOut

    SFBool

    isOver

    kurzor se dostal nad objekt nebo jej opustil

    SFBool

    isActive

    stav tlačítka pro aktivaci kurzoru se změnil

    SFTime

    touchTime

    čas uvolnění tlačítka pro aktivaci kurzoru

    SFVec3f

    hitPoint_changed

    bod na povrchu objektu, na který ukazuje kurzor, se změnil

    SFVec3f

    hitNormal_changed

    normála v bodě, který odpovídá parametru hitPoint_changed

    SFVec2f

    hitTexCoord_changed

    souřadnice textury v bodě, který odpovídá parametru hitPoint_changed

    Rodič:

    skupinový uzel, typicky Transform nebo Group (parametr children)

    Potomek:

    žádný

    Zvláštnost:

    objekty, které jsou citlivé na polohu a aktivitu kurzoru, jsou sourozenci tohoto uzlu

    enabled

    Pokud tento atribut nabývá hodnoty TRUE, pak je senzor aktivní, tzn. že bude reagovat na podněty od myši. V případě, že nabývá hodnoty FALSE, senzor nebude aktivní a objekt nebude reagovat.

    hitNormal_changed, hitPoint_changed a hitTexCoord_changed

    Pokud platí, že událost isOver nabývá hodnoty TRUE, a jestliže uživatel pohybuje kurzorem, generují se události hitNormal_changed, hitPoint_changed a hitTexCoord. Průsečík mezi vrcholem kurzoru (hot spot) a objektem se předá událostí hitPoint_changed. Kolmice vztyčená v tomto bodě se předá událostí hitNormal_changed. Souřadnice bodu v případné textuře umístěné na této ploše se předají událostí hitTexCoord_changed. Všechny tři události se dále směrují standardním postupem.

    isActive

    Jestliže umístí uživatel kurzor myši nad daný objekt a stiskne levé tlačítko, pak se generuje událost isActive typu SFBool mající hodnotu TRUE. Tato událost je směrována uzlem ROUTE do příslušného jiného uzlu, který na tuto událost reaguje odpovídajícím způsobem.

    isOver

    Tato událost je podobná jako isActive (je aktivní) s tím rozdílem, že uživatel nemusí stisknout žádné tlačítko. Stačí pouze umístit kurzor nad daný objekt (senzor). Tímto způsobem se vygeneruje událost isOver (je nad) typu SFBool s hodnotou TRUE. Událost se dále směruje do dalšího uzlu.

    touchTime

    V okamžiku, kdy je kurzor myši nad objektem a uživatel stiskne levé tlačítko myši, se zaznamená čas. Tento čas se vyšle jako událost touchTime (čas dotyku) s hodnotou naměřeného času. Událost směruje do dalších uzlů.

    Tento uzel patří k nejpoužívanějším. Dovoluje totiž vytvořit z jakéhokoliv objektu tlačítko reagující na uživatelův podnět. V následujícím příkladu je tímto tlačítkem jakási protažená hvězda. Při stisku levého tlačítka se vyšle zpráva ze senzoru do časového senzoru, který bude po dobu pěti sekund měnit tvar tělesa.

    #VRML V2.0 utf8

    Transform {

    children[

    DEF myTouch TouchSensor{} # dotykovy sensor s nazvem

    # myTouch

    Shape {

    geometry DEF myEx Extrusion{ # hvezdicove teleso

    creaseAngle 2

    crossSection [ 0 5, 1 1, # body prurezu

    5 0, 1 –1,

    0 –5, –1 –1,

    –5 0, –1 1]

    spine [0 0 0, 0 30 0, 0 30 30] # draha pro tazeni

    orientation [0 1 0 0, # orientace v

    0 1 0 .78, # bodech drahy

    0 1 0 1.57]

    scale [3 3, 1 1, 2 2] # zmena meritka v bodech drahy

    }

    appearace Appearance {

    material Material {

    diffuseColor 1 1 0

    } # zluta barva

    }

    }

    DEF myInter CoordinateInterpolator{

    key [0.0 0.5 1] # pro tyto tri hodnoty je

    # vystup definovan v poli keyValue

    keyValue [0 0 0, 0 30 0, 0 30 30 # vystup pro první

    # hodnotu

    0 0 0, 0 0 30, 0 30 30 # pro druhou

    0 0 0, 0 30 0, 0 30 30 # pro treti

    ]

    }

    DEF myClock TimeSensor {cycleInterval 5} # delka cyklu je

    # 5 s

    ]

    }

    # Putovani udalosti:

    # casem kdy, uzivatel kliknul, se zapne cas. mechanismus

    ROUTE myTouch.touchTime TO myClock.startTime

    # pomerna cast intervalu z hodin urcuje interpolovanou hod.

    ROUTE myClock.fraction_changed TO myInter.set_fraction

    # interpolovana h. meni drahu v uzlu myEx (Extrusion)

    ROUTE myInter.value_changed TO myEx.set_spine

  3. Závěr

Cílem této diplomové práce bylo čtenáře seznámit s jazykem VRML. Vzhledem k tomu, jakým směrem se rozvíjí informační technologie, jedná se o jazyk, který bude jistě hojně používán a dále rozvíjen.

V první části je uvedena krátká, ale dynamická historie vývoje tohoto jazyka a co v nejširší možné míře probrána syntaxe všech geometrických těles.

Druhá část se pak věnuje popisu dalších dekorativních prvků nezbytných pro vývoj virtuálního světa, jako jsou textury pozadí, stanoviště. Jsou zde také uvedeny senzory, které umožňují, aby statický svět začal dýchat.

Vzhledem k časové náročnosti při tvorbě tohoto dokumentu a podmínek při jeho vytváření, však nebylo možné zahrnout všechny prvky jazyka.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Seznam použité literatury

[1] J. Zrzavý: VRML – tvorba dokonalých www stránek

[2] J. Žára: VRML97 Laskavý prùvodce virtuálními svìty.

[3] http://sgi.felk.cvut.cz/LaskavyPruvodce/index.html

[4] http://www.VRML.org/Specifications/VRML97

[5] http://www.cosmosoftware.com

[6] http://www.intervista.com

[7] http://www.superscape.com