Seminarausarbeitung

Thema: VRML - Virtual Reality Modeling Language

Autor: Christoph Hofmann, FH Giessen, 01.10.2001







Ich empfehle, falls noch nicht geschehen, den frei erhältlichen Cosmo Player jetzt zu installieren. Nur so werden die Beispiele in diesem Dokument korrekt angezeigt.

Begleitend zu meinem Vortrag und zu dieser Ausarbeitung finden sich weitere Informationen auf meiner speziell hierfür eingerichteten Internetseite www.ccweb.cc/vrml. Insbesondere sind dort interessante Links aufgelistet, die ich auch als Quelle für meinen Vortrag und diese Ausarbeitung benutzt habe.






Inhaltsverzeichnis

Inhaltsverzeichnis automatisch erstellt mit dem Inhaltsverzeichnis-Generator von Christoph Hofmann.
1  VRML Grundlagen
1.1  Was ist VRML?
1.2  VRML Integration in HTML
1.3  Die .wrl-Datei
1.4  Die Geschichte von VRML
1.5  Anwendungsgebiete von VRML
2  Die Sprache VRML
2.1  Statische Szene
2.2  Der geometry-Knotentyp
2.3  Der Shape-Knoten
2.4  Der Transform-Knoten
2.5  Eigenschaften definieren und wieder verwenden
2.6  Prototypen
2.7  Verlinken
2.8  Interaktion und Animation
3  Fazit








1  VRML Grundlagen

1.1  Was ist VRML?

VRML steht für Virtual Reality Modeling Language und ist genauso wie HTML eine Beschreibungssprache. Mit VRML lassen sich dreidimensionale Szenen erstellen, in denen der Betrachter sich frei bewegen kann. VRML beschreibt den vektoriellen Aufbau dreidimensionaler, polygonaler Grafikobjekte und deren Abhängigkeiten, was man "Szene" nennt. Es besteht die Möglichkeit, nicht nur statische Szenen zu erzeugen, sondern zeit- oder benutzergesteuert Objekte zu bewegen / die Szene zu verändern. Diese Interaktion ermöglicht es auch, in andere Welten/Szenen zu verlinken bzw. auf andere Webseiten zu verweisen. Der Benutzer kann so zwischen verschiedenen Welten hin- und herspringen.

VRML ist völlig unabhängig von HTML. Der eigentliche VRML-Code befindet sich in einer .WRL Datei (steht für World). Um eine solche VRML Datei anzeigen zu können, wird ein so genannter VRML Browser benötigt. Auf dem Markt sind einige Browser erhältlich, ich empfehle den kostenlos verfügbaren Cosmo-Player, welcher sich als www-Browser-Plugin installieren und sich so komfortabel in den www-Browser integrieren lässt. Eine VRML-Datei kann dann ganz einfach in eine HTML Datei eingebunden werden.

Leider besitzen die meisten Browser kein passendes Plugin von Hause aus, so dass eine manuelle Installation immer nötig sein wird. Dies trägt mit Sicherheit auch negativ dazu bei, dass VRML-Elemente in Webseiten nur äußerst selten anzutreffen sind.

1.2  VRML Integration in HTML

Um VRML in eine HTML Datei zu integrieren, muss zunächst ein VRML-Browser-Plugin installiert sein. Ich empfehle den Cosmo-Player, welcher hier zu bekommen ist: www.karmanaut.com. Dieser Player ist nicht nur für Windows, sondern auch für SGI Irix und Mac kostenlos erhältlich.

Die Einbettung einer VRML-Datei in HTML ist ganz einfach:

<EMBED SRC="vrml.wrl" WIDTH="580" HEIGHT="360">

Dieser HTML-Tag würde nun die vrml.wrl Datei in einem Rahmen von 580x360 Pixel anzeigen, vorausgesetzt das Plugin ist installiert. Für den Fall, dass das Plugin nicht installiert ist, sollte der HTML-Autor einen Hinweistext vorsehen, in dem auf eine Plugin-Downloadseite verwiesen wird.
Es ist möglich, die Navigationsleiste des Browser-Plugins auszublenden, wenn dieser das unterstützt (wie z.B. der Cosmo-Player). Dies ermöglicht es, eine 3D-Welt in eine HTML Datei ohne Übergang einzubinden, wie z.B. das FH-Logo ganz oben in diesem Dokument.

