Tvoříme trojrozměrné scény v jazyce VRML 2

15. 11. 2007
Doba čtení: 11 minut

Sdílet

V dnešním článku si na pěti příkladech ukážeme tvorbu trojrozměrné scény v jazyce VRML verze 2. Druhá verze tohoto jazyka přinesla zásadní změny jak v samotném způsobu zápisu objektů, tak i ve skriptování. Pro tvorbu scén si prozatím vystačíme s libovolným textovým editorem a prohlížečem VRML souborů.

Obsah

1. Tvoříme trojrozměrné scény v jazyce VRML 2
2. První demonstrační příklad – zobrazení krychle s implicitními parametry i rozměry
3. Druhý demonstrační příklad – aplikace lineární transformace na krychli
4. Třetí demonstrační příklad – definice objektu a aplikace lineární transformace na kouli
5. Čtvrtý demonstrační příklad – změna materiálu (optických vlastností povrchu)
6. Pátý demonstrační příklad – vykreslení všech základních geometrických tvarů a textu
7. Odkazy na další informační zdroje
8. Obsah dalšího pokračování tohoto seriálu

1. Tvoříme trojrozměrné scény v jazyce VRML 2

V předchozí části tohoto seriálu jsme si řekli základní informace o (v některých ohledech nesplněném) poslání grafického formátu VRML, dnes přišel čas na praktické ukázky. Ty budou napsány v jazyce VRML verze 2, a to především z toho důvodu, že ve VRML 2 se poměrně zásadním způsobem rozšířily možnosti tohoto jazyka a také proto, že jsou i v Linuxu dostupné prohlížeče, které dokážou VRML 2 načíst a zobrazit. Všechny dnešní demonstrační příklady byly odzkoušeny mj. v aplikaci Lookat a GtkLookat, což jsou jednoduché prohlížeče souborů typu VRML. Aplikace Lookat vyžaduje pouze spuštěný systém X Window, GtkLookat je založena – jak ostatně její jméno napovídá – na knihovně GTK. Screenshoty byly vytvořeny právě z programu GtkLookat. Zdrojové texty se dají po uložení do souborů s koncovkou .wrl naimportovat i do některých modelovacích programů. Samotné aplikace Lookat a GtkLookat se nachází například v repozitářích Debianu i Ubuntu.

Kromě prohlížeče VRML souborů budeme ještě potřebovat textový editor. Může se jednat prakticky o jakýkoli editor schopný ukládat texty bez formátovacích značek, tj. například joe/jstar/jmacs, vi/vim/elvis/nvi, pico/nano, Emacs, gedit, jEdit, notepad atd. Pokud by bylo zapotřebí zapisovat znaky mimo základní sadu ASCII (například češtinu apod.), musí zvolený textový editor zvládat kódování UTF-8, ale všechny dnešní demonstrační příklady pro jednoduchost používají pouze ASCII znaky (v tomto případě žádný rozdíl mezi ASCII a UTF-8 nenajdeme). Konce řádků mohou být kódovány různě – jak podle zvyklostí Unixu, tak i DOSu. Jednotlivé schopnosti VRML 2 budou vysvětleny před zdrojovým kódem demonstračních příkladů.

2. První demonstrační příklad – zobrazení krychle s implicitními parametry i rozměry

V prvním demonstračním příkladu je ukázána především obecná struktura souborů uložených ve formátu VRML 2. Na prvním řádku musí být zapsána hlavička formátovaná do tří částí – označení typu souboru, specifikace jeho verze a konečně specifikace kódování. Pro VRML 2 je vyžadováno kódování UTF-8 (ASCII kódování lze v oblasti tisknutelných znaků chápat jako podmnožinou kódování UTF-8). Následuje uzel typu WorldInfo, který obsahuje základní metainformace o celé scéně: typicky titulek (ten mohou prohlížeče zobrazit v titulkovém pruhu) a další informace uložené jako pole řetězců. Tyto řetězce mohou být zpracovávány indexovacími roboty a zahrnuty například do vyhledávacích enginů. Druhý uzel typu Shape již obsahuje informace o objektu. Nejprve je nastaven vizuální vzhled objektu (uzel appearance s poduzlem material) a poté geometrické vlastnosti objektu v poduzlu geometry.

