- // erzeugt die Umlaufbahnen und die Erdachse
-
- Shape3D earthOrbit =
- new Shape3D(createCircleGeometry(EARTHORBIT, CIRCLECOORDS));
- Shape3D moonOrbit =
- new Shape3D(createCircleGeometry(MOONORBIT, CIRCLECOORDS));
- Shape3D earthAxis =
- new Shape3D(createLineGeometry(EARTHAXIS));
- // simuliert einen Monat (Bewegung Mond um Erde)
-
- TransformGroup objMonth = new TransformGroup();
- objMonth.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
- RotationInterpolator rotIntMonth =
- new RotationInterpolator(new Alpha(-1, MONTH), objMonth);
- 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.
- float[] knots = new float[CIRCLECOORDS];
- for (int n = 0; n < CIRCLECOORDS; ++n) {
- knots[n] = (float)n * (1 / (float)(CIRCLECOORDS-1));
- }
-
- // simuliert ein Jahr (Bewegung der Erde um die Sonne)
-
- TransformGroup objYear = new TransformGroup();
- objYear.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
- PositionPathInterpolator rotIntYear =
- new PositionPathInterpolator(
- new Alpha(-1, YEAR),
- objYear,
- new Transform3D(),
- knots,
- createCircleCoords(EARTHORBIT, CIRCLECOORDS)
- );
- 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.
- // liefert die Koordinaten eines Kreises mit dem Radius r und N Paaren
-
- private Point3f[] createCircleCoords(float r, int N) {
- Point3f[] coords = new Point3f[N];
- int n;
- double a;
- float x, z;
-
- for (a = 0, n = 0; n < N; a = 2.0 * Math.PI / (N-1) * ++n) {
- x = (float) (r * Math.sin(a));
- z = (float) (r * Math.cos(a));
- coords[n] = new Point3f(x, 0f, z);
- }
- return coords;
- } // 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.
- // Mouse Rotation Behavior zum Rotieren des Universums mit der Maus
-
- TransformGroup objRotate = new TransformGroup();
- objRotate.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
- objRotate.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
- MouseRotate mouseRotate = new MouseRotate();
- mouseRotate.setTransformGroup(objRotate);
- mouseRotate.setSchedulingBounds(bounds);
- // erzeugt das Sonnenlicht
-
- PointLight sunlight = new PointLight();
- sunlight.setInfluencingBounds(bounds);
... [ Seminar XML und JAVA ] ... [ Thema Java 3D API ] ... [ Leaf Node Objects ] ... [ NodeComponent Objects ] ...