Group Node Objects


... [ Seminar XML und JAVA ] ... [ Thema Java 3D API ] ... [ Leaf Node Objects ] ...

Übersicht: Group Node Objects


BranchGroup

In der Einleitung wurde das Thema BranchGroup schon angeschnitten. Die BranchGroup dient als Wurzelelement eines Astes des Szenengraphs. Meist sind zwei Äste (Branch) vorhanden: Ein Content-Branch für den Inhalt, ein View-Branch für die Ansicht. Da wir der Einfachheit halber im Beispielprogramm ein SimpleUniverse Objekt erzeugen, können wir auf den Aufbau des View-Branchs verzichten. Daher wird im folgenden Code-Fragment lediglich der Content-Branch erzeugt.
  1. // erzeugt den Content-Branch des Szenengraphen
  2. public BranchGroup createSceneGraph() {
  3. BranchGroup objRoot = new BranchGroup();
BranchGroups können kompiliert werden. Die Kompilierung bewirkt eine Optimierung des Asts (Branch). Günstig ist eine Optimierung z. B. dann, wenn aus Gründen der Lesbarkeit der Anwendungsentwickler zwei TransformGroups untereinandergehängt hat, die man auch zu einer TransformGroup hätte zusammenfassen können. Das Zusammenfassen übernimmt nun die compile-Methode.
  1. // nimmt Optimierungen am Ast des Szenengraphen vor
  2. objRoot.compile();
  3. return objRoot;
  4. } // Ende Methode createSceneGraph


TransformGroup

Die TransformGroup steht in Verbindung mit einem Transform3D Objekt oder einem Interpolator. Die dort definierte Transformation wirkt sich auf alle Söhne dieser Gruppe aus. Interpolatoren werden an anderer Stelle behandelt, nämlich unter Behavior. Behavior ist ein Leaf Node Object. Ein Transform3D Objekt dient zur Translation, Rotation und Skalierung geometrischer Objekte. Im folgenden Code-Fragment wird die Translation angewandt. Die Verschiebungsrichtung wird dabei durch einen Vektor aus dem vecmath-Paket angegeben. Die Söhne dieser TransformGroup (der Mond) werden um die Konstante MOONORBIT (Abstand Erde/Mond) in z-Richtung verschoben.
  1. // versetzt den Mond auf seine Umlaufbahn
  2. Transform3D moonTranslate = new Transform3D();
  3. moonTranslate.set(new Vector3f(0f, 0f, MOONORBIT));
  4. TransformGroup objMoonTranslate = new TransformGroup(moonTranslate);
Im folgenden Code-Fragment kommt die Rotation zum Einsatz. Da die Erdachse leicht geneigt ist, muss sie um die Z-Achse gedreht werden. Die Konstante ECLIPTIC gibt dabei den Winkel im Bogenmaß an.
  1. // simuliert die Ekliptik (Neigung der Erdachse)
  2. Transform3D ecliptic = new Transform3D();
  3. ecliptic.rotZ(ECLIPTIC);
  4. TransformGroup objEcliptic = new TransformGroup(ecliptic);
Java 3D verwendet ein Transformationsmodell das sich der klassischen 3D-Mathematik bedient. Eine Transformation wird als 4x4 Double-Matrix dargestellt. Durch die Werte in der oberen 3x3 Matrix wird eine Rotation und eine Skalierung festgelegt. Die Werte m03, m13 und m23 dienen wiederum der Translation. Transformiert wird indem die Transformationsmatrix mit einem 4-Tupel welches die zu transformierenden Koordinaten enthält multipliziert wird. Das Ergebnis stellt die neuen transformierten Koordinaten dar. Da die Transformationsmatrix eine gewöhnliche Matrix ist, wie sie uns aus der Linearen Algebra her bekannt ist, kann man darauf beliebige Operationen anwenden. Vorsicht ist aber geboten bei dem Versuch zwei Transformationen durch die Multiplikation miteinander zusammenzufassen, denn die Matrixenmultiplikation ist nicht kommutativ.

Java3D 4x4-Transformationsmodell

[ m00 m01 m02 m03 ]   [ x ]   [ x' ]
[ m10 m11 m12 m13 ] . [ y ] = [ y' ]
[ m20 m21 m22 m23 ]   [ z ]   [ z' ]
[ m30 m31 m32 m33 ]   [ w ]   [ w' ]

x' = m00 . x + m01 . y + m02 . z + m03 . w
y' = m10 . x + m11 . y + m12 . z + m13 . w
z' = m20 . x + m21 . y + m22 . z + m23 . w
w' = m30 . x + m31 . y + m32 . z + m33 . w


Primitive

Zum Glück muss man nicht alle geometrischen Figuren selber definieren. Wie dies geht ist unter dem Gliederungspunkt NodeComponent Objects - Geometry beschrieben. Viel Zeit spart man, wenn man vordefinierte Geometrie verwendet. Das Paket com.sun.j3d.utils.geometry enthält die Klassen: Box (Kiste), Cone (Kegel), Cylinder (Zylinder) und Sphere (Kugel). Im Beispielprogramm bedienen wir uns der Sphere, um eine Kugel mit dem Radius SUNRADIUS und der Appearance sunAppear zu erzeugen.
  1. Sphere sun = new Sphere(SUNRADIUS, sunAppear);


... [ Seminar XML und JAVA ] ... [ Thema Java 3D API ] ... [ Group Node Objects ] ... [ Leaf Node Objects ] ...