#VRML V2.0 utf8
# verze 2.0 vyzaduje kodovani UTF-8

# ---------------------------------------------------------
# Prvni demonstracni priklad trojrozmerne sceny
# popsane jazykem VRML 2.0
# Priklad je soucasti serialu "Graficke formaty"
# (/serialy/graficke-formaty/)
# vychazejiciho na Root.cz (http://www.root.cz)
#
# Zobrazeni krychle s implicitnimi parametry i rozmery
# ---------------------------------------------------------

# metainformace o trojrozmerne scene jako celku
# (mohou ji pouzit jak prohlizece, tak i indexovaci roboti)
WorldInfo {
    title "3D scena se dvema objekty"
    info ["Autor: Pavel Tisnovsky, 2007"
         "sireno pod licenci GPL "
         "(zde mohou byt dalsi texty"]
}

# vytvoreni jednoducheho objektu (krychle)
# s puvodnim (implicitnim) nastavenim vsech parametru
Shape {
    # vzhled objektu - negeometricke informace
    appearance Appearance {
        material Material {
        }
    }
    # tvar objektu - geometricke informace
    # implicitni velikost: 2x2x2 metry
    geometry Box {
    }
}

# ---------------------------------------------------------
# finito
# --------------------------------------------------------- 

vrml1
Screenshot prvního demonstračního příkladu

3. Druhý demonstrační příklad – aplikace lineární transformace na krychli

Ve druhém demonstračním příkladu je ukázán jeden ze způsobů aplikace lineárních transformací na původní objekt krychle. Celá specifikace krychle, tj. uzel Shape, je vložen dovnitř uzlu Transform, ve kterém jsou nastaveny tři transformace – posun (zadaný v metrech), otočení (specifikováno osou otočení a úhlem v radiánech) a změna měřítka (bezrozměrné hodnoty). Transformace se provádí v zapsaném pořadí (ve skutečnosti si prohlížeč vytvoří jednu transformační matici, kterou následně použije). Tento uzel obsahuje atribut children, do kterého je možné vkládat jeden či více objektů, na které jsou aplikovány zvolené transformace. Skládání transformací je jednoduché – stačí hierarchicky do sebe vložit více uzlů Transform. Při ručním vytváření VRML souborů asi brzy narazíte na problém, že základní geometrické tvary se vždy musí posouvat pomocí transformace (a ne například změnou středu koule), což je zdlouhavé, ale odráží to logiku zápisu celé 3D scény ve formě hierarchického stromu.

#VRML V2.0 utf8
# verze 2.0 vyzaduje kodovani UTF-8

# ---------------------------------------------------------
# Druhy demonstracni priklad trojrozmerne sceny
# popsane jazykem VRML 2.0
# Priklad je soucasti serialu "Graficke formaty"
# (/serialy/graficke-formaty/)
# vychazejiciho na Root.cz (http://www.root.cz)
#
# Aplikace transformace na krychli
# ---------------------------------------------------------

# metainformace o trojrozmerne scene jako celku
# (mohou ji pouzit jak prohlizece, tak i indexovaci roboti)
WorldInfo {
    title "Druha 3D scena se dvema objekty"
    info ["Autor: Pavel Tisnovsky, 2007"
         "sireno pod licenci GPL "
         "(zde mohou byt dalsi texty"]
}

# transformace aplikovana na vsechny poduzly
Transform {
    translation 0 1 0
    rotation    0 1 0 0.78    # 0.75 rad = 45 stupnum
    scale       1 3 5
    children [
        # vytvoreni jednoducheho objektu (krychle)
        # s puvodnim nastavenim vsech parametru
        # (na krychli je aplikovana transformace)
        Shape {
            # vzhled objektu - negeometricke informace
            appearance Appearance {
                material Material {
                }
            }
            # tvar objektu - geometricke informace
            # (puvodni tvar 2x2x2 metry je podroben transformaci)
            geometry Box {
            }
        }
    ]
}

# ---------------------------------------------------------
# finito
# --------------------------------------------------------- 

vrml2
Screenshot druhého demonstračního příkladu

4. Třetí demonstrační příklad – definice objektu a aplikace lineární transformace na kouli

