Obsah
1. Zvuk a jeho význam ve virtuální realitě
2. Vytvoření zvukového zdroje ve VRML
3. Význam jednotlivých atributů uzlu Sound
4. Příklad použití zvuku v trojrozměrné scéně
5. Senzory ve VRML
6. Literatura a odkazy na Internetu
7. Obsah dalšího pokračování tohoto seriálu
1. Zvuk a jeho význam ve virtuální realitě
Nedílnou součástí většiny aplikací virtuální reality jsou zdroje zvuku, protože právě ty pomáhají utvořit žádoucí dojem prostorovosti celého virtuálního světa. Problematika zvuků a zvukových zdrojů je velmi rozsáhlá a složitá, proto si zde uvedeme pouze některé základní pojmy a principy (ostatně jedná se především o seriál o grafických formátech, nikoli o virtuální realitě). Jednou z problematických metod je získání konkrétního modelu posluchače, protože lidé při určování místa zdroje zvuku nepoužívají pouze obě „stacionární“ uši, ale i (samozřejmě nevědomky) další techniky s různými částmi lidského těla, které jim umožňují zvuk poměrně přesně lokalizovat. Mezi faktory, které ovlivňují vnímání prostorového zvuku, patří především:
- Dozvuk vznikající odrazem zvuku od předmětů umístěných ve scéně. Pomocí něj je možné zpřesnit vzdálenost a směr přicházejícího zvuku. Samozřejmě se zde také uplatňuje úloha zraku, protože člověk scénu či reálný svět zkoumá více smysly.
- Zpoždění mezi příjmem zvuku do pravého a levého ucha. Uvádí se, že maximální zpoždění, které nastane v případě, že je zdroj zvuku umístěný u jednoho ucha, je cca 0,6 ms, a i tuto malou hodnotu dokáže mozek správně vyhodnotit. Pro zdroje zvuku umístěné přímo před či přímo za posluchačem je samozřejmě zpoždění nulové.
- Pohyb hlavy, kterým si člověk upřesňuje polohu zdroje zvuku, zejména v případě vyšších frekvencí. Z toho mj. plyne, že prostorovosti nelze dosáhnout pouze za pomoci běžných sluchátek, ale je nutné zavést nějakou formu zpětné vazby mezi pohybem hlavy a aplikací virtuální reality.
- Odraz zvuku od ramen a útlum zvuku při průchodu hlavou – jde o další způsoby určení zdroje zvuku, zejména jeho vertikální polohy. Podobný význam má i tvar boltce, který působí jako směrový frekvenční filtr.
Z výše uvedeného textu je zřejmé, že faktorů, které ovlivňují vnímání prostorovosti scény, je velmi mnoho a ne všechny je možné vyřešit běžnými stereofonními sluchátky nebo dvojicí reproduktorů. My však budeme tiše předpokládat, že technická stránka tvorby zvukového výstupu je vyřešena (což ovšem není ve většině případů pravdivé) a začneme se věnovat způsobům specifikace zvukových zdrojů v jazyce VRML.
Ve VRML je zvukový zdroj představován bodem ležícím v prostoru, ze kterého se zvuk šíří. O jaký zvuk se jedná, tj. zda jde o soubor typu WAV, MIDI či MPEG, je rozhodnuto na základě uzlu typu AudioClip či MovieTexture. Ovšem pouhé umístění bodu, ze kterého se zvuk šíří, do trojrozměrné scény, pro některé zdroje zvuku nedostačuje, protože se v praxi setkáváme především se směrovými zvukovými zdroji, u nichž se charakteristika šíření zvuku do značné míry podobá reflektorovému světlu. To znamená, že mimo určení bodu, ve kterém se zvukový zdroj nachází, je zapotřebí specifikovat i směr šíření zvuku. Ovšem zvuk se typicky nešíří pouze v jednom směru nebo v „kuželi“, jak je tomu u světelného zdroje, ale bývá spíše více rozprostřen a především je na něm do značné míry patrný útlum se vzrůstající vzdáleností od zdroje zvuku.
Z tohoto důvodu je popis zvukového zdroje rozšířen o specifikaci rozměrů dvou elipsoidů. Předpokládá se, že zdroj zvuku je umístěn v blízkosti jednoho ohniska elipsoidu, přičemž platí, že uvnitř menšího elipsoidu je zvuk slyšitelný s maximální intenzitou a v oblasti mezi menším a větším elipsoidem je zvuk postupně (nelineárně) tlumen až na neslyšitelnou hodnotu. Každý elipsoid je popsán pouze pomocí dvou parametrů tak, jak je ukázáno na prvním obrázku (zdroj zvuku je tedy sice směrový, ale může být slyšet i v opačném směru, což opět napodobuje chování reálných zdrojů). Samozřejmě se jedná o velmi zjednodušený model, který však (s respektováním většinou nedostatečných parametrů reprodukčních zařízení) pro většinu potřeb aplikací virtuální reality dostačuje. Pokud je zapotřebí vytvořit zdroj zvuku, který se šíří všemi směry stejně, budou i oba parametry elipsoidu nastaveny na stejnou hodnotu. Naopak přísně směrový zdroj lze specifikovat tak, že jsou parametry minBack a maxBack nulové.

