<chapter>
    <title>eXtensible 3D - X3D</title>
    <para>
        Um die Nachteile von VRML97 aufzuräumen, hat das Web3D-Konsortium (http://web3d.org/) beschlossen einen
        Nachfolger zu spezifizieren. Da eine der Vorbedingungen war XML zur
        Formulierung der Beschreibungssprache zu verwenden entschied man sich dazu entschlossen nicht etwa eine 
        neue Version von VRML sondern ein komplett eigenständiges Format zu entwickeln. 
        Schließlich wurde im August 2001 die DTD eXtensible 3D (X3D) vorgestellt. Aktuell ist Version
        3.0, die XSD-Spezifikation hierzu findet man unter http://www.web3d.org/specifications/x3d-3.0.xsd.
        Durch die Unterstützung von XML kann bei dreidimensionalen Szenen der Inhalt der Szene von der Darstellung getrennt 
        und somit mehr Flexibilität erreicht werden.
        Prinzipien wie die Beschreibung einer Szene in Form eines hierarchischen Szene-Graphen oder die
        Methoden der Animation und Interaktion bleiben aus VRML erhalten. Im Unterschied
        zu VRML ist X3D jedoch modular aufgebaut (vgl. Abbildung 4).
    </para>
    <para>
        X3D soll alle 3D-Standards auf einen Nenner bringen. Der Standard ist offen, Plattform-unabhängig
        und Lizenz-gebührenfrei. Spezielle Features können als Pakete eingebunden
        werden und müssen nicht von proprietären Programmen realisiert werden. Allerdings
        sind X3D-Dateien noch etwas größer als VRML-Dateien. Zudem ist der Standard
        noch relativ jung und wird erst durch wenige und z.T. nicht ausgereifte Programme genutzt.
    </para>
    <para>
        Im Folgenden soll versucht werden die Grundzüge des X3D Formates anhand einiger Beispiele etwas genauer 
        zu erörtern.
        Viele der Code-Beispiele hier stammen direkt aus oder wurden wenigstens inspiriert von [3]
    </para>
    <section>
        <title>Profile</title>
        <para>
            Im Unterschied zur monolithischen Struktur von VRML97 - welche von der Anwendung eine vollständige
            Implementierung aller Features erfordert - erlaubt X3D Entwicklern nur bestimmte Untermengen der
            Spezifikation, sogenannte Profile, zu unterstützen, welche wiederum aus modularen Blöcken von
            Funktionalität - den Komponenten - zusammensetzen.
        </para>
        <para>
            Diese Komponenten-basierte Architektur erlaubt aber nicht nur die separate Implementierung einzelner
            Profile, sondern ermöglicht auch die Neu-Einführung von Features in die Spezifikation ohne bereits
            existierende Implementierungen damit auszuschließen. Deswegen ist X3D ein sehr "lebendiges" Format
            welches ständig weiterentwickelt wird.
        </para>
        <para>
            Die Basis-Profile von X3D sind:
            <itemizedlist>
                <listitem>
                    <para>Interchange - dieses Profil beschreibt die Grund-Funktionalität zur Kommunikation zwischen
                          Anwendungen. Es unterstützt Geometrie, Texturen, einfaches Lighting und Animation.
                    </para>
                </listitem>
                <listitem>
                    <para>Interactive - ermöglicht einfache Interaktion mit einer dreidimensionalen Szene indem dem 
                          Szenen-Graphen verschiedenste Sensor-knoten zur Navigation und Interaktion, fortgeschrittenes
                          Timing und erweitertes Lighting hinzufügt.
                    </para>
                </listitem>
                <listitem>
                    <para>Immersive - definiert volle Features für 3D Graphik und Interaktion, inklusive Unterstützung für
                          Audio, Kollisionsabfragen, Nebel und Scripting.
                    </para>
                </listitem>
                <listitem>
                    <para>Full - beinhaltet alle Knoten-Arten, inklusive NURBS-, H-Anim- und GeoSpatial-Komponenten.</para>
                </listitem>
            </itemizedlist>
            Des weiteren ist es trivial einfach ein VRML97 Profil zu entwerfen, in welchem alle Eigenschaften von VRML97
            enthalten sind und welches zusammen mit dem X3D Kern dessen volle Funktionalität gewährleistet. Damit ist
            X3D voll abwärts-kompatibel und es existieren einige Konverter, die VRML in X3D und
            umgekehrt umwandeln.
        </para>
        <para>
            <mediaobject>
                <imageobject>
                    <imagedata fileref="./images/x3dprofiles.eps" format="eps">
                </imageobject>
                <caption>
                    <para>Abb. 4 - die X3D Baseline Profile</para>
                </caption>
            </mediaobject>
        </para>
        <para>
            Welches Profil eine X3D Datei voraussetzt steht im &lt;X3D&gt; Knoten, welcher immer das Wurzel-Element einer
            X3D Datei ist. Dieser enthält außerdem noch übliche Namensraum-Angaben usw...

            <programlisting role="X3D"><![CDATA[
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 3.0//EN"   "http://www.web3d.org/specifications/x3d-3.0.dtd">

<X3D profile='Immersive' 
     xmlns:xsd='http://www.w3.org/2001/XMLSchema-instance' 
     xsd:noNamespaceSchemaLocation='http://www.web3d.org/specifications/x3d-3.0.xsd'>
</X3D>
            ]]></programlisting>
        </para>
    </section>
    <section>
        <title>Kopf, Szene und Navigation</title>
        <para>
            Der Wurzel-knoten enthält in der Regel zwei Knoten, &lt;head&gt; und &lt;Scene&gt;. In
            &lt;head&gt; besteht die Möglichkeit einige Metainformationen wie zum Beispiel Autor und
            URL der Datei unterzubringen, während der &lt;Scene&gt;-Knoten die eigentlichen 3D-Daten
            enthält, zuvorderst den &lt;NavigationInfo&gt;-Knoten, welcher Größe, Position, Geschwindigkeit,
            Sichtweite, Typ usw. der Kamera definiert.
            
            <programlisting role="X3D"><![CDATA[
<head>
    <meta name="author" content="Michael Bayer"/>
    <meta name="created" content="11/17/2004"/>
</head>
<Scene>
    <NavigationInfo type="EXAMINE" "ANY"/>
</Scene>
            ]]></programlisting>
        </para>
    </section>
    <section>
        <title>Gruppen, Transformation, Geometrie und Material</title>
        <para>
            Szenen setzen sich meistens aus &lt;Shape&gt;-Knoten zusammen, welche wiederum &lt;Appearance&gt;-Knoten
            zur Steuerung der Erscheinung (Material, Textur...) und die eigentliche Geometrie in Gestalt einfacher
            Formen (Box, Cone, Cylinder, Sphere...), aber auch Draht- und Flächen-Modelle aus Polygonen (Line, IndexedFaceSet...)
            oder komplizierteren Strukturen (NURBS, ElevationGrid...) enthalten.
            Des weiteren kann man jeglichen Unter-knoten einer Szene mittels &lt;Group&gt;-Knoten zu einer Gruppe zusammenfassen
            um eventuell einfach damit umgehen zu können, außerdem kann man um solche Unter-knoten auch einen &lt;Transform&gt;-Knoten
            stellen der statische Transformationen wie Rotationen, Translationen und Scheerungen enthält.
           
            <programlisting role="X3D"><![CDATA[
<Group DEF="IFCube">
    <Shape>
        <Appearance>
            <Material diffuseColor='0 0.5 1'/>
        </Appearance>
        <IndexedFaceSet coordIndex='0, 1, 2, 3, -1, 7, 6, 5, 4, -1, 0, 4, 5, 1, -1, 1, 5, 6, 2, -1, 2, 6, 7, 3, -1, 3, 7, 4, 0'>
            <Coordinate point='-1.0 1.0 1.0, 1.0 1.0 1.0, 1.0 1.0 -1.0, -1.0 1.0 -1.0, -1.0 -1.0 1.0, 1.0 -1.0 1.0, 1.0 -1.0 -1.0, -1.0 -1.0 -1.0'/>
        </IndexedFaceSet>
    </Shape>
</Group>
            ]]></programlisting>

            Hier erkennt der geneigte Leser aber auch ein - der Meinung des Autors nach sehr nachteiliges - Feature von X3D: USE/DEF.
            Jeglicher Knoten-Typ innerhalb einer Szene kann mittels des Attributs "DEF=Name" einen Prototypen definieren der dann von
            anderen Knoten der selben Klasse per "USE=Name" wieder genutzt werden kann. Hier wurde anstatt eine der zahlreich
            vorhandenen Möglichkeiten Links in XML, wie zum Beispiel die XML Linking Language (XLL), zu nutzen eine eigene Methode
            entwickelt, weswegen leider der Entwickler beim Laden einer X3D-Datei nicht nur auf bekannte Mechanismen zum Parsen
            von XML zurückgreifen kann sondern den erzeugten DOM-Baum nochmals "händisch" nach-bearbeiten muss.
        </para>
    </section>
    <section>
        <title>Lighting</title>
        <para>
            X3D bietet Unterstützung für die bekannten Beleuchtungsarten aus dem 3D-Bereich: ambientes Licht, direktionales Licht,
            Kugel- und Spotlights sowie Licht emmitierende Oberflächen. Die beiden ersten Licht-Arten werden aufgrund ihrer eher
            globalen Natur im &lt;ViewPoint&gt;-Knoten definiert, für die Restlichen Licht-Arten gibt es eigene Knoten. Eine besondere
            Licht-Art ist das sogenannte "HeadLight", eine Lichtquelle welche auf der virtuellen Kamera "montiert" ist und welche 
            ebenfalls im &lt;ViewPoint&gt;-Knoten definiert oder besser abgeschalten wird, da es standardmäßig eingeschalten ist.
            
            <programlisting role="X3D"><![CDATA[
<NavigationInfo headlight='false' type='"EXAMINE" "ANY"'/>
<Group>
    <PointLight radius='12'/>
    <DirectionalLight ambientIntensity='1' direction='0 1 0' intensity='0.15'/>
</Group>
            ]]></programlisting>
        </para>
    </section>
    <section>
        <title>Sound</title>
        <para>
            Ein weiteres interessante Feature das den Allgemeingültigkeitsanspruch dieses Formates unterstreicht ist die 
            Unterstützung des Abspielens von Audio-Dateien. Neben ambienten Geräuschen welche keine bestimmte Richtung haben
            werden auch eigene &lt;sound&gt;-Knoten spezifiziert, welche genau wie alle anderen Knoten über ihre Position
            im Szenen-Graphen eine Richtung erhalten. Über diesen Knoten können sogar die Audiospuren von als Textur verwandten 
            Filmen eine Position erhalten. 

            <programlisting role="X3D"><![CDATA[
<Group>
    <Transform>
        <Sound minBack='5' minFront='5'>
            <AudioClip url=' "tone1.wav" "http://www.web3d.org/x3d/content/examples/Vrml2.0Sourcebook/tone1.wav" '/>
        </Sound>
        <Sound maxBack='100' maxFront='100' minBack='30' minFront='30'>
            <MovieTexture USE='TV' containerField='source'/>
        </Sound>
    </Transform> 
</Group>
            ]]></programlisting>
        </para>
    </section>
    <section>
        <title>Sensoren und Scripting</title>
        <para>
            Wie auch schon VRML bietet X3D eine Reihe von Sensoren an welche zum Beispiel auf Annäherung, Sichtbarkeit, Kollision oder
            Berührung durch den Mouspointer reagieren und dadurch Aktionen wie Veränderung von Eigenschaften im Szenen-Graphen
            oder das Ausführen von eingebetteten Skripten ausführen können. Als Scripte können prinzipiell beliebige 
            Scriptsprachen verwendet werden, allerdings muss das anzeigende Programm diese Sprache interpretieren können.
            
            <programlisting role="X3D"><![CDATA[
<Transform translation='-3 0 0'>
    <TouchSensor DEF='SensorButton1' description='Cyan background'/>
</Transform>
<Script DEF='Filter1'>
    <field name='set_boolean' type='SFBool' accessType='inputOnly' appinfo='filter input value'/>
    <field name='activated' type='SFBool' accessType='outputOnly' 
        appinfo='activated provides a persistent binding value, otherwise isActive events will toggle Background binding on/off.'/>
    <field name='count' type='SFInt32' value='1' accessType='initializeOnly'
        appinfo='count is only used locally, so it is declared as an interface for persistence'/>
    ]]>
    &lt;![CDATA[
    <![CDATA[

    ecmascript:

    function initialize () {
        Browser.print (' '); // skip line
        Browser.print ('Click shapes to select a background...');
        Browser.print (' '); // skip line
    }

    // setting the value of an eventOut variable also sends it as an event

    function set_boolean ( value, eventTime ) {
        // only trigger on true values so that Background stays bound
        if ( value == true ) {  
            activated = value;
            Browser.print ('Cyan background ' + count);
        } else 
        count++;  // received isActive value = false
    }

    ]]>]]&gt;<![CDATA[
</Script> 
            ]]></programlisting>
        </para>
    </section>
    <section>
        <title>Binary X3D</title>
        <para>
            Da wie schon angesprochen X3D-Dateien dazu tendieren sehr groß zu werden wird im Moment an einer Spezifikation für ein
            "Binary X3D" gearbeitet, dieses ist im Moment allerdings noch im Vorschlagsstadium. Damit bei einem solchen Format nicht 
            die Vorteile von XML zunichte gemacht werden wird aber angestrebt Binary X3D einfach als komprimiertes XML zu spezifizieren.
        </para>
    </section>
</chapter>