Ve třetím demonstračním příkladu je ukázán jiný způsob aplikace lineárních transformací. Nejdříve je vytvořen objekt, v tomto případě koule, který je pojmenován pomocí idiomu DEF jméno. Uvnitř uzlu, ve kterém je zapsána transformace, se již nemusí celý text s definicí objektu znovu vypisovat, ale místo toho se použije USE jméno. Z tohoto hlediska je možné DEF a USE považovat za vytvoření a použití makra (další význam si ukážeme příště). Všimněte si, že se ve skutečnosti zobrazí dvě koule. První je vytvořena samotným uzlem Shape, druhá pak příkazem USE OBJEKT, tj. i při použití DEF OBJEKT je geometrický objekt nejenom definován, ale i vytvořen.

#VRML V2.0 utf8
# verze 2.0 vyzaduje kodovani UTF-8

# ---------------------------------------------------------
# Treti demonstracni priklad trojrozmerne sceny
# popsane jazykem VRML 2.0
# Priklad je soucasti serialu "Graficke formaty"
# (/serialy/graficke-formaty/)
# vychazejiciho na Root.cz (http://www.root.cz)
#
# Aplikace transformace na kouli s vyuzitim definice tvaru
# ---------------------------------------------------------

# metainformace o trojrozmerne scene jako celku
# (mohou ji pouzit jak prohlizece, tak i indexovaci roboti)

WorldInfo {
    title "Druha 3D scena se dvema objekty"
    info ["Autor: Pavel Tisnovsky, 2007"
         "sireno pod licenci GPL "
         "(zde mohou byt dalsi texty"]
}

# vytvoreni jednoducheho objektu (koule)
# s puvodnim nastavenim vsech parametru
DEF OBJEKT Shape {
    # vzhled objektu - negeometricke informace
    appearance Appearance {
        material Material {
        }
    }
    # tvar objektu - geometricke informace
    geometry Sphere {
    }
}

Transform {
    translation 0 1 0
    rotation    0 1 0 0.78    # 0.75 rad= 45 stupnum
    scale       2 1 2
    # zobrazen bude jak puvodni, tak i transformovany objekt
    children [
        USE OBJEKT
    ]
}

# ---------------------------------------------------------
# finito
# --------------------------------------------------------- 

vrml3
Screenshot třetího demonstračního příkladu v režimu solid shading

vrml3a
Screenshot třetího demonstračního příkladu v režimu wireframe

5. Čtvrtý demonstrační příklad – změna materiálu (optických vlastností povrchu)

Ve čtvrtém demonstračním příkladu jsou ukázány způsoby změny optických vlastností povrchu vykreslovaných objektů. Vzhledem ke způsobům vykreslování 3D grafiky na grafických akcelerátorech je použit rychlý a přitom poměrně věrohodný Phongův osvětlovací model – viz seriál o grafické knihovně OpenGL. Základní vlastností povrchu je samozřejmě barva, která je zadána v poduzlu material atributem diffuseColor (hodnotou jsou tři složky R, G, B v rozsahu 0,0–1,0). Při zadání pouze této barvy se vytvoří objekt, na kterém nebudou patrné žádné odlesky od světelného zdroje – typickým reálným materiálem jsou některé umělé hmoty na bázi tvrzeného PVC nebo neleštěné dřevo.

Pomocí atributu specularColor je možné zadat barvu odlesků. Typicky se nastavuje buď barva světelného zdroje nebo čistě bílá barva, i když se samozřejmě dá nastavit libovolný jiný odstín (ovšem scéna pak může vypadat nevěrohodně). Míru odrazivosti povrchu lze doladit atributem shininess, který leží v rozsahu 0,0–1,0. Malé hodnoty způsobí tvorbu plošně velkých, ale nevýrazných odlesků (hladké umělé hmoty, plexisklo), velké hodnoty naopak malé výrazné odlesky (leštěný kov, sklo). Pomocí atributu transparency lze nastavit míru průhlednosti povrchu, opět v rozsahu 0,0–1.0. Rozmístění objektů ve scéně musí být řešeno pomocí transformací.

#VRML V2.0 utf8
# verze 2.0 vyzaduje kodovani UTF-8