Um die Leiste auszublenden, muss das EMBED-Tag so aussehen:

<EMBED SRC="vrml.wrl" WIDTH="580" HEIGHT="360" VRML-DASHBOARD=FALSE>

1.3  Die .wrl-Datei

VRML-Szenen werden in .WRL (steht für World) Dateien gespeichert. Eine .WRL Datei muss im utf8 Format sein. Da utf8 alle ASCII-Zeichen enthält, stellt dies kein Problem dar. .WRL Dateien können mit einem ganz normalen Editor (z.B. Notepad oder vi) erzeugt werden. Die Datei muss immer mit folgender Zeile beginnen:

#VRML V2.0 utf8 Beschreibung

Das #VRML besagt, dass es sich um eine VRML-Szene handelt. V2.0 steht für die Sprachversion. Dieser Wert darf nicht verändert werden, da sonst die handelsüblichen Browser die Datei nicht anzeigen können. utf8 steht für das Dateiformat und darf ebenfalls nicht verändert werden. Mit "Beschreibung" kann eine Beschreibung für die VRML-Datei angegeben werden, muss aber nicht. Sie kann aus mehreren Wörtern bestehen und endet mit dem Zeilenende.

Es lassen sich auch sehr einfach Kommentare einfügen. Ein Kommentar muss nur mit einem # Zeichen beginnen.

Beispiel:

Shape {    # Dies ist ein Kommentar
}

1.4  Die Geschichte von VRML

Der Ursprung von VRML liegt im Jahr 1994. Mark Pesce und Tony Parisi hatten die Idee, ein Datenformat zu entwickelten, mit welchem es möglich sein sollte, 3D-Objekte in 3D-Welten im WWW darzustellen. Außerdem sollte eine freie Bewegung des Betrachters im Raum möglich sein. Im Mai 1994 stellten sie auf der ersten WWW-Konferenz in Genf die Sprache und den Prototyp des von ihnen entwickelten 3D-Browsers vor. Der Name der Sprache sollte VRML heißen, angelehnt an HTML. Zunächst stand VRML für Virtual Reality Markup Language, wurde jedoch später in Virtual Reality Modeling Language umbenannt.

Das von Silicon Graphics (SGI) entwickelte Open Inventor-Dateiformat (basierend auf OpenGL) diente als Grundlage für die Sprache. VRML kann aus beliebig verschachtelten Knoten (Nodes) bestehen, welche zusammen den Szenegraphen bilden. VRML erweiterte das Open Inventor-Dateiformat im Wesentlichen um Interaktivität und Verknüpfbarkeit (wichtig für WWW-Anwendungen).

Pesce und Parisi machten eine Mailingliste zum Thema VRML auf. Dadurch konnte auch die Öffentlichkeit mitentwickeln und VRML konnte zur unabhängigen und Plattformübergreifenden Sprache heranwachsen. Nicht nur Privatpersonen sondern auch Entwickler großer Institutionen und Firmen halfen mit. Gleichzeitig entstand das VRML-Repositorium, welches die Beiträge und Entwicklungsergebnisse zentral sammelte und so zur zentralen Austauschstätte der Community wurde.

Auf der zweiten WWW-Konferenz in Chicago wurde der Entwurf eines Sprachstandards vorgestellt, der im April 1995 dann von der Community angenommen und als VRML 1.0 bezeichnet wurde. Dies war die Grundlage für viele Entwickler von Welten, Browsern und VRML-Tools, die nun eine einheitliche Basis hatten. VRML 1.0 war nur für statische Szenen ohne Interaktivität ausgelegt.

Anfang 1996 wurde die Sprache dann um Animations- und Interaktionmöglichkeiten erweitert, was durch die Einführung von Events erreicht wurde. Weitere Details wurden in die Sprache aufgenommen, und so entstand im August 1996 die VRML 2.0 Spezifikation. Diese enthält außerdem viele Möglichkeiten, die 3D-Welt über eine Scriptsprache (z.B. Javascript) zu manipulieren. Zudem ist ein Kontakt mit der Außenwelt über die Verwendung von JAVA-Klassen möglich.

