Index

VRML/X3D (Virtual Reality Modeling Language) unter Unix/Linux: 3D-Welten im WWW

zurück: Rotation/Mathematik

Szenengraph

VRML ist eine deklarative Sprache. Im Vergleich zu einem traditionellen 3D-Programm in einer prozeduralen Sprache (z.B. ein OpenGL Programm in C) heisst das, dass man sich nicht über Dinge wie »jetzt mache ich ein Fenster auf dem Schirm auf«, »jetzt will ich wissen, ob und wo ein Mausklick passiert ist« oder »jetzt verschiebe ich diesen Körper um 5 Einheiten« kümmern muss.

Stattdessen beschreibt man lediglich die Eigenschaften der gewünschten 3D-Welt (der Ausdruck »Welt« ist das Äquivalent des 2D-Ausdrucks »Bild«), um den Rest kümmert sich dann der VRML-Browser. Solche Eigenschaften sind zum Beispiel: »an dieser Stelle soll ein 3D-Körper mit der Geometrie einer Kugel erscheinen« oder »wenn auf die Kugel geklickt wurde, soll die Kugel langsam um 5 Einheiten verschoben werden«.

Grundlage einer solchen Beschreibung bei der 3D-Programmierung ist der Szenengraph. Er wird auch häufig als Dokumentationsform für traditionelle 3D-Programme in prozeduralen Sprachen benutzt.

Im Szenengraph werden ausgehend vom graphischen Ursprung (»Nullpunkt«) alle graphischen Knoten (z.B. geometrischer Körper, Bewegung usw.) in Baumform angeordnet.

Die Bedeutung des Szenengraphen kann man sich anhand einer Animation vor Augen führen, bei der ein Satellit um die Erde kreist, die wiederrum um die Sonne kreist.

Die Erde kreist um die Sonne. Ist der Satellit Bestandteil des entsprechenden Zweigs im Szenengraph, kann er diese Bewegung mitmachen. Aber auch statische Objekte können einen Szenengraph enthalten. Betrachtet man zum Beispiel den Satelliten isoliert, so sieht man, dass sein Szenengraph aus einem Zylinder und zwei Verschiebungen besteht, an denen jeweils ein Quader als Sonnensegel hängt.

Hier ein kommentierter Szenengraph aus dem open source Program white_dune.

Zusätzlich zu den Knoten werden in den Szenengraph auch »Routes« eingetragen. Routes übertragen Nachrichten (»Events«, z.B die Zeit, eine Verschiebung oder Rotation) von Knoten zu Knoten.

Knoten, die Events abhängig von einem äusseren Einfluss (z.B. Mausklick, Ablauf einer Uhr, ein Punkt im Raum wird für die Kamera sichtbar usw.) aussenden, nennt man »Sensoren«.

Eine weitere wichtige Klasse von Knoten sind Interpolator-Knoten. Sie empfangen Events und verarbeiten sie zu neuen Events. Dabei wird ausgehend vom Eingangsevent ein Mittelwert aus dem vorgegebenen Eingangsbereich des Interpolator-Knotens gebildet. Dieser Mittelwert wird auf den vorgegebenen Ausgangsbereich des Interpolator-Knotens übertragen und damit ein Ausgangsevent erzeugt.

Ein einfaches Beispiel eines Szenengraph:







Im Szenengraph steht unterhalb des graphischen Ursprungs ein »Anchor«-Knoten, so dass ein Mausklick auf folgende Körper im Szenengraph das Laden der entsprechenden HTML-Seite (oder auch VRML-Seite) im World Wide Web bewirkt. Danach folgt ein »Transform«-Knoten, der für die Bewegung/Verzerrung der folgenden Knoten im Szenengraph zuständig ist. Der Transform-Knoten wirkt auf zwei weitere Knoten: einen »Shape«-Knoten, der als geometrischen Körper einen Schriftzug enthält und einen »Inline«-Knoten, der ein weiteres VRML-File einhält, das von Steve Baker mit dem 3D-Modeller AC3D erstellt wurde.

Animiert wird diese VRML-Welt über einen »TimeSensor«-Knoten, der dauernd einen Time-Event (ein Wert zwischen 0 und 1) in eine Route leitet, die zu einem »OrientationInterpolator«-Knoten führt. Daraus erzeugt der Orientationinterpolator einen Rotationsevent (eine Drehung, die aus dem Achsenvektor (0 1 0) und einem Winkel zwischen 0 und 2*Pi besteht). Über eine Route wird der Rotationsevent in den Transform-Knoten geleitet, der den Shape-Knoten und den Inline-Knoten enthält.

Insgesamt ergibt sich also eine VRML-Welt mit einem sich drehenden Schriftzug und einem sich drehenden 3D-Modell.




Betrachtet man den Quellcode dieses Programms, so erkennt man, dass der Inhalt eines VRML-Programms nichts anderes ist als eine Abbildung des entsprechenden Szenengraphs.

An Stelle eines eigentlich unnötigen »Nullpunkt«-Knotens tritt ein »Background«-Knoten, der die Hintergrundfarbe dieser VRML-Welt einstellt.

In kompakter graphischer Form lässt sich dieser Szenengraph auch so darstellen:

Der folgende Bildschirmauszug aus white_dune zeigt die "DEF" Namen und die "ROUTE"-Informationswege, lässt aber Feldnamen wie z.B. "children" weg.

Wozu braucht man Java oder JavaScript?

VRML unterstützt JavaScript (»JScript«, »VRMLScript«, eigentlich »ECMAScript« ISO/IEC 16262) und Java (im Anhang der VRML Spezifikation ISO/IEC 14772). Sie werden sich fragen, wie diese prozeduralen Sprachen in das Konzept der deklarativen Sprache passen. Programmcode in diesen prozeduralen Sprachen werden in eigene »Script«-Knoten geschrieben, um damit Events gezielt zu verarbeiten. Dabei kann ein solcher Script-Knoten mehrere Events aussenden oder empfangen.

Im einfachen VRML-Programm von oben lässt sich zum Beispiel der Orientationinterpolator

DEF DREHDATEN OrientationInterpolator 
   {
   key [0, 0.5, 1]
   keyValue 
      [
      0 1 0 0, 
      0 1 0 3.14, 
      0 1 0 6.28 
      ]
   }

durch einen gleichwertigen Script-Knoten

DEF DREHDATEN Script
   {
   eventIn      SFFloat     set_fraction
   eventOut     SFRotation  value_changed
   url       "vrmlscript:
   function set_fraction(value)
      {
      value_changed[0]=0;
      value_changed[1]=1;
      value_changed[2]=0;
      value_changed[3]=value*2.0*Math.PI;
      }
    "
    }

austauschen, der JavaScript (ECMA Script, VRMLScript) benutzt.

Mit den JavaScript-Funktionen createVrmlFromString, createVrmlFromURL und addRoute lassen sich neue VRML-Knoten in einen bestehenden Szenengraph einbauen und animieren.

Entsprechend sieht für die Benutzung von Java statt Javascript der Script-Knoten so

   
DEF DREHDATEN Script
   {
   eventIn      SFFloat     set_fraction
   eventOut     SFRotation  value_changed
   url       "hello_java.class"
   }
aus. hello_java.class kann man aus einem entsprechenden Java-Programm kompilieren.

Weiter: Wichtige Knotentypen

Veröffentlicht unter der GNU GENERAL PUBLIC LICENSE Version 2
TUX Daten (abgeleitet) von "A QUEST FOR HERRING" by Steve Baker (GPL)