# ---------------------------------------------------------
# Ctvrty demonstracni priklad trojrozmerne sceny
# popsane jazykem VRML 2.0
# Priklad je soucasti serialu "Graficke formaty"
# (/serialy/graficke-formaty/)
# vychazejiciho na Root.cz (http://www.root.cz)
#
# Zmena materialu povrchu
# ---------------------------------------------------------

# metainformace o trojrozmerne scene jako celku
# (mohou ji pouzit jak prohlizece, tak i indexovaci roboti)

WorldInfo {
    title "Druha 3D scena se dvema objekty"
    info ["Autor: Pavel Tisnovsky, 2007"
         "sireno pod licenci GPL "
         "(zde mohou byt dalsi texty"]
}



# prvni objekt vytvoreny z difuzniho "plastu"
Transform {
    translation -2 0 0
        children [
        # vytvoreni jednoducheho objektu (koule)
        # s puvodnim nastavenim vsech parametru
        Shape {
            # vzhled objektu - negeometricke informace
            appearance Appearance {
                # material zcela bez lesku
                material Material {
                    diffuseColor  0.0 0.5 1.0
                    specularColor 0.0 0.0 0.0
                }
            }
            # tvar objektu - geometricke informace
            geometry Sphere {
            }
        }
    ]
}



# druhy objekt pouziva material s odlesky
Transform {
    translation 0 0 0
        children [
        # vytvoreni jednoducheho objektu (koule)
        # s puvodnim nastavenim vsech parametru
        Shape {
            # vzhled objektu - negeometricke informace
            appearance Appearance {
                # odlesky jsou ciste bile (typicka hodnota)
                material Material {
                    diffuseColor  0.0 0.5 1.0
                    specularColor 1.0 1.0 1.0
                }
            }
            # tvar objektu - geometricke informace
            geometry Sphere {
            }
        }
    ]
}



# treti objekt pouziva material s odlesky se zmenenou odrazivosti
Transform {
    translation 2 0 0
        children [
        # vytvoreni jednoducheho objektu (koule)
        # s puvodnim nastavenim vsech parametru
        Shape {
            # vzhled objektu - negeometricke informace
            appearance Appearance {
                # odlesky jsou ciste bile (typicka hodnota)
                # zmena odrazivosti objektu (0.0-1.0)
                material Material {
                    diffuseColor  0.0 0.5 1.0
                    specularColor 1.0 1.0 1.0
                    shininess 0.8
                }
            }
            # tvar objektu - geometricke informace
            geometry Sphere {
            }
        }
    ]
}



# ctvrty objekt je polopruhledny
Transform {
    translation 0 -2 0
        children [
        # vytvoreni jednoducheho objektu (koule)
        # s puvodnim nastavenim vsech parametru
        Shape {
            # vzhled objektu - negeometricke informace
            appearance Appearance {
                # odlesky jsou ciste bile (typicka hodnota)
                # zmena pruhlednosti objektu
                material Material {
                    diffuseColor  1.0 0.0 0.5
                    specularColor 1.0 1.0 1.0
                    transparency 0.5
                }
            }
            # tvar objektu - geometricke informace
            geometry Sphere {
            }
        }
    ]
}

# ---------------------------------------------------------
# finito
# --------------------------------------------------------- 

vrml4
Screenshot čtvrtého demonstračního příkladu v režimu solid shading

vrml4a
Screenshot čtvrtého demonstračního příkladu v režimu wireframe

6. Pátý demonstrační příklad – vykreslení všech základních geometrických tvarů a textu

V posledním demonstračním příkladu jsou ukázány všechny základní (někde se píše primitivní) objekty, které lze ve VRML použít. Jedná se o krychli, kouli, válec, kužel a text. Na tyto objekty lze samozřejmě aplikovat transformace, takže se z koule stane elipsoid, z krychle kvádr apod. Implicitní rozměry (pokud nejsou zadány jiné hodnoty) odpovídají tělesům omezeným rovinami vzdálenými od počátku o 1 metr, tj. krychle má rozměry 2×2×2 metry, koule má poloměr jeden metr atd. Středy objektů leží vždy v počátku souřadného systému.