Im März 1997 wurde, nach weiteren kleinen Änderungen, aus VRML 2.0 die ISO-Version VRML 97, welche Ende 1997 dann offiziell von der ISO zum International Standards Organisation Standard erklärt wurde (ISO/IEC 14772-1:1997).

VRML 97 entspricht weitestgehend VRML 2.0. Die Browser verlangen deshalb weiterhin die Kennung V2.0 in der .WRL-Datei, und die Browser nennen sich auch VRML 2.0 Browser, nicht VRML 97 Browser. Allerdings sind die allermeisten mit VRML 97 kompatibel. VRML97 ist ein weltweit anerkannter und von Seiten der Industrie akzeptierter Standard und eine verlässliche Basis für Entwicklungen aller Art.

Im August 2001 kündigte das Web3D Consortium (direkter Nachfolger des VRML-Konsortiums) den neuen X3D Open Web3D Standard an, mit der Unterstützung einiger Browser-Hersteller. X3D soll der offizielle Nachfolger von VRML 97 sein, ist aber voll abwärtskompatibel. Eine ISO-Standardisierung wird wohl auch angestrebt. Erste X3D Browser werden für Ende 2001 erwartet.

1.5  Anwendungsgebiete von VRML

Die Darstellung von Informationen ist in der heutigen Zeit ein ganz wichtiges Thema. Zumeist bleibt einem nur die zweidimensionale Darstellungsmöglichkeit. VRML führt zwei weitere Dimensionen ein, die räumliche und die zeitliche Dimension. Dadurch ergeben sich vielseitige Darstellungsmöglichkeiten, welche Objekte lebendig erscheinen lassen. Häufig lassen sich Prototypen durch virtuelle Prototypen ersetzen, was Herstellungs- und Materialkosten einsparen hilft.

Einige Beispiele:

Mit VRML ist es möglich, die Perspektive von Diagrammen und Statistiken beliebig zu ändern sowie Interaktionen mit einzelnen Datenobjekten herzustellen.

Eine andere Anwendung findet VRML in der Visualisierung von komplexen Abläufen, beispielsweise um die Funktionsweise einer Maschine darzustellen. Der Betrachter könnte sich frei um die dreidimensionale Maschine bewegen und durch Mausklicks die Maschine bedienen.

Außerdem spielt 3D im Bereich der Forschung und Entwicklung eine wichtige Rolle - kein Auto ohne 3D-Modell und kein Möbelstück, ohne es dem menschlichen Körper angepasst zu haben. Aufwändige Windkanaltests können dreidimensional simuliert werden.

Auch im Naturwissenschaftlichen Bereich hat VRML seine Daseinsberechtigung. Es können zum Beispiel komplexe chemische Moleküle und Molekülketten einfach dargestellt werden.

Im Bereich Multimedia sind räumliche Klangdimensionen mit frei wählbaren Hörpositionen denkbar. Oder wie wäre es mit dem Erlernen einiger Tanzschritte? Im Unterhaltungs- und Spielebereich können Entwickler auf eine fertige, standardisierte Grafikengine aufbauen und sich so besser auf die Inhalte konzentrieren.

Die medizinische Ausbildung könnte durch sehr detaillierte 3D Modelle verbessert werden (z.B. der gläserne Mensch).

Vor dem Hausbau kann bereits ein Modell erstellt werden, welches das dreidimensionale Begehen der späteren eigenen vier Wände ermöglicht, noch bevor der erste Spatenstich getan ist. Natürlich inklusive kompletter Inneneinrichtung ganz nach dem persönlichen Geschmack.

Im WWW sind dreidimensionale Links und virtuelle Warenhäuser realisierbar.

2  Die Sprache VRML

VRML lässt sich in 4 Bereiche einteilen:

Prinzipiell unterscheidet VRML zwischen Groß- und Kleinschreibung. Man erkennt recht einfach die Namenskonventionen, die hier zugrunde liegen. Knoten-Namen werden immer groß geschrieben und Namen von Feldern und Ereignissen stets klein.

2.1  Statische Szene

Eine Szene besteht aus einem Szenegraphen in Baumstruktur. Der Szenegraph kann beliebig viele Objekte enthalten. Jedes Objekt besteht aus einem oder mehreren Knoten, so genannten Nodes. Jeder Knoten hat verschiedene Felder, die entweder direkt die Eigenschaften des Knotens beschreiben, oder auf einen weiteren Knoten mit weiteren Eigenschaften verweisen. Hat ein Knoten keine weiteren Unterknoten, bezeichnet man ihn als Blattknoten (Leaf-Nodes). Durch diese Verschachtelung ergibt sich eine Hierarchie welche man als Szenegraphen bezeichnet.