Obrázek 1: Zjednodušený model zvukového zdroje použitý ve VRML
Aby bylo možné ještě přesněji omezit prostor, ve kterém může být zvukový zdroj slyšitelný, používá se velmi často metoda, při které je zvukový zdroj, tj. dále popsaný uzel typu Sound umístěný do některého poduzlu stromu popisujícího celou prostorovou scénu v jazyce VRML. Potom platí, že rozsah působnosti zdroje zvuku je lokální na daný poduzel a případně i na jeho další poduzly. Stejnou techniku je mj. možné aplikovat i na světelné zdroje, i když ne všechny VRML prohlížeče se v tomto ohledu chovají konzistentně (pravděpodobně to souvisí s jejich implementací vazby na grafickou knihovnu OpenGL nebo Direct 3D).
2. Vytvoření zvukového zdroje ve VRML
Pomocí uzlu typu AudioClip, který jsme si podrobně popsali v předchozí části tohoto seriálu, je specifikováno chování zdroje zvuku, tj. externího souboru, ve kterém je zvuk uložen, a také způsob přehrávání, tj. načasování začátku i konce zvuku a rychlost přehrávání. To však zdaleka není vše. Podobně jako původně plošnou rastrovou texturu je možné nabalit na povrch nějakého trojrozměrného tělesa, je i zdroj zvuku možné umístit do vytvářené prostorové scény (viz předchozí kapitolu). Vzhledem k tomu, že reálné zvukové zdroje bývají mnohdy směrové (reproduktory, živé objekty apod.), lze i tuto vlastnost zvuku ve VRML souborech alespoň přibližným způsobem popsat. Pro tento účel je určen uzel typu Sound, který má následující syntaxi zápisu (vedle názvů jednotlivých atributů jsou vypsány i jejich implicitní hodnoty):
Sound {
source NULL
location 0 0 0
intensity 1
priority 0
minBack 1
minFront 1
maxBack 10
maxFront 10
spatialize TRUE
}
V další kapitole bude uvedeno podrobnější vysvětlení jednotlivých atributů takto popsaného zvukového zdroje.
3. Význam jednotlivých atributů uzlu Sound
- Atribut source: specifikace zdroje zvuku. V tomto atributu je uložen uzel typu AudioClip v případě, že je zvuk uložen ve formátu MIDI nebo WAV v externím souboru. Pokud je použit formát MPEG-1, obsahuje tento atribut uzel typu MovieTexture, což může být vzhledem ke jménu tohoto uzlu poněkud matoucí. V souboru uloženém ve formátu MPEG však vůbec nemusí být přítomen video stream (přesněji řečeno rámce – frames – obsahující video data), ale pouze zvuková stopa, tj. rámce se zvukem kódované podle algoritmů specifikovaných pro vrstvy (layers) I, II a III s bitovým tokem od 32 Kb/s (všechny tři vrstvy) až do 448 Kb/s (vrstva I), 384 Kb/s (vrstva II) či 320 Kb/s (vrstva III). Mimochodem, MPEG-1 audio vrstva číslo III dala název i populárnímu formátu MP3.
- Atribut location: specifikace umístění zvukového zdroje. Jedná se o běžný vektor obsahující tři souřadnice x, y, z. Pomocí tohoto vektoru se zvukový zdroj umísťuje v rámci prostoru trojrozměrné scény, přičemž je možné použít i obvyklé transformace aplikované na jeden uzel či celý podstrom. Zvukový zdroj se tak například může pohybovat současně s geometrickým objektem (model automobilu+zdroj zvuku obsahující hluk motoru).
- Atribut intensity: specifikace intenzity zvuku. Tento atribut může nabývat hodnot z rozsahu 0 až 1, přičemž 0 značí úplné ticho a 1 maximální možnou intenzitu. Skutečná intenzita zvuku samozřejmě závisí i na obsahu zvukového souboru. Pokud je například v souboru typu WAV uložený ztišený zvuk (zvuková vlna nedosahuje maximální možné amplitudy, ale pouze 50 % maxima), bude i maximální intenzita zvuku nižší než v případě optimálně uloženého zvuku, jehož průběh obsahuje i maximální hodnoty (samozřejmě bez ořezání).
- Atribut priority: specifikace priority daného zvukového zdroje. Tento atribut nabývá významu v případě, kdy VRML prohlížeč nemá k dispozici dostatek výpočetního výkonu ke smíšení (mixování) všech zvuků, které by v daném místě prostoru měly být slyšitelné. Poté dojde k vyhodnocení priorit zvukových zdrojů a smíšeny budou zdroje s vyšší prioritou. Také tento atribut může nabývat hodnot od 0 do 1, přičemž 0 značí nejnižší prioritu a 1 prioritu nejvyšší.
- Atribut minBack: první z délkových parametrů vnitřního elipsoidu. Vzdálenost od zdroje zvuku v jeho odvrácené poloze, kdy uživatel stojí za zdrojem zvuku. Pokud se uživatel (pozorovatel, avatar) nachází uvnitř tohoto elipsoidu, slyší zvuk s maximální intenzitou – viz druhý ilustrační obrázek.
- Atribut minFront: druhý z délkových parametrů vnitřního elipsoidu. Vzdálenost od zdroje zvuku v jeho přivrácené poloze, kdy uživatel stojí před zdrojem zvuku.
- Atribut maxBack: první z délkových parametrů vnějšího elipsoidu. Vzdálenost od zdroje zvuku v jeho odvrácené poloze, kdy uživatel stojí za zdrojem zvuku. Pokud se uživatel nachází v prostoru za tímto elipsoidem (přesněji řečeno vně vnějšího elipsoidu), již zvukový zdroj neslyší. V prostoru mezi vnitřním a vnějším elipsoidem dochází k pozvolnému snižování intenzity zvuku – opět viz druhý ilustrační obrázek.
- Atribut maxFront: druhý z délkových parametrů vnějšího elipsoidu. Vzdálenost od zdroje zvuku v jeho přivrácené poloze, v případě, že uživatel stojí před zdrojem zvuku.
- Atribut spatialize: příznak, zda se jedná o skutečný 3D zdroj zvuku nebo ambientní zvuk (zvuk na pozadí). Pokud je tento atribut nastavený na pravdivostní hodnotu FALSE, jedná se o ambientní zvuk, který není umístěný v 3D prostoru a výše uvedené atributy na něj nemají žádný vliv, samozřejmě kromě „neprostorových“ atributů source, intensity a priority. V případě nastavení tohoto atributu na hodnotu TRUE bude celý uzel považovaný za skutečný zvukový zdroj umístěný v prostoru.

