Hlavní navigace

Zvukové zdroje, senzory a události ve VRML

Pavel Tišnovský 10. 1. 2008

V dnešní části seriálu o grafických formátech a metaformátech si vysvětlíme význam zvukových zdrojů umisťovaných do trojrozměrných scén popsaných jazykem VRML. Dále se seznámíme s takzvanými senzory a jejich nezastupitelnou rolí při tvorbě virtuálních světů, které díky nim získávají interaktivitu.

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:

  1. 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.
  2. 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é.
  3. 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.
  4. 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é.

gfx7101

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.
gfx7102

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

  1. The Virtual Reality Modeling Language Specification,
    Version 2.0, ISO/IEC WD 14772
    http://graphcom­p.com/info/spec­s/sgi/vrml/spec/
  2. VRML 97 Specification,
    http://www.web3d­.org/x3d/conten­t/examples/Ba­sic/Vrml97Spe­cification/in­dex.html
  3. VRML Tutorial,
    http://www.lig­hthouse3d.com/vrml/tu­torial/
  4. VRML (Virtual Reality Modeling Language) and X3D,
    http://xml.co­verpages.org/vrml-X3D.html
  5. Žá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.

Našli jste v článku chybu?
Lupa.cz: Slevové šílenství je tu. Kde nakoupit na Black Friday?

Slevové šílenství je tu. Kde nakoupit na Black Friday?

120na80.cz: Bojíte se encefalitidy?

Bojíte se encefalitidy?

Vitalia.cz: „Připluly“ z Německa a možná obsahují jed

„Připluly“ z Německa a možná obsahují jed

DigiZone.cz: Česká televize mění schéma ČT :D

Česká televize mění schéma ČT :D

Podnikatel.cz: Přehledná titulka, průvodci, responzivita

Přehledná titulka, průvodci, responzivita

Vitalia.cz: Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky

Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky

Lupa.cz: Avast po spojení s AVG propustí 700 lidí

Avast po spojení s AVG propustí 700 lidí

Měšec.cz: Finančním poradcům hrozí vracení provizí

Finančním poradcům hrozí vracení provizí

Podnikatel.cz: 1. den EET? Problémy s pokladnami

1. den EET? Problémy s pokladnami

120na80.cz: Rakovina oka. Jak ji poznáte?

Rakovina oka. Jak ji poznáte?

Lupa.cz: Babiš: E-shopů se EET možná nebude týkat

Babiš: E-shopů se EET možná nebude týkat

Lupa.cz: Proč firmy málo chrání data? Chovají se logicky

Proč firmy málo chrání data? Chovají se logicky

Vitalia.cz: Chtějí si léčit kvasinky. Lék je jen v Německu

Chtějí si léčit kvasinky. Lék je jen v Německu

Lupa.cz: Co se dá měřit přes Internet věcí

Co se dá měřit přes Internet věcí

Podnikatel.cz: Prodává přes internet. Kdy platí zdravotko?

Prodává přes internet. Kdy platí zdravotko?

DigiZone.cz: Sony KD-55XD8005 s Android 6.0

Sony KD-55XD8005 s Android 6.0

Lupa.cz: UX přestává pro firmy být magie

UX přestává pro firmy být magie

Podnikatel.cz: Na poslední chvíli šokuje vyjímkami v EET

Na poslední chvíli šokuje vyjímkami v EET

Lupa.cz: Google měl výpadek, nejel Gmail ani YouTube

Google měl výpadek, nejel Gmail ani YouTube

Vitalia.cz: To není kašel! Správná diagnóza zachrání život

To není kašel! Správná diagnóza zachrání život