Es gibt eine Reihe vordefinierter Knoten, die entweder direkt verwendet oder mit Hilfe von Prototypen (PROTO) zu eigenen Knoten erweitert werden können. Ein Objekt besteht meistens aus mehreren Knoten, die durch einen Group-Knoten zusammengefasst werden können. Der Group-Knoten selber wird jedoch nur selten verwendet, da es andere Knoten gibt, die die gleichen Eigenschaften besitzen und noch weitere Funktionen haben (wie z.B. der Transform-Knoten).

Zur Darstellung der einzelnen Objekte verwendet VRML ein dreidimensionales kartesisches Koordinatensystem. Das Koordinatensystem ist rechtshändig orientiert, d.h. die positive X-Achse zeigt vom Ursprung ausgehend horizontal von links nach rechts, die positive Y-Achse vertikal von unten nach oben und die positive Z-Achse vom Bildschirm aus in Richtung des Betrachters. Rotationen oder andere Bewegungen von Objekten werden in Radient, nicht in Grad angegeben. Man kann die Rechte-Hand-Regel nutzen, um die Rotationsrichtung von Objekten zu veranschaulichen. Dabei zeigt der Daumen in Richtung der Achse um die die Rotation erfolgen soll, und die Richtung der restlichen Finger gibt die Rotationsrichtung an.

2.2  Der geometry-Knotentyp

Mit dem geometry-Knotentyp lassen sich geometrische Objekte erzeugen. Die möglichen Objekte lassen sich in zwei Kategorien einteilen. Zum einen gibt es "einfache" Standard-Objekte, zum anderen weitere komplexe Objekte, denen Punkte übergeben werden können, aus denen die Objekte berechnet werden.

Standard-Objekte können sein:

Komplexe Objekte können sein:

2.3  Der Shape-Knoten

Um ein geometrisches Objekt anzeigen zu können, bedarf es einem Shape-Knoten.

Hier einmal ein Beispiel, welches einen einfachen Zylinder anzeigt:

#VRML V2.0 utf8
NavigationInfo {type ["EXAMINE", "WALK", "FLY", "NONE"]}
Shape {
   geometry Cylinder { }
}

Hier wird also dem geometry-Feld des Shape-Knotens ein Cylinder-Objekt zugewiesen. Das sieht aber noch nicht so hübsch aus. Der Shape-Knoten hat noch ein weiteres Feld, das appearance-Feld, an welches man einen Appearance Knoten anhängen kann. An dessen material Feld noch einen Material-Knoten angehängt, läßt sich die Farbe eines Objektes mit diffuseColor festlegen. Klingt sehr kompliziert, deswegen hier noch ein Beispiel:

#VRML V2.0 utf8
NavigationInfo {type ["EXAMINE", "WALK", "FLY", "NONE"]}
Shape {
   appearance Appearance {
      material Material {
         diffuseColor 1 1 0
      }
   }
   geometry Cylinder { }
}

Die Farbe bei diffuseColor wird in RGB-Werten jeweils im Bereich von 0 bis 1 angegeben. In diesem Fall ist der Rot- und Grün-Anteil auf Maximum gesetzt, was der Farbe gelb entspricht.

Um einem Objekt eine Textur zuzuweisen, hat der Knoten Appearance außerdem das Feld texture. Mit dem Knoten ImageTexture und dessen url-Eigenschaft lässt sich so ganz einfach eine Textur auf ein Objekt legen.

Beispiel:

Shape {
   appearance Appearance {
      texture ImageTexture {
	     url "http://bilder.de/bild.gif"
      }
   }
   geometry Box { }
}
Neben ImageTexture gibt es noch PixelTexture und MovieTexture. Jeder Knoten hat außerdem noch weitere Eigenschaften, mit denen das Erscheinungsbild verändert werden kann.

2.4  Der Transform-Knoten

