Obsah
1. XML + 3D = X3D (Extensible 3D)
2. Charakteristika formátu X3D
3. Profily X3D a rozšířené API
4. Rozdíly mezi VRML syntaxí a syntaxí založenou na XML
5. Trojrozměrná scéna popsaná pomocí VRML 97
6. Trojrozměrná scéna popsaná pomocí X3D (XML syntaxe)
7. Příklad složitější trojrozměrné scény
8. Literatura a odkazy na Internetu
9. Obsah následující části tohoto seriálu
1. XML + 3D = X3D (Extensible 3D)
V předchozích devíti částech tohoto seriálu jsme si poměrně podrobným způsobem popsali způsob ukládání trojrozměrných scén pomocí deklarativního jazyka VRML (Virtual Reality Modeling Language). Tento jazyk nabízí svým uživatelům na jednu stranu mnoho zajímavých možností, například jednotný způsob reprezentace celé trojrozměrné scény pomocí stromové struktury, systém senzorů, specifikace textur popsaných polem číselných hodnot, podporou animací atd.; na stranu druhou jsou v něm však obsaženy některé části, které nebyly řešeny tím nejvhodnějším způsobem. Týká se to například nemožnosti popisu plošných tvarů (2D shapes), podporu NURBS (Non-Uniform Rational B-Splines/Surfaces) bez nutnosti použití rozšiřujících modulů apod.
Logo deklarativního jazyka VRML
Z tohoto důvodu byl krátce po vydání specifikace VRML 97 představen nový formát určený pro popis plošných i prostorových scén, který byl nazván zkratkou X3D neboli celým jménem Extensible 3D. Slovo „extensible“ použité v plném názvu tohoto formátu prozrazuje, že se jedná o formát založený na dnes velmi populárním jazyku XML (Extensible Markup Language). Ve skutečnosti je možné X3D soubory ukládat ve dvou formátech: první je založen na „starém“ VRML 97, který má své kořeny v Open Inventoru, druhý způsob zápisu je založený na XML. V následujících několika částech seriálu se s tímto formátem, který se již začíná v 3D aplikacích prosazovat, budeme zabývat podrobněji.
Jedna z podob loga jazyka X3D
2. Charakteristika formátu X3D
Grafický formát X3D z velké části vychází z formátu VRML (ostatně proto je také někdy nazýván „VRML 3.0“), ovšem opravuje některé jeho nedostatky a především umožňuje – kromě původní syntaxe odvozené od Open Inventoru – použít i syntaxi zápisu založenou na XML. To s sebou nese celou řadu předností, především jednoduché zpracování celého dokumentu pomocí velkého množství knihoven a programových API pro práci s XML (SAX a DOM existující snad pro všechny významné programovací jazyky), možnost poloautomatické serializace a deserializace prostorové scény do X3D, relativně snadné převody mezi X3D a dalšími formáty apod.
Volba XML byla v tomto případě, podobně jako u dříve popsaného vektorového grafického formátu SVG (Scalable Vector Graphics) poměrně přirozená, protože trojrozměrné scény jsou i ve VRML 97 popsány stromovou strukturou, která má svůj jasný obraz ve struktuře XML dokumentu. Pro uživatele či programátory, kteří z různého důvodu preferují původní syntaxi VRML (například již mají napsané vstupní a výstupní rutiny), je tato možnost dále zachována, i když u nově vytvářených aplikací je většinou vhodnější se přidržet XML (osobně nejsem velkým příznivcem toho, když se XML používá například na jednoduché konfigurační soubory, ale v tomto případě je volba XML vhodná a přínosná; větší „ukecanost“ XML je daní za jednodušší zpracování).
Další (neoficiální) podoba loga jazyka X3D
3. Profily X3D a rozšířené API
Poměrně důležitou a přitom praktickou součástí X3D jsou takzvané profily. Zjednodušeně řečeno se jedná o to, že v některých případech není nutné či dokonce možné, aby nějaký prohlížeč implementoval celou normu X3D, ale pouze její určitou podmnožinu. Aby bylo zcela zřejmé, o jakou podmnožinu se jedná, měl by být na začátku každého dokumentu uloženého ve formátu X3D zapsán profil, který je vyžadován pro plnohodnotné prohlédnutí tohoto souboru. Například se dá předpokládat, že mobilní zařízení či jednoduché set-top boxy budou z paměťových i rychlostních hledisek implementovat pouze některé méně náročné profily (vypnutý výpočet osvětlení, snížená velikost textur atd.), zatímco aplikace určené pro výkonné osobní počítače a rychlé grafické karty by v ideálním případě měly či mohly podporovat profily všechny.
4. Rozdíly mezi VRML syntaxí a syntaxí založenou na XML
V předchozích kapitolách jsme si řekli, že zápis prostorových scén do souborů uložených ve formátu X3D je možné provádět ve dvou variantách (nebo chcete-li, syntaxích). Je podporována jak původní syntaxe VRML 97 založená na formátu Open Inventoru, tak i syntaxe jazyka XML, se všemi požadavky na well-formed dokumenty i validitu. Pro soubory X3D ukládané v XML variantě samozřejmě existuje příslušné XSLT, takže kontrola správnosti zápisu je snadná a je pro ni možno použít mnoho nástrojů, včetně šikovných rozšíření některých textových editorů. Rozdíl mezi oběma způsoby zápisu je sice na první pohled značný, z praktického hlediska jsou si však obě syntaxe rovnocenné, alespoň co se týče schopnosti uložit reprezentaci stejných scén, tj. stejného stromu, v němž jsou uloženy všechny uzly scény. Kupodivu ani velikosti souborů obsahujících tu samou scénu se příliš neliší, i když XML formát je považovaný za příliš „ukecaný“.
5. Trojrozměrná scéna popsaná pomocí VRML 97
Pro ilustraci rozdílů mezi oběma způsoby zápisu je uveden výpis části trojrozměrné scény, ve které je uložena specifikace jednoho tělesa ve tvaru válce, který má jasně zelený povrch. Nejprve si uvedeme zápis v syntaxi kompatibilní s VRML 97, kterou již známe z předchozích deseti částí tohoto seriálu:
Transform {
children Shape {
appearance Appearance {
material Material {
diffuseColor 0 1 0
}
}
geometry {
Cylinder {
height 0.1
radius 0.5
}
}
}
}
6. Trojrozměrná scéna popsaná pomocí X3D (XML syntaxe)
Při uložení toho stejného fragmentu celé trojrozměrné scény do formátu jazyka XML dostaneme kód vypsaný pod tímto odstavcem. Všimněte si, že je popsána zcela stejná stromová struktura jako v předchozím případě, přičemž hodnoty vlastností (barva, poloměr a výška válce) jsou převedeny na hodnoty atributů. Jak je u XML zvykem, je nutné každý uzel explicitně uzavřít názvem značky, před kterou je uveden znak lomítka. V případě značek neobsahujících žádné poduzly (atributy s hodnotami však značka samozřejmě obsahovat může) lze použít zkráceného způsobu zápisu s lomítkem umístěným ihned za název značky. Po přidání hlavičky souboru a kořenovéhu uzlu by bylo možné tento soubor načíst jakýmkoli XML editorem nebo filtrem (procesorem):
<Transform>
<Shape>
<Appearance>
<Material diffuseColor="0 1 0"/>
</Appearance>
<Cylinder height="0.1" radius="0.5"/>
</Shape>
</Transform>
7. Příklad složitější trojrozměrné scény
V této kapitole si ukážeme zdrojový kód poněkud složitější trojrozměrné scény uložené ve formátu X3D, konkrétně s využitím XML syntaxe. Povšimněte si především toho, že se skutečně jedná o validní a well-formed XML soubor s (vyžadovaným) úvodním řádkem se specifikací verze XML a použitého kódování. Úvodní byty sekvence BOM – Byte Order Mark – je podle mých zkušeností vhodnější vynechat, protože s nimi mají některé XML parsery i textové editory problémy – jako první znaky v souboru očekávají znak „menší než“ následovaný otazníkem. Dále je uveden typ XML souboru včetně určení DTD, následovaný určením názvu profilu (Immersive) v kořenovém uzlu nazvaném <X3D>. Všechny ostatní uzly musí být uloženy právě v tomto uzlu. V hlavičce, tj. uzlu typu <head> jsou uloženy metainformace, které mohou být využity například indexovacími roboty k pozdějšímu vyhledání této scény podle zadaných kritérií.
Všechny geometrické objekty trojrozměrné scény i objekty reprezentující kameru či světelné zdroje jsou uloženy v uzlu nazvaném <Scene>. Pro seskupení objektů do větších skupin je možné použít buď uzel typu <Group> (pouhé seskupení pro účely další manipulace s objekty) nebo uzel typu <Transform> (seskupení se specifikací lineární transformace aplikované na všechny podřízené objekty). Při podrobnějším zkoumání obsahu souboru si můžete také všimnout toho, že geometrie těles, v našem případě koule a textového objektu, je zapsána formou atributů daného uzlu (<Sphere>, <Text>) a nikoli v poduzlu tak, jak jsme na to byli zvyklí ve VRML 97. Na příkladu poduzlu <ImageTexture> je také vidět, že je možné zadat i vícenásobné hodnoty (v tomto případě URL obrázků v pořadí jejich vyhledávání), podobně jako tomu bylo ve VRML 97 v případě polí.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 3.1//EN" "http://www.web3d.org/specifications/x3d-3.1.dtd">
<X3D profile='Immersive' version='3.1' xmlns:xsd='http://www.w3.org/2001/XMLSchema-instance' xsd:noNamespaceSchemaLocation='http://www.web3d.org/specifications/x3d-3.1.xsd'>
<head>
<meta content='HelloWorld.x3d' name='title'/>
<meta content='Simple X3D example' name='description'/>
<meta content='30 October 2000' name='created'/>
<meta content='2 December 2007' name='modified'/>
<meta content='Don Brutzman' name='creator'/>
<meta content='license.html' name='license'/>
<meta content='http://www.web3d.org/x3d/content/examples/HelloWorld.x3d' name='identifier'/>
<meta content='X3D-Edit 3.2, https://savage.nps.edu/X3D-Edit' name='generator'/>
</head>
<Scene>
<!-- Example scene to illustrate X3D tags and attributes. -->
<!-- seskupení uzlů pomocí uzlu typu Group -->
<Group>
<Viewpoint description="Hello world!" position="0 -1 7" centerOfRotation="0 -1 0"/>
<Transform rotation='0 1 0 3'>
<!-- modrozelená koule, která může být pokrytá texturou (pokud je obrázek nalezen) -->
<Shape>
<!-- geometrie objektu je zapsána formou atributů -->
<Sphere radius='1'/>
<!-- uzel typu Appearance svým obsahem zcela odpovídá VRML 97 -->
<Appearance>
<Material diffuseColor='0 0.5 1'/>
<ImageTexture url='"earth-topo.png"
"earth-topo-small.gif"
"http://www.web3d.org/x3d/content/examples/Basic/earth-topo.png"
"http://www.web3d.org/x3d/content/examples/Basic/earth-topo-small.gif"'/>
</Appearance>
</Shape>
</Transform>
<!-- transformace všech poduzlů uzlu typu Transform -->
<Transform translation='0 -2 0'>
<Shape>
<Text string='"Hello" "world!"' solid='false'>
<FontStyle justify='"MIDDLE" "MIDDLE"' />
</Text>
<!-- uzel typu Appearance svým obsahem zcela odpovídá VRML 97 -->
<Appearance>
<Material diffuseColor='0.1 0.5 1'/>
</Appearance>
</Shape>
</Transform>
</Group>
</Scene>
</X3D>
<!-- finito -->
8. Literatura a odkazy na Internetu
- Dr. Clue's VRML reference V2.0
(dokument ve formátu WinHelp) - Gavin Bell, Anthony Parisi, Mark Pesce: The Virtual Reality Modeling Language, Version 1.0 Specification,
Silicon Graphics Inc., Intervista Software
26-MAY-95 - Graef, G.L.: „Graphics Format“,
Graphics Format - Sládeček Hynek a kolektiv: „1000 File Formats“,
(freeware encyklopedie – hypertextový dokument ve formátu Microsoft Help File), 1997, 1998 - Žára J., Beneš B., Felkel P.: „Moderní počítačová grafika“,
Computer Press, Praha, 1998, ISBN 80–7226–049–9 - Žára J., Limpouch A., Beneš B., Werner T.: „Počítačová grafika – principy a algoritmy“,
Grada, 1992 - Web 3D Consortium,
http://www.web3d.org/ - X3D Specification,
http://www.web3d.org/x3d/specifications/ - X3D Wiki,
http://www.web3d.org/x3d/wiki/index.php/Main_Page - X3D Help,
http://www.web3d.org/x3d/content/examples/help.html - X3D Tooltips,
http://www.web3d.org/x3d/content/X3dTooltips.html - Extensible 3D: XML Meets VRML,
http://www.xml.com/pub/a/2003/08/06/x3d.html - Wikipedia: VRML,
http://en.wikipedia.org/wiki/Vrml - Wikipedia: Open Inventor,
http://en.wikipedia.org/wiki/Open_Inventor - Wikipedia: Web 3D Consortium,
http://en.wikipedia.org/wiki/Web3D_Consortium - Wikipedia: List of vector graphics markup languages,
http://en.wikipedia.org/wiki/List_of_vector_graphics_markup_languages - Wikipedia: XML-based standards,
http://en.wikipedia.org/wiki/Category:XML-based_standards - 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/ - Onyx Graphics VRML Development,
http://onyxgraphics.com/VRML.html - Open InventorTM,
http://oss.sgi.com/projects/inventor/ - VRML (Virtual Reality Modeling Language) and X3D,
http://xml.coverpages.org/vrml-X3D.html - Root.cz: Seriál Open Inventor,
/serialy/open-inventor/ - Root.cz: Seriál Grafická knihovna OpenGL,
/serialy/graficka-knihovna-opengl/
9. Obsah následující části tohoto seriálu
V další části seriálu o grafických formátech a metaformátech si ukážeme způsob popisu plošných (2D) tvarů i prostorových (3D) objektů vkládaných do scén, které jsou uloženy do formátu odpovídajícího specifikaci X3D. Uvidíme, že základní způsob popisu scén zůstává stejný, jako tomu bylo v případě VRML, tj. objekty jsou hierarchicky uspořádány do stromové struktury, přičemž každý objekt je specifikován svým tvarem (geometrií, geometry) a vlastnostmi povrchu (vzhledem, appearance).