U textu je situace složitější, protože se specifikuje jak vypisovaný řetězec, tak i rozměry a zarovnání textu vůči referenčnímu bodu. Tomuto objektu se budeme věnovat i v dalších částech seriálu, kde si také ukážeme tvorbu obecných objektů definovaných pomocí plošek (modely reálných objektů je samozřejmě složité skládat s koulí, válců či kuželů, proto je použití plošek a také výškových polí poměrně rozumnou volbou mezi složitostí popisu a jeho modelovacích schopností).

#VRML V2.0 utf8
# verze 2.0 vyzaduje kodovani UTF-8

# ---------------------------------------------------------
# Paty demonstracni priklad trojrozmerne sceny
# popsane jazykem VRML 2.0
# Priklad je soucasti serialu "Graficke formaty"
# (/serialy/graficke-formaty/)
# vychazejiciho na Root.cz (http://www.root.cz)
#
# Zakladni geometricke tvary+text
# ---------------------------------------------------------

# metainformace o trojrozmerne scene jako celku
# (mohou ji pouzit jak prohlizece, tak i indexovaci roboti)

WorldInfo {
    title "Druha 3D scena se dvema objekty"
    info ["Autor: Pavel Tisnovsky, 2007"
         "sireno pod licenci GPL "
         "(zde mohou byt dalsi texty"]
}



Transform {
    translation 1.5 1.5 0
        children [
        # vytvoreni jednoducheho objektu (koule)
        # s puvodnim nastavenim vsech parametru
        Shape {
            # vzhled objektu - negeometricke informace
            appearance DEF MAT Appearance {
                material Material {
                    diffuseColor  0.0 0.5 1.0
                    specularColor 1.0 1.0 1.0
                }
            }
            # tvar objektu - geometricke informace
            geometry Sphere {
            }
        }
    ]
}



Transform {
    translation 1.5 -1.5 0
        children [
        # vytvoreni jednoducheho objektu (krychle)
        # s puvodnim nastavenim vsech parametru
        Shape {
            # vzhled objektu - negeometricke informace
            appearance USE MAT
            # tvar objektu - geometricke informace
            geometry Box {
            }
        }
    ]
}



Transform {
    translation -1.5 -1.5 0
        children [
        # vytvoreni jednoducheho objektu (valce)
        # s puvodnim nastavenim vsech parametru
        Shape {
            # vzhled objektu - negeometricke informace
            appearance USE MAT
            # tvar objektu - geometricke informace
            geometry Cylinder {
            }
        }
    ]
}



Transform {
    translation -1.5 1.5 0
        children [
        # vytvoreni jednoducheho objektu (kuzele)
        # s puvodnim nastavenim vsech parametru
        Shape {
            # vzhled objektu - negeometricke informace
            appearance USE MAT
            # tvar objektu - geometricke informace
            geometry Cone {
            }
        }
    ]
}

Transform {
    translation 0 0.5 2
        children [
        # vytvoreni jednoducheho objektu (textu)
        # s puvodnim nastavenim vsech parametru
        Shape {
            # vzhled objektu - negeometricke informace
            appearance Appearance {
                material Material {
                    diffuseColor  1.0 0.5 0.0
                    ambientIntensity  0.8
                    specularColor 1.0 1.0 1.0
                }
            }
            # tvar objektu - geometricke informace
            geometry Text {
                string "www.root.cz"
                # styl textu (pouze zakladni parametry)
                fontStyle FontStyle {
                    size 1.5
                    family "SANS"
                    justify "MIDDLE"
                }
            }
        }
    ]
}

# ---------------------------------------------------------
# finito
# --------------------------------------------------------- 

vrml5
Screenshot pátého demonstračního příkladu v režimu solid shading

vrml5a
Screenshot pátého demonstračního příkladu v režimu wireframe

ict ve školství 24

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

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

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

V následující části seriálu o grafických formátech a metaformátech si ukážeme způsob definice pozadí trojrozměrné scény, práci se světly, texturování (mapování rastrových obrázků na povrch objektů) a základy interakce se zobrazenými objekty.

Autor článku

Vystudoval VUT FIT a v současné době pracuje na projektech vytvářených v jazycích Python a Go.