Der Transform-Knoten ist ein sehr wichtiger Knoten, der es erlaubt, das Koordinatensystem für die dem Transform-Knoten untergeordneten Objekte zu verändern. Dieser Knoten hat die gleiche Eigenschaft wie ein Group-Knoten, kann also mehrere Unterknoten aufnehmen. Dies erreicht man mittels der children-Funktion:

Transform {
   rotation        x y z r
   translation     x y z
   scale           x y z
   children [
      Shape {
         geometry   Box { }
      } # Shape 1
      Shape {
         geometry   Cylinder { }
      } # Shape 2
   ]
}

Der Transform-Knoten liefert ein lokales Koordinatensystem, welches an alle Unterknoten weitergegeben wird. Die Unterknoten bilden somit zusammen eine Gruppe. Ein Unterknoten von Transform könnte auch wiederum ein Transform-Knoten sein, wodurch sich eine beliebige Verschachtelung ergibt.

Mit den Feldern rotation, translation und scale wird die Verschiebung des Koordinatensystems angegeben.

Hier ein kleines Beispiel:

#VRML V2.0 utf8
NavigationInfo {type ["EXAMINE", "WALK", "FLY", "NONE"]}      
Shape {
   appearance Appearance {
      material Material {
         diffuseColor 0.5 0.5 0.5
      }
   }
   geometry Box { }
}
Transform {
   translation 0 1 0
   children [
      Shape {
         appearance Appearance {
            material Material {
               diffuseColor 1 0 0
            }
         }
         geometry Sphere { }
      }
   ]
}

Bei diesem Beispiel werden zwei Objekte erzeugt, ein grauer Würfel mit einer aufgesetzten roten (halb-)Kugel. Um die Kugel über den Würfel zu setzen ist es notwendig, zum Erstellen der Kugel das Koordinatensystem nach oben zu verschieben.

2.5  Eigenschaften definieren und wieder verwenden

Um nicht jedes Mal alle Eigenschaften neu definieren zu müssen, kann man Eigenschaften beim ersten Definieren einen Namen geben. Dies funktioniert mit dem Schlüsselwort DEF, gefolgt von einem Namen.

Beispiel:

Shape {
   appearance DEF GELB Appearance {
      material Material {
	     diffuseColor 1 1 0
      }
   }
   geometry Cylinder { }
}

Hier wird der Appearance-Knoten mit den angegebenen Eigenschaften als GELB definiert und kann später ganz einfach wieder verwendet werden. Um eine mit DEF definierte Eigenschaft wieder zu verwenden übergibt man dem gewünschten Feld das Schlüsselwort USE gefolgt von dem Namen. Dabei müssen allerdings die Typen übereinstimmen!

Beispiel:

Shape {
   appearance USE GELB
   geometry Box { }
}

2.6  Prototypen

Um nicht gleichartige Knoten ständig neu definieren zu müssen, besteht die Möglichkeit, Knoten-Prototypen anzulegen. Dazu gibt es das Schlüsselwort PROTO.

Beispiel:

