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.
- Würfel mit Zentrum in der Mitte, das ausrichten geht nicht.
- Bei diesem Versuch habe ich das Zentrum in die linken oberen Ecke verschoben. Jetzt stimmt die Ausrichtung.
- Aber leider geht jetzt eine Rotation um die Z Achse schief.