Einführung


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

Übersicht: Einführung


Was ist Java 3D API ?

Mit der Programmiersprache Java lassen sich einfach und bequem 3-dimensionale Applikationen und Applets entwickeln. Eine API (Application Programmer's Interface) ist eine Schnittstelle für Anwendungsentwickler, die sich dank der zahlreichen vordefinierten Klassen nicht mit Implementierungen auseinanderzusetzen brauchen. Trotzdem sollte auch der Anwendungsentwickler ein Verständnis von 3D-Grafik und den damit verbundenen mathematischen Grundlagen haben. Im Vordergrund steht aber die Anwendung, wobei es sich dabei z. B. um ein Computerspiel oder eine Animation handeln kann. Im Gegensatz zu Java 2D ist Java 3D kein Bestandteil der Core-API. Entwickler sollten zunächst die Webseiten von Sun Microsystems besuchen, die im Literaturverzeichnis angegeben sind. Von dort aus muss sich der Entwickler diverse Dateien herunterladen. Benutzer, die Java 3D Applets in ihrem Internet-Browser ausführen möchten benötigen dazu ein Plug-in, das ebenfalls von der Firma Sun Microsystems erhältlich ist. Da Java eine objektorientierte Programmiersprache ist, besteht auch der Java 3D Zusatz aus diversen Objekten oder Klassen, die in Paketen zusammengefasst sind. Den Kern stellt dabei das javax.media.j3d Paket dar. Die anderen Pakete leisten dem Entwickler zusätzliche Dienste beim Aufbau seiner virtuellen Welt.

Packages


Der Szenengraph

Abb.1: Beispiel eines einfachen Szenengraphs


Legende

Symbol Bedeutung
schraffierte Fläche VirtualUniverse Objekt
Quadrat Locale Objekt
Kreis Group Objekt
Dreieck Leaf Objekt
Ellipse NodeComponet Objekt
Rechteck andere Objekte
Pfeil (dünn) Eltern-Kind-Verbindung
Pfeil (dick) Verweis

Ein Szenengraph stellt den Aufbau einer 3D-Welt dar. Abbildung 1 ist ein Beispiel für so einen Aufbau. Ausgehend vom VirtualUniverse Objekt verzweigt sich der Graph in unterschiedliche Richtungen. Das Locale Objekt verwaltet dabei die einzelnen Äste des Graphen, die als Wurzelelement eine BranchGroup besitzen. Eine Locale kann grundsätzlich n Äste verwalten, üblich ist aber die Aufteilung in zwei Äste, wobei der linke Ast den Inhalt (Content) und der rechte Ast die Ansicht (View) der 3D-Welt repräsentieren. Der Schwerpunkt dieses Dokuments liegt dabei auf der Gestaltung von Inhalt (Content), wie z. B. das Erzeugen von Geometrien und Animationen. Der Ansichts-Ast (View Branch) legt fest wie das virtuelle Universum dargestellt werden soll (Rendering). Java 3D verfolgt dabei die Philosophie des 'write-once-run-anywhere' Prinzips. Ohne den Inhalt zu ändern, passt sich der View den physikalischen Gegebenheiten der realen Welt an. So wäre es z. B. möglich, durch Aufbau eines entsprechenden View-Astes ein HMD (Head Mounted Display) zu unterstützen. Der View-Ast in Abbildung 1 ist dagegen einfach gehalten. Die Geometrie in dieser 3D-Welt wird durch Zentralprojektion auf einer 2-dimensionalen Zeichenfläche (Canvas) dargestellt. Die Projektion von 3D-Körpern auf eine 2D-Fläche ist notwendig, um 3D-Objekte auf dem Bildschirm zu realisieren. Der Betrachter des virtuellen Universums schaut die z-Achse hinab direkt auf den Ursprung des 3D-Koordinatensystems.


Java 3D Klassenhierarchie


Rezepte für das Schreiben von Java 3D Programmen

Eigentliches Rezept

  1. Erzeuge ein Canvas3D Objekt
  2. Erzeuge ein VirtualUniverse Objekt
  3. Erzeuge ein Locale Objekt und verbinde es mit dem VirtualUniverse Objekt
  4. Konstruiere den View Ast
    1. Erzeuge ein View Objekt
    2. Erzeuge ein ViewPlatform Objekt
    3. Erzeuge ein Physical Body Objekt
    4. Erzeuge ein PhysicalEnvironment Objekt
    5. Verbinde die Objekte ViewPlatform, PhysicalBody, PhysicalEnvironment und Canvas3D mit dem View Objekt
  5. Konstruiere den/die Content Ast/Äste
  6. Kompiliere die Äste
  7. Hänge die Äste an das Locale Objekt

Vereinfachtes Rezept

  1. Erzeuge ein Canvas3D Objekt
  2. Erzeuge ein SimpleUniverse Objekt und übergebe das Canvas3D Objekt
  3. justiere die ViewPlatform des SimpleUniverse Objekts
  4. Konstruiere den Content Ast
  5. Kompiliere den Content Ast
  6. Füge den Content Ast in die Locale des SimpleUniverse Objekts ein


Beispielprogramm HelloWorld

  1. import javax.media.j3d.*;
  2. import javax.vecmath.*;
  3. import com.sun.j3d.utils.universe.SimpleUniverse;
  4. import com.sun.j3d.utils.applet.MainFrame;
  5. import com.sun.j3d.utils.geometry.Text2D;
  6. import java.applet.Applet;
  7. import java.awt.BorderLayout;
  8. import java.awt.GraphicsConfiguration;
  9. // HelloWorld zeigt den Schriftzug 'Hello World !' im 3D Universum
  10. public class HelloWorld extends Applet {
  11. public HelloWorld() {
  12. setLayout(new BorderLayout());
  13. GraphicsConfiguration graphConfig =
  14. SimpleUniverse.getPreferredConfiguration();
  15. Canvas3D canvas3D = new Canvas3D(graphConfig);
  16. add("Center", canvas3D);
  17. // SimpleUniverse vereinfacht das Erstellen des Universums
  18. SimpleUniverse simpleUni = new SimpleUniverse(canvas3D);
  19. BranchGroup sceneGraph = createSceneGraph();
  20. // ViewPlatform wird so eingestellt,
  21. // dass man Objekt betrachten kann
  22. simpleUni.getViewingPlatform().setNominalViewingTransform();
  23. simpleUni.addBranchGraph(sceneGraph);
  24. } // Ende Konstruktor HelloWorld
  25. // erzeugt den Content-Branch des Szenengraphen
  26. public BranchGroup createSceneGraph() {
  27. BranchGroup objRoot = new BranchGroup();
  28. // haengt ein Demo-3D Objekt naemlich den Schriftzug 'Hello World !'
  29. // (Farbe weiss, Schrift Helvetica, Groesse 18, Normalschrift)
  30. // an den Ast
  31. objRoot.addChild(
  32. new Text2D("Hello World !",
  33. new Color3f(1f, 1f, 1f),
  34. "Helvetica",
  35. 18,
  36. 0));
  37. // nimmt Optimierungen am Ast des Szenengraphen vor
  38. objRoot.compile();
  39. return objRoot;
  40. } // Ende Methode createSceneGraph
  41. // um Programm sowohl als Applet wie auch als Applikation
  42. // laufen zu lassen
  43. public static void main(String[] args) {
  44. // erzeugt Applikationsfenster der Groesse 800x600
  45. MainFrame mainFrame = new MainFrame(new HelloWorld(), 800, 600);
  46. } // Ende Methode main
  47. } // Ende Klasse HelloWorld


... [ Seminar XML und JAVA] ... [ Thema Java 3D API ] ... [ Einführung ] ... [ Beispielprogramm Universe ] ...