3d-Programmierung in Java

Einleitung

Zur 3d-Programmierung in Java gibt es verschiedene Methoden. Ich selber verwende dafür die LWJGL-Engine und dazu den JMonkey-Szenengraph JME. Neben diesen beiden Paketen gibt es auch noch Java 3D das von Sun selber stammt. Mit dieser API habe ich mich aber bis jetzt nicht genauer befasst.

LWJGL-Engine

Die Leightweight Java Game Library ist ein OpenGL Warper für Java. Es ist möglich, nur mit dieser Engine zusammen 3d-Programme zu entwickeln, aber dies ist sehr aufwändig, da man direkt mit OpenGL-Befehlen arbeiten muss, und keine Abstraktion für Objekte (z.B. einen Würfel hat).

Szenengraph

Der bei LWJGL fehlende Abstraktion wird vom JME geliefert. JME ist in erster Linie ein Szenengraph, sprich er verwaltet alle Objekte die in der 3d-Welt dargestellt werden sollen.


Aufbau einer Szene.

Auf dem Bild sieht man den Aufbau einer Szene. Sie besteht aus drei Knoten und vier Objekten. Wobei wichtig ist, das nicht alle Objekte unbedingt sichtbar sein müssen. Auch eine Lichtquelle kann eine Objekt sein.

Jedes Objekt in einer Szene kann man verschiedene Eigenschaften verändern. Man kann z.B. die Position in der 3d-Welt setzen, oder Objekte skalieren und rotieren. Ein wichtiges Prinzip des Szenengraph ist, das man diese Eigenschaften auch auf einem Knoten setzten kann und sich das dann auch seine Kinder auswirkt.

Koordinatensystem

Das ist ein Thema, das mich zu beginn sehr verwirrt hat. In der 3D-Programmierung gibt es zwei verschiedene Koordinatensystem. Zum einen haben wir das Globale-System für die ganze Szene und dann gibt es noch ein sog. lokales System für jedes Objekt.

Das lokale System hat seinen Nullpunkt normalerweise im Zentrum eines Objektes (man kann das in JME ändern, ist aber nicht sehr empfehlenswert.).


Die schwarzen Pfeile stellen das globale und die roten das lokale Koordinatensystem dar.

Will man Objekte, jetzt in der Szene verschieben, so muss man die Position im lokalen System setzten und nicht im globalen. Das gleiche gilt auch für die Rotationen. Und solange man das lokale System nicht aus der Mitte des Objektes verschoben hat, sind auch die Resultate so wie man sie erwartet.

Ich hatte hier das Problem, das ich Objekte schön aufeinander ausrichten wollte, dabei haben sich die Objekte aber immer überlappt


Ansicht von Oben auf die Würfel, die auf die darunterliegende Ebene ausgerichtet werden sollen.

  1. Würfel mit Zentrum in der Mitte, das ausrichten geht nicht.
  2. Bei diesem Versuch habe ich das Zentrum in die linken oberen Ecke verschoben. Jetzt stimmt die Ausrichtung.
  3. Aber leider geht jetzt eine Rotation um die Z Achse schief.
Das Problem lässt sich aber ganz einfach lösen, wenn man alle Objekte die Ausgerichtet werden sollen in einen gemeinsamen Knoten tut und diesen Knoten dann um die anzahl Einheiten verschiebt, die man für die Ausrichtung benötigt. So muss man den Nullpunkt der Objekte nicht verändern und es gehen auch die Rotationen wieder.