PROTO Kiste [
   field    SFVec3f _scale 1 1 1
   field    SFVec3f _translation 0 0 0
   field    SFColor _color 0 0 0
   field    SFFloat _transparency 0
   ]
{
   Transform {
	  translation     IS _translation
	  scale           IS _scale
   [...]
}

An diesem Beispiel einer PROTO-Definition möchte ich dessen Eigenschaften erklären. Nach Deklaration "PROTO <name>" folgt ein [ und danach eine Felder-Definition. In dieser Felder-Definition legt man alle Felder fest, die später veränderbar sein sollen. Ein Feld fängt grundsätzlich mit dem Schlüsselwort "field" an, gefolgt vom Feld-Typen. SFVec3f ist z.B. ein Feld von 3 float-Werten. Nach dem Feld-Typen steht der Name des Feldes gefolgt von dem/den Initialisierungswert/en. Wie bereits erwähnt, hat grundsätzlich jedes Feld in VRML einen Initial-Wert, der verwendet wird, wenn dem entsprechenden Feld kein Wert zugewiesen wird. Die Felder-Definition wird mit ] abgeschlossen und danach folgt in geschweiften Klammern der Knoten-Rumpf. Um nun einem Feld im Rumpf den Wert eines PROTO-Feldes zuzuweisen, benutzt man das Schlüsselwort IS. Für das Beispiel bedeutet das z.B., dass dem translation-Feld des Transform-Knotens der Wert des _translation-Feldes zugewiesen wird. Die Unterstriche haben natürlich keine Bedeutung und stehen hier nur zur Verdeutlichung (könnten einfach weggelassen werden).

Ein Aufruf könnte nun folgendermaßen aussehen:

Transform {
   children [
      Kiste {
         _translation -0.2 0 0
         _scale        1   1 0.1
         _color        0   0 1
      }

2.7  Verlinken

VRML-Welten können miteinander verknüpft werden und Objekte können Links zu anderen Seiten enthalten. Ersteres ist sehr nützlich, um z.B. durch einen Benutzerklick / betreten eines Objektes eine neue Welt aufzurufen, die mehr Details über ein Objekt enthält. Z.B. könnte es eine Welt "Stadt" und für jedes Gebäude dieser Stadt eine weitere Welt geben. Je nach dem, welches Gebäude vom Benutzer betreten wird, wird die entsprechende Welt nachgeladen und angezeigt. Außerdem ist es möglich, dreidimensionale Hyperlinks zu erzeugen, die auf andere WWW-Seiten verweisen. Hierfür gibt es den Anchor-Knoten.

Ein Beispiel:

Anchor {
   url "http://www.fh-giessen.de" 
   description "FH Giessen Homepage"
   children[
      [...]
   ]
}

Über das Feld url wird die Adresse einer Internetseite bzw. die Adresse einer .WRL-Datei angegeben. Mit dem description-Feld kann eine Beschreibung angegeben werden. Alle Objekte, auf die sich der Link auswirken soll, müssen in der children-Liste definiert werden.

2.8  Interaktion und Animation

Ich möchte nicht sehr tief in die Interaktivität und Animation eingehen, jedoch einige Möglichkeiten und Beispiele aufzeigen.

Um Interaktion und Animation in die VRML-Welt einzubringen, verwendet man Ereignisse (Events), die auf Knoten einwirken und entsprechend Feldinhalte verändern. Damit ändert sich der Knotenzustand und somit auch die gesamte Szene. Ein Sensor-Objekt kann zum Beispiel das Anklicken mit der Maus (TouchSensor) oder das Annähern des Betrachters (ProximitySensor) registrieren und als Ereignis weitergeben. Der Empfänger kann dann z.B. Feldinhalte ändern oder Werte umrechnen und selber ein neues Ereignis auslösen. Sender und Empfänger solcher Events werden mittels eines Nachrichtenkanals, genannt Route, miteinander verbunden. Sensoren, die eine Bewegung der Maus registrieren, werden Drag-Sensoren genannt. Damit ist es möglich, Objekte innerhalb einer Welt mit der Maus zu verschieben oder zu drehen. Ein TimeSensor registriert das Verstreichen der Zeit und generiert daraus Zeitsignal-Ereignisse. Dies ermöglicht eine Animation in einer VRML-Welt. Eine Bewegung wird durch Interpolatoren-Knoten interpoliert, wodurch sich eine flüssige Bewegung ergibt. Der Programmierer gibt nur Start-, End- und Zwischenpunkte einer Bewegung an, die Zwischenschritte werden von diesem Knoten dann berechnet.

Folgendes Beispiel stellt einen sich drehenden blauen Würfel dar. Es werden ein TimeSensor und ein OrientationInterpolator Knoten verwendet.

#VRML V2.0 utf8
NavigationInfo {type ["EXAMINE", "WALK", "FLY", "NONE"]}      
DEF DREHEN Transform {
   children [
      Shape {
         appearance DEF GELB Appearance {
            material Material {
               diffuseColor 0 0 1
            }
         }
         geometry Box { }
      }

      DEF CLOCK TimeSensor {
          cycleInterval 4.0
          loop TRUE
      }

      DEF PFAD OrientationInterpolator {
          # Runde drehen
          key [ 0.0, 0.50, 1.0 ]
          keyValue [
              0.0 1.0 0.0  0.0,
              0.0 1.0 0.0  3.14,
              0.0 1.0 0.0  6.28
          ]
      } #PFAD
   ] #children
} #transform

ROUTE CLOCK.fraction_changed TO PFAD.set_fraction
ROUTE PFAD.value_changed     TO DREHEN.set_rotation

Da auf das Objekt für die Drehung noch mal zugegriffen werden muss, bekommt es mit DEF einen Namen zugewiesen (DREHEN). In Drehen befindet sich zum einen der blaue Würfel und außerdem ein Timesensor, welcher für einen "Ablauf" genau 4 Sekunden benötigt. Dieser erzeugt fortwährend Ereignisse im Bereich 0..1, wobei dieser Bereich innerhalb der 4 Sekunden einmal linear durchlaufen wird. Da die Eigenschaft loop auf TRUE gesetzt ist, wiederholt sich dieser Vorgang unendlich. Der OrientationInterpolator bekommt als Ereignis fortlaufend den TimeSensor Event. Im Interpolator sind 3 Zeit-Positionen festgelegt, und zwar zu Anfang, Mitte und Ende der Bewegung (0, 0.5, 1.0). Im Feld keyValue stehen jeweils die dazugehörigen Dreh-Positionen. Der Interpolator gibt nun zu jedem empfangenen Ereignis vom TimeSensor eine dazugehörige Dreh-Position zurück, und zwar nicht nur zu den Zeiten 0, 0.5 und 1.0, sondern auch für alle Zeitpunkte dazwischen. Diese Zwischenwerte errechnet der Interpolator selbständig.

Mit "ROUTE CLOCK.fraction_changed TO PFAD.set_fraction" wird eine Ereignis-Route festgelegt. Immer wenn sich die Zeit ändert, wird die Änderung an das Feld set_fraction vom Interpolator (Name PFAD) übergeben. "ROUTE PFAD.value_changed TO DREHEN.set_rotation" legt fest, dass das Ergebnis des Interpolators an das Feld set_rotation des Würfels (Name DREHEN) übergeben wird. Set_rotation sorgt für die relative Drehung des Objektes bezogen auf das Ausgangs-Koordinatensystem.

Nun noch ein etwas abgewandeltes Beispiel, welches die Interaktivität demonstrieren soll. Bei diesem Beispiel dreht sich der Würfel nur einmal, wenn er vom Benutzer angeklickt wird:

#VRML V2.0 utf8
NavigationInfo {type ["EXAMINE", "WALK", "FLY", "NONE"]}      
DEF DREHEN Transform {
   children [
      Shape {
         appearance DEF GELB Appearance {
            material Material {
               diffuseColor 0 0 1
            }
         }
         geometry Box { }
      }

      DEF CLOCK TimeSensor {
          cycleInterval 4.0
#         loop TRUE
      }
      
      DEF TOUCH TouchSensor {}

      DEF PFAD OrientationInterpolator {
          # Runde drehen
          key [ 0.0, 0.50, 1.0 ]
          keyValue [
              0.0 1.0 0.0  0.0,
              0.0 1.0 0.0  3.14,
              0.0 1.0 0.0  6.28
          ]
      } #PFAD
   ] #children
} #transform

ROUTE TOUCH.touchTime        TO CLOCK.set_startTime
ROUTE CLOCK.fraction_changed TO PFAD.set_fraction
ROUTE PFAD.value_changed     TO DREHEN.set_rotation

Die fett markierten Zeilen haben sich gegenüber dem vorigen Beispiel verändert. Zunächst musste die Zeile mit loop TRUE auskommentiert werden, da der Würfel sich ja nicht fortdauernd, sondern bei Mausklick drehen soll. Neu hinzugekommen ist der TouchSensor-Knoten, welcher beim Anklicken des Objektes, zu dem er gehört, ein Ereignis auslöst. Die Zeile "ROUTE TOUCH.touchTime TO CLOCK.set_startTime" übergibt, wenn der TouchSensor durch einen Mausklick ausgelöst wird, den Zeitpunkt des Klicks an den TimeSensor als Startzeit. Der TimeSensor fängt dann an, einmal abzulaufen. Alles weitere funktioniert genau so wie im vorigen Beispiel beschrieben.

3  Fazit

VRML ist eine leicht zu erlernende Sprache, um dreidimensionale Objekte im WWW darstellen zu können. Leider fehlt die Unterstützung seitens der WWW-Browser, so dass immer Plugins umständlich installiert werden müssen. VRML ist schon seit längerem standardisiert, was zeigt, dass die Sprache ausgereift ist und auch in Zukunft noch Bestand haben wird.