Proseminar Computergrafik: Retained Mode: Open Inventor, VRML ...
Proseminar Computergrafik: Retained Mode: Open Inventor, VRML ...
Proseminar Computergrafik: Retained Mode: Open Inventor, VRML ...
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
<strong>Proseminar</strong> <strong>Computergrafik</strong>:<br />
<strong>Retained</strong> <strong>Mode</strong>: <strong>Open</strong> <strong>Inventor</strong>, <strong>VRML</strong>, Java3D<br />
von<br />
Detlef Köntges, MatNr: 0407155
Inhaltsverzeichnis<br />
Einleitung 00<br />
1 <strong>Open</strong> <strong>Inventor</strong> 01<br />
1.1 <strong>Open</strong> <strong>Inventor</strong> Architektur 01<br />
1.2 Szenegraph 02<br />
1.3 <strong>Inventor</strong> Objekte 03<br />
1.4 Event 03<br />
1.5 Manipulatoren 03<br />
1.6 Dateiformat 04<br />
1.7 Komponenten 04<br />
2 <strong>VRML</strong> 06<br />
2.1 Geschichte 06<br />
2.2 Anwendung 06<br />
2.3 Szenegraph 08<br />
2.4 Knoten und Felder 09<br />
2.5 Sensoren und Ereignisse in <strong>VRML</strong> 10<br />
2.6 Objekterweiterung 11<br />
2.7 Java und Javascript 12<br />
2.8 Wiedergabe von <strong>VRML</strong> 13<br />
2.9 X3D 13<br />
3 Java3D 13<br />
3.1 Szenegraph 13<br />
3.2 View-Teilbaum 15<br />
3.3 Ereignisse und Interaktion 15<br />
4 <strong>Retained</strong> <strong>Mode</strong>: Vergleich <strong>Open</strong> <strong>Inventor</strong>, <strong>VRML</strong>, Java3D 15<br />
Literaturverzeichnis 18
Einleitung<br />
<strong>Open</strong> <strong>Inventor</strong>, <strong>VRML</strong> und Java 3D sind 3D-Grafiksysteme, die es dem Entwickler ermöglichen, auf<br />
einfache Art und Weise dreidimensionale Objekte zu erstellen und zu manipulieren. Ein älteres System<br />
zur Grafikerstellung ist <strong>Open</strong> GL. <strong>Open</strong> GL bietet eine plattformunabhängige Software-Schnittstelle<br />
zur Grafik-Hardware an.<br />
Der Kern von <strong>Open</strong> GL besteht aus ca. 200 Funktionen, die nur zum Rendern von Grafik dienen. Die<br />
plattformspezifischen Funktionen sind in anderen Bibliotheken enthalten. Durch diese Struktur ist ein<br />
Programm, das für <strong>Open</strong> GL geschrieben wurde, auf den unterschiedlichsten Systemen lauffähig.<br />
<strong>Open</strong> GL kann als eine low-level API aber nur Linien, Punkte und Polygone beschreiben. Komplexere<br />
dreidimensionale Objekte müssen durch den Programmierer aus diesen Primitiven zusammengesetzt<br />
werden. Auch die Verwaltung der 3D-Objekte liegt in der Verantwortung des Programmierers. Von<br />
Vorteil ist dieser Weg bei der Lösungsoptimierung für ein spezifisches Problem, d.h. mit <strong>Open</strong> GL<br />
steht dem Entwickler ein Höchstmaß an Flexibilität zur Verfügung, aber mit dem Nachteil des hohen<br />
Programmieraufwands.<br />
Grafiksysteme wie <strong>Open</strong> <strong>Inventor</strong>, <strong>VRML</strong> und Java 3D haben eine höheren Abstraktionsgrad und entsprechen<br />
eher dem heutigen objektorientierten Ansatz. Sie nutzen die <strong>Open</strong> GL als Grundlage zur<br />
Darstellung ihrer 3D-Objekte. Sie gestatten es dem Programmierer, auf einfachere Weise eine 3D-<br />
Grafik zu erstellen, als dies mit <strong>Open</strong> GL möglich wäre.<br />
Während <strong>Open</strong> GL im Immediate <strong>Mode</strong> arbeitet, können <strong>Open</strong> <strong>Inventor</strong>, <strong>VRML</strong> und Java3D den <strong>Retained</strong><br />
<strong>Mode</strong> verwenden. Dieses Renderingmodell beruht auf einer Szenegraphstruktur. Diese Form<br />
des Rendering hat Vorteile, birgt aber auch einige Nachteile. Der <strong>Retained</strong> <strong>Mode</strong> wird von allen drei<br />
high-level-Grafiksystemen unterschiedlich angegangen. Diese Ausarbeitung wird einen kleinen Einblick<br />
in die einzelnen Programme liefern und ihre Interpretationen des <strong>Retained</strong> <strong>Mode</strong> miteinander<br />
vergleichen.<br />
00
1 <strong>Open</strong> <strong>Inventor</strong><br />
1.1 <strong>Open</strong> <strong>Inventor</strong> Architektur<br />
Der <strong>Open</strong> <strong>Inventor</strong> wurde ursprünglich in einer C++ Version von Silicon Graphics Inc. (SGI) entwickelt<br />
und vertrieben. Etwas später hat die Firma TGS eine Portierung nach JAVA vorgenommen.<br />
Die auch von der SGI entwickelte <strong>Open</strong> GL wird vom <strong>Open</strong> <strong>Inventor</strong> als Rendering Maschine genutzt.<br />
Von <strong>Open</strong> <strong>Inventor</strong> werden komplexe, graphische Objekte (Kugeln, Kegel, Quader usw.) zur Verfügung<br />
gestellt, die aus den Primitiven der <strong>Open</strong> GL zusammengesetzt sind. Die Systemarchitektur<br />
von <strong>Open</strong> <strong>Inventor</strong> wird im folgenden Schaubild verdeutlicht.<br />
Abbildung 1 Systemarchitektur des <strong>Open</strong> <strong>Inventor</strong><br />
Der <strong>Open</strong> <strong>Inventor</strong> basiert auf dem Betriebssystem und <strong>Open</strong> GL. Er umfasst eine Reihe von Komponenten<br />
die eine Erstellung und Verwaltung von 3D-Objekten ermöglichen. Neben den „Node Kits“ und<br />
den Manipulatoren spielt die „Scene Database“ eine wichtige Rolle. Sie verwaltet den Scene-graphen,<br />
auf den im weiteren genauer eingegangen wird. Auf diese Kern-API setzten wiederum einige<br />
Komponenten auf. In der Komponentenbibliothek sind ein Szeneviewer und Editoren für Materialeigenschaften<br />
und Beleuchtung enthalten.<br />
01
1.2 Szenegraph<br />
<strong>Open</strong> GL funktioniert auf dem Prinzip einer Zustandsmaschine, infolgedessen können<br />
Transformationen und Attribute nur eine Zustand einnehmen. Diese Eigenschaft hat der <strong>Open</strong><br />
<strong>Inventor</strong> geerbt und das beeinflusst die Abarbeitung des Szenegraphen.<br />
Der Szenegraph ist ein azyklischer, gerichteter Graph, in dem eine 3D-Szene gespeichert wird. Er ermöglicht<br />
es die Position und die Orientierung von 3D-Objekten zueinander festzulegen. Die Struktur<br />
eines solchen Graphen entspricht der eines Baumes, wobei die Knoten des Baumes die Elemente der<br />
3D-Szene sind. Sämtliche Bestandteile einer Szene sind in den Knoten festgehalten. Neben den 3D-<br />
Objekten werden auch Transformation, Licht, Kamera und Attribute (Textur ,Farbe ,...) in Knotenform<br />
eingefügt. In der folgenden Abbildung ist ein einfacher Beispielgraph dargestellt.<br />
Abbildung 2 Beispiel für Szenegraph des <strong>Open</strong> <strong>Inventor</strong><br />
Der Szenegraph wird zeilenweise und von links nach rechts durchlaufen, wobei jeder Knoten seine<br />
Nachfolger beeinflusst. Im Beispielgraph wird von der Wurzel ausgehend die Betrachterposition und<br />
die Beleuchtung des Autos bestimmt. Dann werden Farbe und Position festgelegt, die sich auf den<br />
Knoten mit der geometrischen Beschreibung der Karosserie auswirken. Ein weiterer Knoten ändert<br />
dann das Attribut Farbe für seine nachfolgenden Knoten, d.h. das Rad wird schwarz und erscheint<br />
bedingt durch die Transformationsknoten an vier verschiedenen Positionen.<br />
Beim durchlaufen (auch traversieren) der einzelnen Knoten wird ein Zustand („traversal state“) mitgeführt.<br />
Dieser entspricht bildlich gesprochen einem Lesekopf, der den Baum durchläuft und ihn in<br />
<strong>Open</strong> GL-Anweisungen übersetzt, welche dann vom System weiter verarbeitet werden und schließlich<br />
auf dem Bildschirm in Form der 3D-Szene erscheinen.<br />
02
Eine spezielle Form der Gruppenknoten ist der Separator. Beim Eintritt in den Separator-Teilbaum<br />
wird der aktuelle Zustand gespeichert und nach Verlassen wiederhergestellt. Dabei wird verhindert,<br />
dass Veränderungen von Attributen im Teilbaum sich auf den Rest des Szenegraphen übertragen. Im<br />
Falle des Wurzelknotens wird nach dem Rendering der 3D-Szene der Ausgangszustand wieder<br />
eingesetzt.<br />
Wie das obige Beispiel zeigt, können Knoten mehrfach verwendet werden. Bei der Verknüpfung<br />
zweier Knoten muss beachtet werden das kein Zyklus entsteht, so dass ein Knoten keine Referenz<br />
besitzt, die über seine Kindknoten auf ihn zurück verweist. Richtig angewendet kann diese Technik<br />
jedoch Rechzeit und Hauptspeicher sparen helfen.<br />
1.3 <strong>Inventor</strong> Objekte<br />
<strong>Open</strong> <strong>Inventor</strong> als Klassenbibliothek für objektorientierte Sprachen kann mittels Vererbung erweitert<br />
werden. Diese Erweiterung von bestehenden Knoten durch Ableiten ermöglichen dem Programmierer<br />
hohe Flexibilität und die gewohnte Übersichtlichkeit objektorientierter Programmiersprachen. <strong>Open</strong><br />
<strong>Inventor</strong> stellt verschiedene Grundtypen von Objekten zur Verfügung. Die Basistypen werden durch<br />
ein „Sb“ gekennzeichnet und umfassen neben Farbe oder einfachen geometrische Strukturen<br />
(Zylinder, Ebenen, Vektoren, ...)viele andere 3D-Grundstrukturen. Eine weitere Gruppe stellen die<br />
Szene-Objekte dar, in der alle Knoten, Felder, Pfade, Aktionen und Events enthalten sind. Die<br />
Elemente dieser Gruppe sind durch ein „So“ (SceneObjekt) gekennzeichnet.<br />
Aus diesen Objekttypen kann der Programmierer entsprechend seiner Vorstellung ein 3D-Objekt<br />
erstellen und es nach Belieben wiederverwenden.<br />
1.4 Event<br />
Der <strong>Inventor</strong> bietet eine Reihe von Möglichkeiten zur Selektion und Manipulation von Objekten. In<br />
einer bestehenden Szene können etwa durch anklicken einfache Transformationen an einem Objekt<br />
durchgeführt werden. Mit einem solchen Event wird eine erneute Traversierung des Szenegraphen<br />
ausgelöst. Jedes Objekt im Graphen kann nun prüfen, ob der Mausklick innerhalb seiner Koordinaten<br />
auf dem Bildschirm liegt. Ist dies der Fall, wird der Event verarbeitet und gegebenenfalls werden alle<br />
weiteren Events an dieses Objekt weitergeleitet. Den Nutzen einer solchen Verarbeitungsstruktur<br />
haben zum Beispiel „Handle“-Obiekte. Durch einmaliges Anklicken werden alle weiteren Mausevents<br />
an diesen Objekttyp weitergeleitet, ohne die aufwendige Traversierung des Szenegraphen.<br />
Events werden auf diese Art und Weise direkt und sehr schnell verarbeitet, kombiniert mit der<br />
Funktionalität des Szenegraphen.<br />
Ein anderer Weg ist die Definition eigener Objekte mit Call-Back-Methoden. Sind sie registriert,<br />
werden sie bei Auftreten eines Events aufgerufen.<br />
1.5 Manipulatoren<br />
Die Manipulatoren sind eine Ableitung der Transformationsknoten. Sie haben eine Reihe von Kindern<br />
in Form von Handl-Objekten. Manipulatoren sind, wenn sie im Szenegraphen integriert werden, in der<br />
Lage Events aufzunehmen und zu verarbeiten. Visuell repräsentieren sie sich in Form kleiner Kugeln,<br />
Linien oder Kegel. Klickt man eines dieser Manipulatorobjekte an und hält es mit der Maus fest, so<br />
sind durch ziehen direkte Veränderungen an dem zugehörigen Objekt möglich. Der Anwender kann<br />
die Szene intuitiv mit Manipulatoren verändern.<br />
Der mitgelieferte Szeneviewer ermöglicht sogar eine direkte Manipulation ohne solche Knoten, da er<br />
normale Transformationsknoten durch Manipulatoren ersetzen kann und umgekehrt.<br />
03
1.6 Dateiformat<br />
Der <strong>Inventor</strong> bietet Funktionen, um ganze Szenegraphen oder Teile davon in einer Datei zu speichern<br />
und wieder auszulesen. Fügt man dem Wurzelknoten zum Beispiel die Aktion „SoWriteAction“ hinzu,<br />
so wird der Graph automatisch in der angegebenen Datei gespeichert. Dabei kann zwischen Binär-<br />
und ASCII-Format gewählt werden. Die Textform einer solchen Datei wird in dem folgenden Beispiel<br />
gezeigt.<br />
#<strong>Inventor</strong> V2.0 ascii<br />
Separator {<br />
DirectionalLigth{}<br />
Cube {<br />
width 1<br />
height 2<br />
depth 3<br />
}<br />
}<br />
Der Kopf beschreibt die genaue Version des Formats. Der Graph beginnt mit einem Separatorknoten<br />
in der Wurzel. Die Schachtelung der Knoten entspricht der Baumstruktur des Szenegraphen. Zu<br />
jedem Knoten wird eine Liste von Feldern gespeichert, die von den Default-Werten des Knotentyps<br />
abweichen.<br />
1.7 Komponenten<br />
Zur Erleichterung der Entwicklungsarbeit stellt der <strong>Inventor</strong> eine Reihe von Komponenten zur<br />
Verfügung. Neben dem Szeneviewer stehen auch verschiedene Editoren zur Auswahl. Von diesen<br />
Tools können wieder Subklassen gebildet werden um eigene spezifische Anwendungen zu erstellen.<br />
Die folgenden Bilder zeigen den Viewer und einige Editoren.<br />
Abbildung 3 Viewer für <strong>Open</strong> <strong>Inventor</strong><br />
04
Abbildung 4<br />
Abbildung 5<br />
05
2 <strong>VRML</strong><br />
2.1 Geschichte<br />
Auf der ersten internationalen Konferenz über das World Wide Web in Genf (Mai 1994) wurde eine<br />
Sitzung zum Thema „Virtual Reality Markup Language“ abgehalten. Dort wurden die Vorstellungen<br />
über einen plattform-unabhängigen 3D-Standard geformt und der Begriff <strong>VRML</strong> geprägt. Später ist<br />
das Wort Markup durch <strong>Mode</strong>lling ersetzt worden. Die Grundlage des Kerns von <strong>VRML</strong> wurde das<br />
Dateiformat des <strong>Open</strong> <strong>Inventor</strong>s, nachdem Silicon Graphics Inc. (SGI) einen Teil des Dateiformates<br />
freigab, und bereits auf der zweiten WWW-Konferenz (Oktober 1994) konnte man <strong>VRML</strong> 1.0<br />
präsentieren. Weitere Diskussionen fanden auf der Tagung SIGGRAPH 95 statt. Ausgehend von<br />
dieser Messe wurde der Aufruf an alle Interessenten gestellt, an der Weiterentwicklung mitzuarbeiten.<br />
Um die Vorschläge aus dem Internet zu sammeln und zu artikulieren, gründete sich zwei Wochen<br />
nach der Tagung die „<strong>VRML</strong> Architecture Group“, kurz VAG. Aus der VAG hat sich inzwischen das<br />
WEB3D-Konsortium gebildet. Nach der Entwicklung von <strong>VRML</strong> 1.0 begannen Planungen für die 1.1<br />
Version, welche aber von dem öffentlichen Aufruf der VAG im Jahr 1996 überholt wurden. Demnach<br />
sollten Vorschläge für <strong>VRML</strong> 2.0 eingereicht werden. Nach einer Abstimmung im Internet wurde der<br />
Vorschlag der SGI ausgewählt, der unter der Bezeichnung „Moving Worlds“ bekannt ist. Auf der<br />
SIGGRAPH 96 wurde dann <strong>VRML</strong> 2.0 vorgestellt. Nach weiteren Bemühungen wurde <strong>VRML</strong> auch als<br />
ISO - und IEC-Standard genehmigt und dann in <strong>VRML</strong>97 umbenannt.<br />
<strong>VRML</strong> 2.0 ist im wesentlichen ein Dateiformat zur Beschreibung von 3D-Szenen. Neben den Objekten<br />
werden auch Bilder, Töne und sogar Filme, die zu Darstellung einer 3D-Szene hilfreich sind,<br />
verwendbar. Es können Wechselwirkungen und Veränderungen zwischen Objekten beschrieben<br />
werden. Der Inhalt einer <strong>VRML</strong>-Datei besteht aus lesbarem Text, wobei unterschiedliche Zeichensätze<br />
Verwendung finden. Mit <strong>VRML</strong> 1.0 wurde nur ASCII unterstützt, jedoch mit <strong>VRML</strong> 2.0 ist auch der<br />
Standard „Universal Coded Character Set Transformation Format“ (kurz UTF-8) verwendbar. Die erste<br />
Zeile einer <strong>VRML</strong>-Datei enthält wie <strong>Open</strong> <strong>Inventor</strong> die Versionsbezeichnung und den verwendeten<br />
Zeichensatz. Bei <strong>VRML</strong> entspricht dies einer Codierung der Form:<br />
#<strong>VRML</strong> V2.0 utf8<br />
Das Zeichen „#“ hat die Funktion, einen Kommentar einzuleiten. Bei sehr umfangreichen 3D-Szenen<br />
kann diese Form der Codierung zu sehr großen Dateien führen. Um den Speicherbedarf zu senken,<br />
stehen verschiedene Optionen zur Auswahl. Neben Dateien die in GZIP verpackt werden, steht auch<br />
die Konvertierung in Binärdateien zu Verfügung. Einige <strong>VRML</strong>-Browser können diese Formate direkt<br />
verarbeiten.<br />
2.2 Anwendung<br />
Das Internet als weltweites Informationssystem stellt primär Hypertextdokumente bereit. Die<br />
Verknüpfung dieser Texte mit Grafik, Sound und Video machen das Internet zum hypermedialen<br />
Informationssystem. Um das System nutzen zu können, werden verschiedene Browser eingesetzt. Sie<br />
ermöglichen durch ihre Erweiterbarkeit die Integration von Programmen, die verschiedene<br />
Dateiformate erst für den Anwender verwendbar machen. Zu solchen als „Plug-ins“ oder „ActiveX<br />
Controls“ bezeichneten Erweiterungen zählen auch <strong>VRML</strong>-Viewer. Natürlich existieren auch<br />
eigenständige Viewer. Ein solch ausgestatteter Internet-Browser kann ein Dokument im <strong>VRML</strong>-Format<br />
wiedergeben, welches von einem Internet-Server bereitgestellt wird.<br />
Mit <strong>VRML</strong> können sowohl einfache 3D-Objekte als auch komplexe 3D-Szenen beschrieben werden.<br />
Zum Teil dienen <strong>VRML</strong>-Formate dazu, ganze 3D-Welten zu erschaffen. Eine Beispiel aus dem<br />
Internet bietet die folgende Grafik.<br />
06
Abbildung 6 von immersive SIM engineering<br />
So dargestellte Objekte können von jedem Internetteilnehmer betrachtet werden. Dieser benötigt<br />
lediglich einen <strong>VRML</strong>-Browser für die Darstellung. Eine Firma kann so über das Internet eine breite<br />
Kundschaft ansprechen und ihr Produkt vorstellen, selbst wenn das Objekt real noch nicht existiert.<br />
Vorstellbar sind auch Architektur-Projekte, die im Internet nach Finanzierung suchen. Das Gebäude<br />
kann mittels <strong>VRML</strong> in einer 3D-Darstellung angeboten werden. Jeder hat die Möglichkeit, sich bereits<br />
ein Bild von dem Gebäude zu machen, bevor auch nur ein Stein gesetzt wurde. Man kann von seinem<br />
Büro aus über den Internet-Browser schnell und kostengünstig mehrere Projekte betrachten.<br />
Eine weitere Einsatzmöglichkeit ist bei der Nutzung einer Datenbank gegeben. Durch eine virtuelle<br />
Nachbildung einer Bibliothek realisiert, könnten einzelne Bücher Links auf Datenpakete enthalten.<br />
Neben der kommerziellen Nutzung haben auch andere Bereiche ein Interesse an <strong>VRML</strong>. In der<br />
Forschung ist die 3D-Darstellung von Molekülen sehr verbreitet. Einige interessante Darstellungen<br />
geben folgende Bilder wieder.<br />
Abbildung 7 Moleküle: Kristallgitter, H20, Ethanol<br />
Die Darstellungsfähigkeit und Funktionalität eines <strong>VRML</strong>-Browsers ermöglicht die Manipulation der<br />
Szene durch Drehen und Bewegen der Betrachterposition in jeden beliebigen Standpunkt und erzeugt<br />
so ein 3D-Gefühl für den Anwender.<br />
07
Aufgrund der Plattformunabhängigkeit bietet sich <strong>VRML</strong> für die Realisierung virtueller Welten im<br />
Internet an, in denen sich viele Menschen in Form von Avataren repräsentieren, begegnen und<br />
austauschen können.<br />
<strong>VRML</strong> bietet durch seine Einfachheit auch Personen ohne Programmierkenntnissen die Möglichkeit<br />
zur Erstellung virtueller 3D-Welten.<br />
2.3 Szenegraph<br />
Wie bereits erwähnt hat <strong>VRML</strong> das Dateiformat von <strong>Open</strong> <strong>Inventor</strong> übernommen. VMRL verwendet<br />
ebenfalls die Struktur des Szenegraphen mit Knoten und Feldern. Der wichtigste Unterschied liegt in<br />
der Traversierung des Graphen. Während <strong>Open</strong> <strong>Inventor</strong> einen fest vorgeschriebenen Durchlauf hat,<br />
ist in der Spezifikation von <strong>VRML</strong> jedoch keine Traversierung vorgesehen. Man kann aber davon ausgehen,<br />
dass viele <strong>VRML</strong>-Browser eine ähnliche Traversierung wie <strong>Open</strong> <strong>Inventor</strong> vornehmen. Bedingt<br />
durch eine fehlende Vorschrift für eine Traversierung müssen für jedes Objekt die Eigenschaften neu<br />
gesetzt werden bzw. mit den Standardwerten besetzt werden.<br />
In der Baumstruktur werden im Vergleich zu <strong>Open</strong> <strong>Inventor</strong> die Eigenschaften mehr gekapselt. Die<br />
folgende Darstellung zeigt einen Szenegraphen, wie er von <strong>VRML</strong> genutzt wird. Die Eigenschaften<br />
einer Kugel sind in diesem Beispiel in einem Teilbaum zusammengefasst. Weiterhin wird die<br />
Wiederverwendung eines Objektes durch eine „USE“-Anweisung dargestellt, worauf im folgenden<br />
noch genauer eingegangen wird.<br />
Abbildung 8 Szenegraph von <strong>VRML</strong><br />
08
2.4 Knoten und Felder<br />
Knoten beschreiben in <strong>VRML</strong> die 3D-Objekte, wobei sich die Knoten in Gruppenknoten oder Blattknoten<br />
unterteilen lassen. Erstere können wiederum Gruppenknoten oder Blattknoten als Kinder in<br />
beliebiger Anzahl enthalten. Blattknoten können zwar keine Kinderknoten aber untergeordnete Knoten<br />
besitzen, zu denen Knoten wie Materialeigenschaft oder die geometrischen Knoten gehören. So wäre<br />
ein Knoten für einen Quader vom Typ „Box“, und seine Knoten für Oberflächeneigenschaft vom Typ<br />
Material. Die untergeordneten Knoten können nicht als eigenständige Blattknoten verwendet werden.<br />
Ein Knoten besteht aus einem oder mehreren Feldern, die den Zustand des Knotens beschreiben. So<br />
würde einen Knoten, der mit dem Knotentyp „Sphere“ vereinbart wurde, eine Kugel ergeben. Mit dem<br />
folgendem Programmcode entsteht dabei eine Kugel mit dem Radius 2.<br />
Sphere { radius 2 }<br />
Felder werden in geschweifte Klammern eingeschlossen, und im Falle von mehreren Eigenschaften<br />
werden die Felder untereinander geschrieben. Die Feldtypen sind wie in <strong>Open</strong> <strong>Inventor</strong> einfache<br />
Basistypen, zum Beispiel Vektoren, boolesche Werte u.a..<br />
Die Wiederverwendung von Knoten in <strong>Open</strong> <strong>Inventor</strong> ist auch in <strong>VRML</strong> übernommen worden. Um<br />
einen Knoten erneut zu nutzen, muss er mit DEF benannt und an anderer Stelle mit USE und seinem<br />
Namen wieder angesprochen werden. Es wird dabei keine Kopie sondern eine Referenz angelegt.<br />
Im anschließenden Programm wird eine Pyramide beschrieben. Mit diesem relativ einfachen Beispiel<br />
werden die Struktur einer <strong>VRML</strong>-Datei und die Anwendung einiger Knoten deutlich.<br />
#<strong>VRML</strong> V2.0 utf8<br />
Transform { # lokales Koordinatensystem für alle<br />
children [ # Kindknoten<br />
DirectionalLight{}, # Lichtstrahlen parallel und eine Richtung<br />
Shape { # Knoten zur Beschreibung sichtbarer Objekte<br />
geometry IndexedFaceSet { # Knoten um Polygone zu beschreiben<br />
coord Coordinate { # Knoten der Eckpunkte der Polygone enthält<br />
point [<br />
1 0 0 # Punkt 0<br />
0 0 1 # Punkt 1<br />
-1 0 0 # Punkt 3<br />
0 0 -1 # Punkt 4<br />
0 1.5 0 # Punkt 5<br />
]<br />
}<br />
coordIndex [ # Vereinbarung der Polygone,<br />
0,1,2,3,0,-1, # Grundfläche<br />
1,0,4,1,-1, # Seite aus Punkt 1, Punkt 0 usw.<br />
2,1,4,2,-1, # Seite, Wert -1 trennt die einzelnen Polygone<br />
3,2,4,3,-1, # Seite<br />
0,3,4,0,-1 # Seite<br />
]<br />
}<br />
appearance Appearance { # Knoten beschreibt das Aussehen<br />
material Material { # Knoten für Materialeigenschaft (Werte 0-1)<br />
diffuseColor 0.1 0.1 0.1 # Farbe in RGB für Reflexion, helles grau<br />
shininess 0.6 # Glanzwert<br />
specularColor 0.8 0.8 0.8 # Reflexionskoeffizient für Spiegelung<br />
transparency 0.5 # Transmissionskoeffizient für Transparenz<br />
}}}]}<br />
Background { # Knoten für Hintergrundeigenschaften<br />
skyColor [ 1 1 1 ] # Farbe des Himmels in RGB. weiß<br />
}<br />
09
Das Ergebnis dieser Programmzeilen wird im nächsten Bild gezeigt.<br />
2.5 Sensoren und Ereignisse in <strong>VRML</strong><br />
Abbildung 9<br />
Ereignisse dienen in <strong>VRML</strong> der Kommunikation der Knoten untereinander. Die Knoten besitzen dazu<br />
spezielle Felder, die das Ereignis aufnehmen oder abschicken können. Durch ROUTE werden zwei<br />
Knoten über die entsprechenden Felder verbunden.<br />
Die gesamte Interaktion wird komplett über Sensoren gesteuert, die in <strong>VRML</strong> eingebaute Konstrukte<br />
für Animation und Interaktion sind. Sensorenknoten erzeugen Ereignisse, welche die Animation oder<br />
Interaktion steuern. Diese Knoten werden mit sogenannten Interpolatoren verbunden, die vom<br />
Entwickler vorher festgelegte Zwischenwerte enthalten. Diese vorgefertigte Variante reicht für einfache<br />
Animationen aus, komplexere Abläufe sind jedoch nur mit Hilfe von Scriptknoten oder über EAI<br />
realisierbar. Der Scriptknoten nimmt dabei die Position des Interpolator-Knotens ein. Sobald der<br />
Sensorknoten ein Ereignis sendet, berechnet der Scriptknoten den neuen Wert und reicht ihn zum<br />
Beispiel an einen Knoten weiter, der ein geometrisches Objekt beschreibt. Dies kann dann zur<br />
Veränderung der Größe oder Farbe des Objektes führen, es kann aber auch eine Animation mit<br />
nichtlinearer Berechnung von Positionswerten generiert werden.<br />
<strong>VRML</strong> bietet verschiedene Sensoren an, um Ereignisse zu erzeugen. Neben einem „TimeSensor“ gibt<br />
es Sensoren, die auf die Auswahl eines Objektes mit der Maus reagieren. Dabei unterscheidet man<br />
Sensorentypen für Auswahl (TouchSensor, Anchor) und Objektinteraktion (CylinderSensor, Plane-<br />
Sensor und SphereSensor). Weitere Funktionalität muss dann wiederum über Scriptknoten geregelt<br />
werden.<br />
Ein einfaches Beispiel für einen Sensor zeigt das folgende Programm.<br />
10
#<strong>VRML</strong> V2.0 utf8<br />
DEF Licht PointLight{ # definiert eine Punktlichtquelle<br />
location 0 0 2 # Positionsfeld, 3D-Vektor<br />
on FALSE<br />
}<br />
Transform{<br />
children [<br />
Shape{<br />
geometry Box {} # ein Würfel<br />
appearance Appearance {<br />
material Material {<br />
diffuseColor 0 0 1 # Farbe blau<br />
}<br />
}<br />
}<br />
DEF Schalter TouchSensor {} # Schalterdefinition und damit<br />
] # mehrfachverwendbar<br />
}<br />
ROUTE Schalter.isActive TO Licht.on # Anweisung Würfel angeklickt dann<br />
# Licht an<br />
Das Beispiel beschreibt eine Szene mit einem blauen Würfel und einer Lichtquelle. Wenn der Würfel<br />
angeklickt wird, aktiviert der Sensor über die ROUTE-Anweisung das Licht. Nach dem der Würfel losgelassen<br />
wird, ändert sich der Zustand der Lichtquelle wieder auf den Ausgangswert.<br />
2.6 Objekterweiterung<br />
Abbildung 10 als Graustufenbild, Sensorenbeispiel für Werte TRUE und FALSE<br />
Um in <strong>VRML</strong> Knotentypen zu erweitern, werden sogenannte Prototypen definiert. Sie enthalten eine<br />
eigenständige Szene auf Basis der bestehenden Knotentypen, Routen oder anderer Prototypen. Sie<br />
können eine Schnittstelle nach außen besitzen, über die der Prototyp angepasst werden kann. Das<br />
folgende Beispiel enthält einen solchen Prototypen<br />
11
#<strong>VRML</strong> V2.0 utf8<br />
PROTO Beispielform [ # Definition Prototyp<br />
exposedField SFVec3f trans 0 0 0 # SingleField, besitzt nur einen<br />
# Wert<br />
exposedField SFColor color .2 .2 .2 # MultipleField, mehrere Werte<br />
# besitzen<br />
exposedField SFNode form NULL # geometrischer Knoten leer bis<br />
] # zum Aufruf<br />
{<br />
Transform {<br />
translation IS trans # Position beliebig an<br />
children [ # Aufrufstelle zu vereinbaren<br />
Shape {<br />
geometry IS form<br />
appearance Appearance {<br />
material Material {<br />
diffuseColor IS color<br />
}<br />
}<br />
}<br />
]<br />
}<br />
}<br />
Beispielform { # Erzeugung eines Objektes<br />
color 0 0 1<br />
trans 3 –3 0<br />
form Box {}<br />
}<br />
Durch externe Prototypen kann sogar über die Dateigrenzen hinweg ein Szenegraph einer anderen<br />
Datei genutzt werden. Da <strong>VRML</strong> keine Programmiersprache sondern nur ein Dateiformat darstellt, ist<br />
die Vererbung nicht möglich. Eigenschaften oder Verhaltensweisen eines Prototyps können nicht<br />
direkt von anderen Prototypen weiterverwendet werden.<br />
2.7 Java und Javascript<br />
Wie bereits erwähnt sind Knoten verfügbar, die ein Script enthalten, d.h. der Knoten kann ein compiliertes<br />
Programm nutzen. Solche Scriptknoten können zur Lösung verschiedener Aufgaben genutzt<br />
werden. Die Kommunikation mit Servern über TCP/IP-Protokolle kann durch Scriptknoten erfolgen,<br />
oder es werden weitere Szenen geladen und in die gegebene Szenen eingefügt. Diese Knoten<br />
können Werte von Zuständen speichern oder umfangreiche Berechnungen durchführen, unter<br />
anderem aber auch Ereignisse empfangen, verarbeiten und wieder versenden. Scriptknoten<br />
kommunizieren über bestimmte Felder mit <strong>VRML</strong> und können so den Szenegraphen direkt<br />
manipulieren. Nachteil ist die steigende Unübersichtlichkeit bei wachsender Scriptknotenzahl.<br />
Ein weiteres Konzept, um <strong>VRML</strong> zu manipulieren, ist „External Authoring Interface“ (kurz EAI). Durch<br />
EAI lässt sich <strong>VRML</strong> umfassend erweitern. Durch eine definierte Schnittstelle kann ein Applet den<br />
Szenegraphen verändern oder durch Registrieren einer Callback-Methode Ereignisse der <strong>VRML</strong>-Welt<br />
empfangen. Mit dieser Erweiterung ist die Erschaffung von virtuellen Multiuserwelten im Internet erst<br />
möglich. Während <strong>VRML</strong> die 3D-Szene darstellt, stellt ein Java-Applet die Netzwerkfunktionalität<br />
bereit.<br />
12
2.8 Wiedergabe von <strong>VRML</strong><br />
Da <strong>VRML</strong> kein eigenständiges Programm ist, sondern nur ein Dateiformat, sind sogenannte Viewer<br />
erforderlich, die dieses Format auswerten und darstellen können. Es existieren mehrere Lösungen zur<br />
Darstellung von <strong>VRML</strong>-Dateien. So gibt es neben externen Viewern und eigenständigen <strong>VRML</strong>-Browsern<br />
auch Programmerweiterungen für Internet-Browser. Eine weiterer Weg ist die Regelung der Darstellung<br />
über ein Java-Applet.<br />
Ein externer Viewer stellt ein Programm dar, das von einem Internet-Browser bei Bedarf aufgerufen<br />
werden kann, wird aber unabhängig vom Internet-Browser installiert. Die Erweiterungen für Internet-<br />
Browser werden von einigen Anbietern im Internet frei angeboten. Einige Internetseiten von<br />
Herstellern solcher Programme sind im Linkverzeichnis dieser Arbeit angegeben.<br />
Jeder dieser Viewer ermöglicht dem Anwender durch verschiedene Werkzeuge eine komfortable<br />
Betrachtungsmöglichkeit seiner Szene. Mit Hilfe der Maus kann die Szene gedreht, verschoben und<br />
zum Teil sogar inhaltlich verändert werden.<br />
<strong>VRML</strong>-Builder ermöglichen hingegen neben der Funktionalität eines Viewers, die Szene selbst zu<br />
erstellen und zu manipulieren, wobei eine interessantere Variante darin besteht, eine Szene mit 3D-<br />
<strong>Mode</strong>llierungsprogramm oder CAD-Programm zu erstellen und sie anschließend in <strong>VRML</strong> zu konvertieren.<br />
2.9 X3D<br />
Der aktuelle Stand der <strong>VRML</strong>-Entwicklung ist X3D (Extensible 3D). Die neue Variante ist der<br />
Nachfolger von <strong>VRML</strong>97, welche sich nicht wie erhofft im Internet durchsetzten konnte und noch<br />
einige Mängel aufwies. So wird eine Datei in unterschiedlich <strong>VRML</strong>-Viewern teilweise unterschiedlich<br />
dargestellt. Ein weiterer Aspekt ist das Fehlen eines Binärformats, um eine <strong>VRML</strong>-Datei komprimieren<br />
zu können. Solche und andere Gründe führten zur Weiterentwicklung von <strong>VRML</strong>, in der auch auf XML<br />
zurückgegriffen wurde, um zukünftig die Szenen zu beschreiben.<br />
3 Java3D<br />
Java3D ist ein Klassenbibliothek für Java, um in Applets oder Applikationen 3D-Grafik zu verwenden.<br />
Wie auch in <strong>Open</strong> <strong>Inventor</strong> und <strong>VRML</strong> können einzelne Objekte oder ganze virtuelle Welten<br />
erschaffen werden. Bei der Entwicklung von Java3D wurde auf bereits bestehende Konzepte von low-<br />
und high-level Grafiksystemen zurückgegriffen. Dabei wurde auch die Nutzung von 3D-Peripherie-<br />
Geräten berücksichtigt. Java3D stellt damit eine sehr mächtige Klasse zur Verfügung, die es auf<br />
einfache Art und Weise ermöglicht, 3D-Grafik zu erstellen. Es werden vom Anwender keine<br />
umfassenden Kenntnisse über dreidimensionale Grafik vorrausgesetzt, wie es bei <strong>Open</strong> GL der Fall<br />
ist. Die Entwicklung von Java3D begann 1996 in einer Gruppe von Firmen mit dem Zweck, eine<br />
plattformübergreifende und effiziente API zu entwerfen. Die Unternehmen Intel, Sun und SGI sahen<br />
das Haupteinsatzgebiet in der Realisierung von Internet-Visualisierungs-Anwendungen. Nach<br />
eineinhalb Jahren wurde die erste endgültige Spezifikation vorgestellt.<br />
3.1 Szenegraph<br />
Der Szenegraph von Java3D ist wie auch in <strong>VRML</strong> und <strong>Open</strong> <strong>Inventor</strong> ein azyklischer, gerichteter<br />
Graph. Jedoch gibt es einige Unterschiede im Aufbau des Graphen.<br />
Die Knoten sind Java Objekte, die in der Baumstruktur angeordnet sind. Solch ein Graph oder<br />
mehrere dieser Strukturen können einem sogenannten virtuellen Universum hinzugefügt werden. Die<br />
Anordnung der Knoten bestimmt, wie und wo ein 3D-Objekt dargestellt wird, oder wie der Benutzer mit<br />
ihnen interagieren kann. Eine Verbindung zwischen zwei Knoten stellt dabei immer eine Vater-Kind-<br />
Beziehung dar, d.h. der Zustand eines Kindknoten definiert sich durch die Knoten auf direktem Pfad<br />
zwischen Kind und der Wurzel, während etwa in <strong>Open</strong> <strong>Inventor</strong> ein Knoten links oben alle Knoten<br />
rechts unterhalb seiner Position beeinflussen kann.<br />
13
Es können in Java3D Teilgraphen wiederverwendet werden, was die Implementierung etwas<br />
erleichtert. Ein Weg ist, dass sich verschiedene Szenegraphen einen gemeinsamen Unterbaum teilen,<br />
oder ein großer Teil der Knotenstruktur wird geklont, und nur Texturen und Geometrien werden gemeinsam<br />
genutzt, wobei Veränderungen an allen gemeinsam benutzten Bestandteilen entsprechend<br />
alle beteiligten Szenegraphen beeinflussen. Da keine zwei Referenzen auf einen Knoten verweisen<br />
können, wird die Wiederverwendung ganzer Teilbäume mit speziellen Linkknoten ermöglicht. Der in<br />
der folgende Darstellung gezeigte Szenegraph ist eine einfache Variante einer Szenegraphstruktur,<br />
wie sie Java3D vorkommt.<br />
Abbildung 11 Beispiel eines Szenegraph von Java3D<br />
Die Objekte (Knoten) lassen sich in Java3D in drei Gruppen einteilen. Die erste Gruppe bilden Knoten,<br />
die dem Szenegraphen übergeordnet sind, in einer zweiten sind alle Knoten enthalten, die für<br />
Darstellung, Positionierung und Interaktion verwendet werden. Eine dritte umfasst die Elemente, die<br />
den Betrachter der virtuellen Welt beschreiben. Die wichtigsten Knoten werden in der folgenden<br />
Aufzählung kurz erklärt.<br />
VirtualUniverse: Dieser Knoten stellt die Wurzel eines Szenegraphen in Java3D dar, welche der<br />
Strukturierung der einzelnen Teilgraphen dient. Kinder des VirtualUniverse-Knotens müssen immer<br />
Locale-Knoten sein. Es ist möglich, in einer Anwendung mehr als ein virtuelles Universum zu<br />
definieren, sie sind jedoch völlig unabhängig voneinander, d.h. es ist keine Interaktion zwischen<br />
beiden möglich.<br />
Locale: Mit diesem Objekt können Teilgraphen innerhalb eines virtuellen Universums zugeordnet<br />
werden. Ein „Locale“ kann ein Universum mit sehr großen räumlichen Ausdehnungen erschaffen. Ihm<br />
werden alle anderen Objekte zugeordnet. Ihre Position wird nur mit Gleitkommazahlen relativ zu dem<br />
zugehörigem „Locale“ angeben.<br />
SceneGraphObject: Dies ist die Basisklasse für die eigentlichen Szenegraphkomponenten, während<br />
„Locale“ und „VirtualUniverse“ keine Subklassen dieses Typs sind. Szenegraphobjekte werden zu<br />
einem Graphen zusammengesetzt und mittels eines Locale-Knoten in ein virtuelles Universum<br />
eingebunden. Die Basisklassen werden von den Klassen „Node“ und „NodeComponet“ erweitert.<br />
Node: Node dient als Basisklasse für alle Java3D-Knoten. Diese werden in Blattknoten und Gruppenknoten<br />
unterteilt. Gruppenknoten können je nach Typ ihre Kinder auf spezielle Art und Weise gruppieren.<br />
Blattknoten können keine Kindknoten besitzen. Sie repräsentieren die Objekte, die Java3D<br />
wirklich darstellt, welche neben geometrischen Objekten auch Licht oder Ton sein können.<br />
14
NodeComponent: Knotenkomponenten können nicht wie normale Knoten eine Vater-Kind-Beziehung<br />
eingehen, sondern dienen der genaueren Definition der Knoten, von denen sie referenziert werden.<br />
Während Knoten nur ein Elternteil besitzen können, kann eine Knotenkomponente von mehreren<br />
Knoten angesprochen werden.<br />
3.2 View-Teilbaum<br />
Eine Neuerung, die mit Java3D umgesetzt wurde, findet man im View-<strong>Mode</strong>ll. Mit dem neuen <strong>Mode</strong>ll<br />
kann die Szene des selben Szenegraphen entsprechend dem Ausgabegerät gerendert werden. Selbst<br />
wenn sich die Ausgabegräte physikalisch stark unterscheiden, ist die richtige Darstellung möglich.<br />
Diese Vielseitigkeit wird erreicht über die Trennung von virtueller und physikalischer Welt. Java3D<br />
definiert einen Zusammenhang zwischen diesen beiden Welten, der bestimmt, wie der User Objekte in<br />
der virtuellen Welt manipulieren kann, und wie Aktivitäten der virtuellen Objekte die Darstellung der<br />
Szene für den User verändern. Der Benutzer existiert dabei in beiden Welten. Er hat eine Position und<br />
eine Orientierung in der virtuellen Welt. Ebenso haben er und seine Ausgabengeräte eine Position<br />
und Orientierung in der realen Welt.<br />
Der Szenegraph repräsentiert dieses <strong>Mode</strong>ll in einem speziellen Teilbaum. Der ViewPlatform-Knoten<br />
ist ein Bestandteil dieses Teilgraphen. In ihm sind Position, Orientierung und Skalierung des Betrachters<br />
in einer 3D-Szene festgehalten.<br />
3.3 Ereignisse und Interaktion<br />
Die zentrale Klasse für die Realisierung von Interaktion, Animation und Kollisionserkennung ist die<br />
Behavior-Klasse. Die Behavior-Knoten werden „wach“, sobald ein bestimmtes Ereignis eintritt. Diese<br />
verändern dann mit einer speziellen Methode den Szenegraphen oder ermitteln z.B. selektierte<br />
Objekte. Ereignisse, die durch den Benutzer ausgelöst wurden, der Ablauf einer gewissen Zeitspanne<br />
und andere Kriterien dienen als Aufwachkriterien.<br />
Die Behavior-Klasse unterstützt des weiteren die Auswahl von Objekten. Dies geschieht über die Definition<br />
eines eigenen Behavior-Objekts, das sich für den Empfang von einfachen Fenster-Events registriert.<br />
Mit Hilfe der Methode processStimulus() kann dann das ausgewählte Objekt ermittelt werden. Da<br />
es auch möglich ist, den Pfad des Objekts vom Locale bis zu seiner Position zu bestimmen, kann<br />
nach dem Auswählen auch seine Position und Orientierung in der virtuellen Welt verändert werden. Es<br />
existieren auch drei vorgefertigte „Picking“-Klassen, die dem Entwickler die Arbeit mit der Auswahl von<br />
Objekten sehr vereinfachen.<br />
4 <strong>Retained</strong> <strong>Mode</strong>: Vergleich <strong>Open</strong> <strong>Inventor</strong>, <strong>VRML</strong>, Java3D<br />
Das Rendering ist ein optische Auswertung eines dreidimensionalen <strong>Mode</strong>lls. Es gibt verschiedene<br />
Renderingmodi mit entsprechend unterschiedlichen <strong>Mode</strong>llen als Grundlage. Der Immediate <strong>Mode</strong><br />
zum sofortigen Zeichnen wird von <strong>Open</strong> GL angeboten. Der <strong>Retained</strong> <strong>Mode</strong> setzt die Szenegraphstruktur<br />
voraus, in dem aber alle Objekte modifiziert werden können. Wesentlicher Unterschied der<br />
beiden Modi liegt in der Übersicht über die 3D-Szene. Dabei ist der Überblick des Programmierers genauso<br />
von Bedeutung wie der des Systems. Dies äußert sich in der Flexibilität bei der Darstellung und<br />
Manipulation der 3D-Szene und in der Ausführungsgeschwindigkeit. Das System ist in der Lage, die<br />
Teile des Szenegraphen, die sich nicht ändern, beizubehalten und die Neuberechnung auf die<br />
veränderten Teilbäume zu beschränken.<br />
15
Der vorangegangene Teil der Arbeit zeigt bereits, welche Unterschiede die einzelnen Grafiksysteme<br />
bei der Verwaltung und Manipulation von 3D-Szenen haben. Die <strong>Open</strong> GL hat dagegen keine vergleichbare<br />
Struktur wie den Szenegraphen, sondern bietet in erster Linie den Immediate <strong>Mode</strong>, der<br />
keine einschränkenden Datentypen und Verwaltungsstrukturen verlangt. Das hat zur Folge, dass der<br />
Programmcode selbst bei einfachen dreidimensionalen Strukturen sehr komplex werden kann. Es<br />
können in <strong>Open</strong> GL sehr viele variable Datenstrukturen verwendet werden, und der Entwickler hat<br />
volle Kontrolle über das Rendering. Jedoch hat diese Flexibilität ihren Preis in Form eines hohen Programmieraufwands<br />
und der Voraussetzung umfangreichen Wissens über <strong>Open</strong> GL auf der Seite des<br />
Entwicklers. Die Hersteller haben <strong>Open</strong> GL gerade unter einer solchen Zielsetzung entwickelt und<br />
<strong>Open</strong> GL als erweiterbare Grundlage für andere 3D-Grafiksysteme geplant. <strong>Open</strong> <strong>Inventor</strong>, <strong>VRML</strong> und<br />
Java3D verwenden <strong>Open</strong> GL als Renderingmaschine. Sie ermöglichen durch eine abstraktere<br />
Umgebung die einfache Erstellung und Manipulation von 3D-Szenen. Basierend auf der Szenegraphstruktur<br />
kann der Entwickler schneller und einfacher eine virtuelle Welt erschaffen und greift dabei auf<br />
eine fertige Ereignisbehandlung oder vorgegebene geometrische Objekte zurück.<br />
Im <strong>Mode</strong>ll, das vom <strong>Retained</strong> <strong>Mode</strong> vorausgesetzt wird, liegen wesentliche Unterschiede der drei Grafiksysteme.<br />
Diese beginnen mit der Auswertung des Szenegraphen, die <strong>Open</strong> <strong>Inventor</strong> von links oben<br />
beginnend nach rechts unten durchführt. Der Zustand, der dabei mitgeführt wird, ändert sich von<br />
Knoten zu Knoten. Diese Abhängigkeit der Nachfolgerknoten von ihrem Vorgänger ist in <strong>VRML</strong> nur<br />
teilweise übernommen worden. Da die Traversierung in einem <strong>VRML</strong>-Szenegraphen nicht strikt<br />
vorgeschrieben ist, sind die Abhängigkeiten zwischen den Knoten nicht so stark wie in <strong>Open</strong> <strong>Inventor</strong>.<br />
In <strong>VRML</strong> werden Eigenschaften für ein Objekt gekapselt, d.h. einer geometrischen Struktur werden<br />
ihre Eigenschaften in den Kinderknoten zugeordnet, während in <strong>Open</strong> <strong>Inventor</strong> eine Eigenschaft durch<br />
den Vorgänger bestimmt wird. Der Java3D-Renderer kann dagegen den Szenegraphen in beliebiger<br />
Reihenfolge durchlaufen oder ihn auch parallel verarbeiten, was erst die Eigenschaften einer<br />
objektorientierten Programmiersprache ermöglichen.<br />
In <strong>VRML</strong> und <strong>Open</strong> <strong>Inventor</strong> ist es Knoten erlaubt, mehrere Elternteile zu besitzen, wodurch die<br />
Wiederverwendung von Knoten oder ganzen Teilbäumen erleichtert wird. Die einzige Einschränkung<br />
besteht darin, dass kein Zyklus im Szenegraphen auftreten darf. Java3D benötigt für die Mehrfachreferenzierung<br />
einen speziellen Linkknoten.<br />
Eine Struktur, wie sie der <strong>Retained</strong> <strong>Mode</strong> voraussetzt, ist unerlässlich bei der Erstellung von Animationen.<br />
Der Szenegraph kann das Rendern einer Animationsszene effizienter gestalten. Außerdem<br />
wird durch die Anordnung der Knoten im Graphen die Lage der 3D-Objekte zueinander beschrieben.<br />
Somit werden Kollisionserkennung und die Zuordnung von Ereignissen an bestimmte Objekte möglich.<br />
Für gewöhnlich nehmen Animationen viel Rechenzeit in Anspruch. Mit steigender Zahl von Animationen<br />
steigt auch die Gefahr, dass sie nicht mehr flüssig dargestellt werden können. Da sich der<br />
Betrachter jedoch an einem bestimmten Punkt in der Szene befindet, stellt sich die Frage, welche Animation<br />
wirklich berechnet werden muss, und wie detailgetreu weit entfernte Objekte sein müssen.<br />
Somit ist entscheidend, wo sich der Betrachter befindet und welche Orientierung er hat. Java3D bietet<br />
das Behavior-Konzept an, welches es ermöglicht, je nach Betrachterposition oder Orientierung<br />
bestimmte Bereiche in Ruhezustand zu versetzen. Dies verschafft dem Anwender eine einfach<br />
anzuwendende Möglichkeit, die Zahl der Animationen, die tatsächlich berechnet werden, zu<br />
minimieren. <strong>VRML</strong> bietet dem Entwickler zwei spezielle Knoten an, um nicht benötigte Bereiche und<br />
Animationen abzuschalten. Der Sensor ProximitySensor sendet Ereignisse, wenn der Betrachter<br />
einen bestimmten Bereich betritt, ein weiterer Sensor sendet Ereignisse aus, wenn ein quaderförmiger<br />
Bereich in das Sichtfeld kommt (VisbilitySensor). Verbunden mit einem Interpolator kann das Ereignis<br />
das Ab- und Anschalten einer Animation auslösen. Damit ermöglicht die Szenegraphstruktur die<br />
Bereitstellung einer einfach anzuwendenden und effektiven Steuerung von Animation.<br />
Durch die Abgrenzung von 3D-Darstellern, die in der Struktur des Szenegraphen vorgenommen wird,<br />
ist die Selektion von Objekten im <strong>Retained</strong> <strong>Mode</strong> recht einfach umzusetzen. Wie bereits beschrieben<br />
haben alle drei Grafiksysteme mehr oder weniger abstrakte Lösungen für dieses Problem.<br />
16
Manchmal ist es notwendig, auf das zugrundeliegende Renderingsystem zurückzugehen. Der Eingriff<br />
in den Renderingprozess wird im <strong>Retained</strong> <strong>Mode</strong> der drei Grafiksysteme sehr unterschiedlich gehandhabt.<br />
In <strong>Open</strong> <strong>Inventor</strong> ist es erlaubt, die Darstellung des Szenegraphen mit <strong>Open</strong> GL-Anweisungen<br />
zu vermischen. Da für Java3D und <strong>VRML</strong> das zugrundeliegende Renderingsystem nicht unbedingt<br />
<strong>Open</strong> GL ist, können sie keinen Rückgriff vornehmen. Die Portabilität der Systeme stand bei ihrer Entwicklung<br />
im Vordergrund, damit auch andere Grafikpakete wie DirectX als Renderingmaschinen<br />
genutzt werden können. Java3D bietet jedoch auch einen Immediate <strong>Mode</strong>, in dem die<br />
Szenegraphstruktur verlassen werden kann. Die Klasse GraphicsContext3D wird verwendet, um eine<br />
Szene im Immediate <strong>Mode</strong> unter Java3D zu realisieren. Diese Klasse ist wie <strong>Open</strong> GL eine Zustandsmaschine.<br />
Es gibt zwei verschiedene Möglichkeiten, den Immediate <strong>Mode</strong> umzusetzen. Im Pure<br />
Immediate <strong>Mode</strong> wird nur noch ein minimaler Szenegraph verwendet, und der Anwender ist<br />
vollständig für das Rendering verantwortlich. Die Verwaltung liegt vollständig in den Händen des<br />
Entwicklers, er kann aber die Java 3D-Objekte und Attribute nutzen. Das Mixed <strong>Mode</strong> Rendering ist<br />
eine Zwischenstufe des Immediate <strong>Mode</strong> und des <strong>Retained</strong> <strong>Mode</strong>. In ihm läuft der Renderer<br />
automatisch und stellt den Szenegraphen dar. Die Applikation muss von der Klasse Canvas3D<br />
abgeleitet werden, kann dann aber an mehreren vordefinierten Stellen durch Überschreiben<br />
bestimmter Methoden Immediate <strong>Mode</strong> Objekte darstellen. Ein weiter Renderingmodus ist der<br />
Compiled <strong>Retained</strong> <strong>Mode</strong>, welcher ermöglicht, dass ein Teil des Szenegraphen kompiliert wird. Damit<br />
ist Java3D in der Lage, intern Optimierungen vorzunehmen. Dadurch erhält man zwar eine erhöhte<br />
Ausführungsgeschwindigkeit, was jedoch zu Lasten der Flexibilität geht.<br />
17
Literaturverzeichnis<br />
[1] Hans-Lothar Hase,<br />
„Dynamische virtuelle Welten mit <strong>VRML</strong> 2.0“<br />
Heidelberg: dpunkt, Verlag für digitale Technologie, 1. Auflage 1997<br />
ISBN 3-920993-63-2,<br />
[2] http://www.th.physik.uni-frankfurt.de/~maruhn/html/inventor.html<br />
Bildbeispiel für <strong>Open</strong> <strong>Inventor</strong><br />
[3] http://www.cs.fsu.edu/~grant/projects/3dgrapher/images/mateditor.jpg<br />
Bildbeispiel für MaterialEditor<br />
[4] http://vlado.fmf.uni-lj.si/vrml/dsi.96/defengl.htm<br />
Beispiele für <strong>VRML</strong><br />
[5] http://emsh.calarts.edu/~mathart/sw/objView/thicken.html<br />
[6] http://www.uni-koeln.de/ew-fak/Chemie/<strong>VRML</strong>_Beispiele.htm<br />
[7] http://www.web3d.org/<br />
[8] http://www.blaxxun.com/<br />
Viewer für die <strong>VRML</strong>-Beispiele<br />
[9] www.sun.com<br />
[10] www.tgs.com<br />
[11] www.j3d.org<br />
[12] http://www.debacher.de/vrml/<br />
[13] http://www.immersive-sim.de/, Abbildung 6<br />
18