Leaf Node Objects


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

Übersicht: Leaf Node Objects


Shape3D

3D-Shapes stellen die geometrischen Objekte im Szenengraph dar. Ihre besonderen Eigenschaften definieren sie über die NodeComponents Appearance und Geometry, die mit dem Objekt verbunden sind. Bei den folgenden Objekten wird keine besondere Appearance benötigt, es wird lediglich Geometrie erzeugt, die beim Konstruktoraufruf als Parameter übergeben wird.
  1. // erzeugt die Umlaufbahnen und die Erdachse
  2. Shape3D earthOrbit =
  3. new Shape3D(createCircleGeometry(EARTHORBIT, CIRCLECOORDS));
  4. Shape3D moonOrbit =
  5. new Shape3D(createCircleGeometry(MOONORBIT, CIRCLECOORDS));
  6. Shape3D earthAxis =
  7. new Shape3D(createLineGeometry(EARTHAXIS));


Behavior

Behavior ist die Basis für Interaktion und Animation. Was wird unter diesen Begriffen verstanden ? Interaktion ist die Reaktion des Szenengraphen auf Aktionen des Benutzers, so z. B. das Ändern der Blickrichtung durch Manipulation des ViewPlatform Transforms nach Bedienung der Cursortasten. Animation hingegen verändert zwar auch den Szenengraphen, die Aktion wird aber nicht durch den Benutzer hervorgerufen, sondern durch das Verstreichen eines bestimmten Zeitintervalls. Im folgenden Code-Fragment wird dieses Zeitintervall durch ein Alpha Objekt bestimmt. Durch Angabe der Parameter -1 sowie MONTH im Konstruktoraufruf, beträgt ein Rotationszyklus MONTH Millisekunden und wird unendlich mal wiederholt. Der RotationInterpolator als Animation-Behavior läßt den Mond um die Erde kreisen, indem auf die Koordinaten des Mondes eine Rotation angewandt wird. Durch die Methode setSchedulingBounds wird der Gültigkeitsbereich des Interpolators angegeben.
  1. // simuliert einen Monat (Bewegung Mond um Erde)
  2. TransformGroup objMonth = new TransformGroup();
  3. objMonth.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
  4. RotationInterpolator rotIntMonth =
  5. new RotationInterpolator(new Alpha(-1, MONTH), objMonth);
  6. rotIntMonth.setSchedulingBounds(bounds);
Bei der Bewegung des Mondes um die Erde wurde ein RotationInterpolator verwendet. Dieser einfache Interpolator kann nicht auf die Drehung der Erde um die Sonne angewandt werden. Würde man dies tuen, wäre das ganze Jahr über ein Pol der Sonne zugeneigt und der andere Pol der Sonne abgeneigt. Der Interpolator würde die physikalische Realität falsch interpretieren. Nordpol und Südpol sind abwechselnd im Halbjahresrythmus der Sonne zugeneigt, was die Phänomene Polarnacht und Polartag hervorbringt. Im u. a. Code-Fragment wird daher ein PositionPathInterpolator eingesetzt. Er dient dazu, eine bestimmte Wegstrecke abzuschreiten, deren Koordinaten in unserem Beispielprogramm über die Hilfsmethode createCircleCoords angegeben werden. Die Hilfsmethode berechnet dabei die Koordinaten der Erdumlaufbahn.
  1. float[] knots = new float[CIRCLECOORDS];
  2. for (int n = 0; n < CIRCLECOORDS; ++n) {
  3. knots[n] = (float)n * (1 / (float)(CIRCLECOORDS-1));
  4. }
  5. // simuliert ein Jahr (Bewegung der Erde um die Sonne)
  6. TransformGroup objYear = new TransformGroup();
  7. objYear.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
  8. PositionPathInterpolator rotIntYear =
  9. new PositionPathInterpolator(
  10. new Alpha(-1, YEAR),
  11. objYear,
  12. new Transform3D(),
  13. knots,
  14. createCircleCoords(EARTHORBIT, CIRCLECOORDS)
  15. );
  16. rotIntYear.setSchedulingBounds(bounds);
Die Koordinaten eines Kreises lassen sich unter Verwendung der Hilfsmethode createCircleCoords bestimmen. Parameter r gibt dabei den Radius des Kreises an. Da ein Kreis eigentlich aus unendlich vielen Koordinatenpaaren besteht, muss hier eine Beschränkung erfolgen. Die Anzahl der Koordinatenpaare wird dabei durch den Parameter N angegeben. Je größer der Wert für N ist, desto genauer oder runder wird der berechnete Kreis.
  1. // liefert die Koordinaten eines Kreises mit dem Radius r und N Paaren
  2. private Point3f[] createCircleCoords(float r, int N) {
  3. Point3f[] coords = new Point3f[N];
  4. int n;
  5. double a;
  6. float x, z;
  7. for (a = 0, n = 0; n < N; a = 2.0 * Math.PI / (N-1) * ++n) {
  8. x = (float) (r * Math.sin(a));
  9. z = (float) (r * Math.cos(a));
  10. coords[n] = new Point3f(x, 0f, z);
  11. }
  12. return coords;
  13. } // Ende Methode createCircleCoords
Neben Animation ist auch Interaktion im Beispielprogramm enthalten. MouseRotate sorgt dafür, dass man durch Drücken der linken Maustaste und durch gleichzeitiges Bewegen der Maus das Universum je nach Bewegung um die x, y oder z-Achse drehen kann. Somit hat der Benutzer die Möglichkeit, das Universum aus verschiedenen Perspektiven zu betrachten. Auch Translation und Skalierung werden von entsprechendem Mouse Behavior unterstützt.
  1. // Mouse Rotation Behavior zum Rotieren des Universums mit der Maus
  2. TransformGroup objRotate = new TransformGroup();
  3. objRotate.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
  4. objRotate.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
  5. MouseRotate mouseRotate = new MouseRotate();
  6. mouseRotate.setTransformGroup(objRotate);
  7. mouseRotate.setSchedulingBounds(bounds);


Light

Obwohl Licht unterschiedliche Gestalt annehmen kann, wird lediglich das PointLight im Beispielprogramm verwendet. Point Light bezeichnet das Licht, das von einer bestimmten Position ausgeht und in alle Richtungen strahlt. Unsere Sonne steht im Zentrum des Sonnensystems und scheint nicht in eine bestimmte Richtung. Ein weiteres Beispiel für das PointLight ist die Kerze. Daneben gibt es noch das Directional Light, das aus einer entfernten Richtung kommt, im Gegensatz zum PointLight aber über keine Positionsangabe verfügt. Beispiel dafür ist die Sonne, die in den Raum eines Hauses scheint. Kombiniert man PointLight und DirectionalLight, erhält man ein Licht, dass sowohl über eine Position als auch eine Richtung verfügt: das Spotlight. Spotlight ist eine Subklasse von PointLight. Die Lampe wäre ein Beispiel dafür. Ambient Light wiederum ist das Licht, das scheinbar aus allen Richtungen kommt. Wie ein 3D-Objekt auf Lichteinwirkung reagieren soll, wird über das Material Objekt festgelegt. Der Gültigkeitsbereich des Licht wird über die Methode setInfluencingBounds angegeben.
  1. // erzeugt das Sonnenlicht
  2. PointLight sunlight = new PointLight();
  3. sunlight.setInfluencingBounds(bounds);


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