05.08.2013 Aufrufe

Proseminar Computergrafik: Retained Mode: Open Inventor, VRML ...

Proseminar Computergrafik: Retained Mode: Open Inventor, VRML ...

Proseminar Computergrafik: Retained Mode: Open Inventor, VRML ...

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!