Obrázek 2: Význam atributů uzlu Sound
4. Příklad použití zvuku v trojrozměrné scéně
V následujícím demonstračním příkladu je ukázáno, jakým způsobem je možné do vytvářené trojrozměrné scény vložit zdroj zvuku. Především si všimněte, že zvukový zdroj má sice nastavenou pozici v 3D prostoru, ale může být, podobě jako všechny další „geometrické“ uzly, podroben lineárním transformacím, v tomto případě posunu o vektor (0, 0,5, 0). Je samozřejmě možné použít i další typy transformací. Zdrojový kód tohoto demonstračního příkladu má tvar:
#VRML V2.0 utf8
# cela 3D scena je vlozena do jednoho uzlu
# (to pomaha pri skladani vice scen dohromady)
Group {
children [
Transform {
translation 0.0 3.0 -10.0
children
DEF floor Shape {
appearance Appearance {
# material se uplatni v pripade
# ze se nenacte textura
material Material {
diffuseColor 1.0 1.0 1.0
}
# textura aplikovana na teleso
texture ImageTexture {
url "images/Floor3.jpg"
}
# linearní transformace textury
# (posun na stred a zmena meritka)
textureTransform TextureTransform {
center 0.5 0.5
scale 3.0 3.0
}
} # konec uzlu Appearance
geometry Box {
size 50 1 50
}
}
}
# ukazka, ze i zvukovy zdroj je mozne v prostoru premistit
# pomoci transformaci
Transform {
translation 0.0 5.0 0.0
children [
# cil naseho snazeni - zvukovy soubor
Sound {
source AudioClip {
url "sounds/theme2.wav"
loop TRUE
}
minFront 40.0
minBack 40.0
maxFront 80.0
maxBack 80.0
location 19.5 7.0 -30.0
}
]
}
Transform {
translation 19.5 7.0 -30.0
rotation 0.0 1.0 0.0 5.4978
# vyznam tohoto uzlu si vysvetlime pozdeji
children [
DEF Speaker Inline {
url "speaker.wrl"
}
# senzor reagujici na dotyk
DEF Button1 TouchSensor { }
]
}
]
}
# finito
5. Senzory ve VRML
Ve VRML 2.0, resp. VRML 97 může prakticky jakýkoli uzel přijímat nebo naopak generovat takzvané události (events). Například při změně nějakého objektu (jeho posunu apod.) je generována událost, událost může být generovaná zásahem uživatele do trojrozměrné scény, tj. jeho pohybem, manipulováním s objekty (přesunem, otočením) atd. Koncept událostí je sice při prvním seznámení poněkud složitý, ale jedná se o velmi propracovaný model, který může být použitý – ovšem za předpokladu, že máme k dispozici dostatečně sofistikovaný VRML prohlížeč – k mnoha účelům, včetně vytvoření jednoduchých her (například pamětníkům určitě známou hru Spy vs. Spy lze implementovat poměrně snadno s využitím senzorů a JavaScriptu).
Klíčovou úlohu při práci s událostmi tvoří takzvané senzory, které generují události, jež mohou být navázány na nějaké další akce, podobně jako widgety jsou v klasickém GUI navázány na programový kód. Mezi základní senzory, které podle specifikace VRML 97 mohou být ve scénách použity, patří:
Název senzoru | Typ senzoru |
---|---|
CylinderSensor | dragging |
PlaneSensor | dragging |
ProximitySensor | standard |
SphereSensor | dragging |
TimeSensor | standard |
TouchSensor | standard |
VisibilitySensor | standard |
Senzory typu dragging generují události při posunu 3D předmětů, ať už pomocí myši nebo jiným polohovacím zařízením (spaceball, 3D myš, gesta), standardní senzory vyvolávají události například při viditelnosti objektu, dosažení určitého času či dotyku předmětu (tak se dají implementovat například populární vypínače ve hrách). Přesný význam senzorů spolu s příklady jejich použití si vysvětlíme v následující části tohoto seriálu.
6. Literatura a odkazy na Internetu
- The Virtual Reality Modeling Language Specification,
Version 2.0, ISO/IEC WD 14772
http://graphcomp.com/info/specs/sgi/vrml/spec/ - VRML 97 Specification,
http://www.web3d.org/x3d/content/examples/Basic/Vrml97Specification/index.html - VRML Tutorial,
http://www.lighthouse3d.com/vrml/tutorial/ - VRML (Virtual Reality Modeling Language) and X3D,
http://xml.coverpages.org/vrml-X3D.html - Žára J., Beneš B., Felkel P.: „Moderní počítačová grafika“,
Computer Press, Praha, 1998, ISBN 80–7226–049–9
7. Obsah dalšího pokračování tohoto seriálu
V následující části seriálu o grafických formátech a metaformátech dokončíme část věnovanou formátu (jazyku) VRML. Budeme se věnovat především způsobu použití senzorů, vytváření animací a spoluprací se skripty napsanými v některém podporovaném skriptovacím jazyce, typicky JavaScriptu.