NodeComponent Objects


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

Übersicht: NodeComponent Objects


Geometry

Das Geometry-Objekt legt die Geometrie eines 3D-Shapes fest. Außerordentlich vielfältig sind die Möglichkeiten Geometrie zu definieren; das Beispielprogramm enthält die wahrscheinlich einfachste Variante nämlich das LineArray als Subklasse des GeometryArrays. Im Konstruktoraufruf wird die Anzahl der Scheitelpunkte sowie ein Flag angegeben, welches in diesem Fall festlegt, dass das LineArray ein Feld von Koordianten enthält. Durch die Methode setCoordinate werden dann die Koordinaten der Linie definiert.
  1. // erzeugt die Geometrie einer Linie der Laenge l
  2. private Geometry createLineGeometry(float l) {
  3. LineArray la = new LineArray(2, LineArray.COORDINATES);
  4. la.setCoordinate(0, new Point3f(0f, -l/2f, 0f));
  5. la.setCoordinate(1, new Point3f(0f, l/2f, 0f));
  6. return la;
  7. } // Ende Methode createLineGeometry
Im nächsten Code-Fragment wird die Methode createCircleGeometry vorgestellt. Um die Geometrie eines Kreises zu erzeugen, verwendet man anstatt eines LineArrays besser ein LineStripArray. Der Vorteil liegt darin, dass beim LineStripArray alle Punkte miteinander verbunden werden. Unter Verwendung eines LineArrays hingegen werden jeweils nur zwei Punkte miteinander verbunden, also P1 mit P2, P3 mit P4, P5 mit P6, usw. aber nicht P1 mit P2, P2 mit P3, P3 mit P4, usw. . Die Koordinaten des Kreises berechnet die Hilfsmethode createCircleCoords.
  1. // erzeugt die Geometrie eines Kreises mit Radius r und N Punkten
  2. private Geometry createCircleGeometry(float r, int N) {
  3. int[] stripCounts = {N};
  4. LineStripArray lsa =
  5. new LineStripArray(N, LineStripArray.COORDINATES, stripCounts);
  6. lsa.setCoordinates(0, createCircleCoords(r, N));
  7. return lsa;
  8. } // Ende Methode createCircleGeometry
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
Einfacher als die direkte Programmierung von Geometrie ist die automatische Erzeugung von Geometrie durch ein CAD (Computer Aided Design) Programm. Der Entwurf beschränkt sich dann auf das Zeichnen der Figuren, das CAD-Programm setzt die Figuren in Polygone um. Java 3D unterstützt diverse Formate und stellt entsprechende Loader dafür bereit. Auf den Webseiten der Firma Sun Microsystems befinden sich Links zu den Anbietern bestimmter Loader.

Java 3D Loader Formatunterstüzung

Dateiformat Beschreibung
3DS 3D Studio
COB Caligari trueSpace
DEM Digital Elevation Map
DXF AutoCAD Drawing Interchange File
IOB Imagine
LWS Lightwave Scene Format
NFF WorldToolKit NFF Format
OBJ Wavefront
PDB Protein Data Bank
PLAY PLAY
SLD Solid Works (prt and asm files)
VRT Superscape VRT
VTK Visual Toolkit
WRL Virtual Reality Modeling Language


Appearance

Appearance ist das Gegenstück zu Geometry bei 3D-Shapes. Die Erscheinung eines 3D-Shapes wird durch eine Reihe von Objekten festgelegt. Im Beispielprogramm Universe sind nur zwei von Bedeutung: Material und Texture.


Material

Das Material-Objekt definiert die Wirkung von Licht auf ein 3D-Objekt. Sonne und Mond besitzen im u. a. Code-Fragment jeweils ein eigenes Appearance Objekt, das wiederum über ein spezifisches Material Objekt verfügt. Sonne und Mond unterscheiden sich durch einen einen einzigen Wert im Konstruktoraufruf des Material-Objekts. Der zweite Parameter (emissiveColor) hat bei der Sonne den Wert WHITE beim Mond dagegen den Wert BLACK. Dieser Wert emissiveColor steht für die Fähigkeit eines Objekts selbst zu leuchten. Da uns aus der Astronomie bekannt ist, dass der Mond keine eigene Leuchtkraft besitzt sondern lediglich von der Sonne angestrahlt wird, hat emissiveColor beim Mond den Wert BLACK.
  1. // erzeugt die Sonne
  2. Appearance sunAppear = new Appearance();
  3. sunAppear.setMaterial(new Material(BLACK, WHITE, WHITE, WHITE, 1f));
  4. Sphere sun = new Sphere(SUNRADIUS, sunAppear);
  5. // erzeugt den Mond
  6. Appearance moonAppear = new Appearance();
  7. moonAppear.setMaterial(new Material(BLACK, BLACK, WHITE, WHITE, 1f));
  8. Sphere moon = new Sphere(MOONRADIUS, moonAppear);


Texture

Das Themengebiet Texture ist außerordentlich umfangreich, das Beispielprogramm aber bedient sich einer einfachen Methode und veranschaulicht somit was man unter Texture versteht, und wie man Texture-Techniken einsetzt. Die Erde verfügt im virtuellen Universum über eine besonders detaillierte Oberfäche. Diese Oberfläche ist in Wirklichkeit ein 2-dimensionales Bild im JPG-Format, das mittels Texture-Mapping auf die Erde als 3-dimensionale Kugel übertragen wird. Dazu muss das Bild zunächst von einem TextureLoader geladen werden, die Konstante TEXTURE_FNAME verweist dabei auf das zu mappende Bild auf dem Datenträger.
  1. // erzeugt die Erde
  2. Appearance earthAppear = new Appearance();
  3. earthAppear.setTexture(
  4. new TextureLoader(TEXTURE_FNAME, this).getTexture());
  5. Sphere earth = new Sphere(EARTHRADIUS,
  6. Primitive.GENERATE_TEXTURE_COORDS,
  7. earthAppear);


Alpha

Alpha ist ein Wert, der zwischen null und eins liegt. Es besteht ein funktionaler Zusammenhang zwischen Alpha und der Zeit t. Zu jedem Zeitpunkt gibt es einen entsprechenden Alphawert, der durch die angegebene Funktion eine Wellenform annimmt. Die Wellenform läßt sich in Phasen einteilen. Wichtigstes Einsatzgebiet sind Interpolatoren, die Angaben zu ihrem Zyklus benötigen. Interpolatoren werden unter dem Gliederungspunkt Leaf Node Objects - Behavior behandelt. Im Beispielprogramm Universe erfolgt der Konstruktoraufruf über lediglich zwei Parameter: loopCount und increasingAlphaDuration. LoopCount gibt an, wieviele Zyklen durchlaufen werden sollen. Der Wert -1 steht für unendlich viele Zyklen. IncreasingAlphaDuration wiederum gibt an, in welcher Zeit ein Zyklus durchlaufen werden soll. Alpha läuft dabei von null bis eins. Da in unserem Beispiel der RotationInterpolator die Bewegung des Mondes um die Erde simuliert, beträgt dieser Wert MONTH Millisekunden, nämlich die Zeit in der der Mond alle Koordinaten seines Weges um die Erde beschritten hat (ein Monat).
  1. RotationInterpolator rotIntMonth =
  2. new RotationInterpolator(new Alpha(-1, MONTH), objMonth);


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