Die Java-3D-API ermöglicht das Entwickeln von Applikationen, die optisch äußerst realistisch wirken. Der Artikel erläutert detailliert die Funktionsweise von Java-3D und liefert anschauliche Beispiele.
Seit Version 1.2 wird Java-3D im Rahmen des Java Community Process[1] entwickelt. Java-3D setzt auf OpenGL und Direct3D auf. Gleichzeitig ist es eine Schnittstelle, die Grafikprogrammierung mittels eines echten objektorientierten Konzepts ermöglicht. Darüber hinaus bietet Java-3D auch umfangreiche Unterstützung für 3D-Sound.
Zur Konstruktion einer Szene wird ein Szenengraph eingesetzt. Er repräsentiert die darzustellenden Objekte. Ein solcher Szenengraph ist wie ein Baum strukturiert, der eine Reihe von Elementen enthält, die zur Anzeige der Objekte notwendig sind.
So funktioniert die 3D-Welt
Der Aufbau von Java-3D unterscheidet sich deutlich von anderen gängigen 3D-Grafik-APIs wie OpenGL oder Direct3D. Dies sind prozedurale Low-Level-APIs, die eng mit der 3D-Hardware verbunden sind. Bei Java-3D richtet man hingegen sämtliche Grafikobjekte (auch Geometrieobjekte genannt) in einem sogenannten Szenengraphen ein. Dieses hierarchische Modell enthält alle Informationen über die darzustellenden Objekte und ihre Bearbeitung. Anschließend wird der Szenengraph zum Rendern an Java-3D übergeben. Für die Darstellung der Daten muss keinerlei Code geschrieben werden - das erledigt Java-3D. Mittels der zahlreichen leistungsfähigen integrierten Werkzeuge kann der Entwickler gleich auf einer höheren Ebene programmieren.
Java-3D nutzt dabei jede 3D-Beschleunigung, die die Grafikkarte bereitstellt. Letztlich erzeugt Java-3D OpenGL-Aufrufe in einer JNI-Schicht, die von der Grafikkarte beschleunigt werden können. Mit OpenGL beschleunigte Karten sind inzwischen in vielen Rechnern Standard. Deshalb sollten die Java-3D-Programme in der Regel hardwarebeschleunigt sein.
Bei dreidimensionalen Koordinaten (x,y,z) gibt die z-Komponente die Entfernung zum Betrachter an. Java-3D verwendet z-Werte, um nicht sichtbare Flächen verdeckter Objekte zu entfernen. Die z-Werte des roten Ringes im folgenden Bild sind klein, weil er sich dicht am Betrachter befindet. Er verdeckt Teile des blauen Ringes, wenn die z-Werte der beiden Ringe während des Renderns verglichen werden.
![]() |
Will man ohne die Stammfunktionen-Klassen arbeiten, muss die Shape3D-Klasse verwendet werden, um alle Scheitelpunkte anzugeben. Die Daten lassen sich in Gestalt von Dreiecken, Vierecken, Linien oder Punkten spezifizieren. Die geometrische Repräsentation einer Kugel würde zum Beispiel als polygonales Netz definiert, üblicherweise mithilfe von Bändern aus miteinander verbundenen Dreiecken oder Vierecken.
Zumindest muss jeder Scheitelpunkt einen Ortswert (Koordinate) aufweisen. Zusätzlich zu den Ortswerten kann man noch weitere Elemente für jeden Scheitelpunkt angeben, etwa einen Farbwert, einen Normalvektor oder Texturkoordinaten. Normalvektoren finden für Beleuchtungseffekte Verwendung. Texturkoordinaten kommen zum Einsatz, um Texturen per Texturmapping auf einer Oberfläche darzustellen. Jeder Scheitelpunkt kann auch einen Alpha-Wert haben (für die Transparenz), der zusammen mit seiner Farbe angegeben wird. Bei Verwendung der Stammfunktionen-Klassen werden die Scheitelpunktvektoren und die Texturkoordinaten automatisch erzeugt.
Obwohl sich eine ganze Menge Daten mit jedem Scheitelpunkt speichern lässt, werden viele Grafikeffekte mithilfe des Appearance-Objekts erzeugt. Dieses Objekt beschreibt die allgemeinen Attribute der Oberfläche eines Gegenstandes. Jedes Shape3D- und Stammfunktionen-Objekt verfügt über sein eigenes Appearance-Objekt. Jedes Appearance-Objekt enthält wiederum eine Reihe von Attribut-Objekten. So kann ein Appearance-Objekt beispielsweise sowohl ein ColoringAttributes-Objekt als auch ein RenderingAttributes-Objekt enthalten.
Wie funktionieren Transformationen, Lichteffekte und Texturierungen?
Wenn die Objekte fertig sind und dargestellt werden sollen, lassen sie sich mittels 3D-Transformationen bewegen und skalieren, also im Prinzip animieren. Ort, Richtung, und Orientierung der Ansicht bezeichnet man als Viewpoint. Transformationen werden als Matrizen angegeben, und zwar in der leistungsfähigen Transform3D-Klasse. Transform3D bringt zahlreiche Hilfsfunktionen mit, um gängige Transformationen festzulegen, etwa Translationen, Rotationen oder Skalierungen.
Die Methode setTranslation(Vector3f trans) führt eine Translation eines Objekts durch, verschiebt es also. Dazu werden die Translationswerte dieser Transformation durch die x-, y- und z-Werte im trans-Argument ersetzt. Die Methode setScale(double scale) legt den Skalierungsfaktor der Transformation fest. Diese Funktion dient zur Größenveränderung eines Objekts. Die Methode rotX(double angle) stellt die Rotationskomponente auf eine Drehung gegen den Uhrzeigersinn um die x-Achse ein.
Zusätzlich zur Auswahl der Objekte innerhalb der Szene lässt sich ihre Darstellung auch über Beleuchtungseffekte steuern. Man kann die Art des Beleuchtungseffekts, etwa ein Spotlight, und die Farbe des Lichts angeben. Ebenso sind Nebeleffekte und automatische Verhaltensweisen der Objekte möglich.Texturmapping (häufig auch als "Tapezieren" bezeichnet) verleiht einer Szene eine realistischere Darstellung. So lässt sich beispielsweise das Bild einer Holzmaserung auf die Oberfläche eines Objekts abbilden, um einen Eichentisch zu simulieren. Beim Einsatz von Texturmapping muss man angeben, welches Bild verwendet und wo es auf dem Objekt angebracht werden soll. Ebenso sind Angaben nötig, was zu tun ist, wenn das Bild nicht genau passt, etwa bei der Abbildung eines rechteckigen Bildes auf einem nicht rechteckigen Polygon. Java-3D hat das Verfahren zum Laden von Texturbildern vereinfacht. Die TextureLoader-Klasse ist Bestandteil der Utility-Klassen von Java-3D.
TextureLoader texLoader = new TextureLoader(url,imageobserver) appearance.setTexture(texLoader.getTexture());
Um ein realistisches Aussehen zu erzielen, sollten Länge und Breite des Texturbildes immer auf ein Vielfaches von 2 eingestellt werden. Andere Werte führen dazu, dass TextureLoader die Textur verzerrt.
Lichtquellen kommen zum Einsatz, um die Geometrieobjekte in einer Szene zu beleuchten. Es gibt vier Arten von Lichtquellen, sämtliche Unterklassen der abstrakten Light-Klasse. Alle Lichtquellen haben einen Farbwert und ein Ein/Aus-Bit. Ihr Bounding-Objekt beschreibt, welche Bereiche der Szene beleuchtet werden. In der realen Welt beleuchten meist mehrere Lichtquellen einen Gegenstand. Sonnenlicht und eine Deckenlampe haben beispielsweise Einfluss auf Farbe und Erscheinung der Objekte in einem Zimmer. In Java-3D lassen sich realistische Beleuchtungseffekte mithilfe mehrerer Lichtquellen simulieren. Folgende Arten von Lichtquellen können in einer Anwendung verwendet werden:
- Ein AmbientLight ist überall in der Szene. Dieses Umgebungslicht hat keinen bestimmten Ursprung und strahlt auch nicht in eine bestimmte Richtung.
- Ein PointLight strahlt von einem bestimmten Punkt aus in alle Richtungen und wird mit zunehmender Entfernung immer schwächer. Ein Beispiel für ein solches Punktlicht wäre eine Schreibtischlampe ohne Lampenschirm.
- Ein SpotLight ist ein spezielles Punktlicht, das auf einen Lichtkegel beschränkt ist, etwa eine Taschenlampe.
- Ein DirectionalLight leuchtet in eine bestimmte Richtung, geht aber nicht von einem bestimmten Punkt aus. Alle Lichtstrahlen einer gerichteten Lichtquelle sind parallel ausgerichtet. Theoretisch ist die Sonne ein Punktlicht, aber sie kann mit Hilfe eines DirectionalLight imitiert werden.
Die Teekanne im folgenden Bild weist Umgebungslicht auf - man kann sehen, dass die Rückseite etwas heller ist -, und es gibt ein gerichtetes Licht, das auf die Vorderseite scheint. Beide Lichtquellen haben Auswirkungen auf die endgültige Farbe jedes Dreiecks auf der Oberfläche der Teekanne.
![]() |
Man muss ein Material-Objekt erstellen, darin eine Beleuchtung ermöglichen und das Material-Objekt dem Appearance-Objekt hinzufügen. Das Material-Objekt ist eine von mehreren Attributsmengen, die im Appearance-Objekt enthalten sind.
Um besser zu verstehen, wie Materialeigenschaften sich auf die Erscheinung eines Objekts auswirken, kann man sich zum Beispiel einen glänzenden Rubin auf einem roten Teppich vorstellen. Beide sind zwar rot, aber sie reflektieren das Licht unterschiedlich: Der Rubin wird dort hell funkeln, wo er das Licht reflektiert, während der Teppich das Licht eher streut. Um diesen Unterschied Java-3D zu vermitteln, bekommt der Rubin einen hohen Wert für den Glanz im Material-Objekt, der Teppich einen sehr niedrigen Wert.
Eine Oberflächennormale ist ein Vektor, der am Scheitelpunkt senkrecht zur Oberfläche steht und die Ausrichtung der Oberfläche an diesem Punkt repräsentiert. Beim Berechnen von Beleuchtungseffekten beeinflusst die Oberflächennormale die Lichtreflexion einer Oberfläche.
Oberflächennormalen und Betrachterposition bestimmen, wo das glänzende Funkeln, also die Spiegelung, sich auf einer Kugel befindet. Es ist sehr erfreulich, dass die Stammfunktionen-Klassen die Oberflächennormalen automatisch erzeugen. Ein Java-3D-Szenengraph ist ein Baum mit zwei Teilen beziehungsweise Ästen: Ansicht und Inhalt. Der Ansichtsteil enthält alle technischen Details des komplexen Java-3D-Modells und definiert den Blickwinkel. Der Inhaltsteil beschreibt, was in der Szene zu sehen ist. Er enthält alle Grafikobjekte, etwa Kugeln, Quader und kompliziertere Geometrieobjekte, sowie die Transformationen, mit denen diese bewegt werden, also Lichtquellen, Verhaltensweisen, Gruppenknoten oder Nebel. Für die meisten einfachen Anwendungen lassen sich die Universe-Utility-Klassen verwenden, von denen die SimpleUniverse-Klasse die interessanteste ist.
Der folgende Quellcode erzeugt einen Szenengraph mit den Zylindern für die Achse und drei Kegeln. Dann wird ein weiterer Kegel hinzugefügt, der erst rotiert und dann verschoben wird. Ein anderer Kegel wird umgekehrt erst verschoben und dann gedreht.
Hinweis: Dies ist Applet-Code, der im Applet-Viewer oder in einem Internetbrowser angezeigt werden kann. Das Programm lässt sich aber auch ganz einfach in eine selbstständige Anwendung konvertieren.
Weitere Informationen zu Java-3D:
- Java-3D-API-Spezifikation[2]
- Java-3D-Anleitungen[3]
- Java-3D-Community-Website[4]
URLs in diesem Artikel:
[1] = http:/
[2] = http:/
[3] = http:/
[4] = http:/

