Java 3D - Hochschule Fulda

Werbung
Prof. Dr. W. Heinzel, Hochschule Fulda, FB AI, Marquardstr. 35, 36039 Fulda
3.
Java 3D
3.1
Grundlagen
-
-
-
-
-
-
Hierarchie von Java-Klassen, die eine Schnittstelle zur Darstellung und
Interaktion von dreidimensionalen grafischen Szenen bilden.
Die geometrischen Objekte werdenin einem Virtuellen Universum
(Virtual Universe) erzeugt, welches dann gerendert wird.
Ein Java3D-Programm erzeugt Instanzen von Java3D-Objekten und
platziert sie in eine Szenengraph- (Scene Graph-) Datenstruktur.
Szene-Graph: Ansammlung / Anordnung von 3D-Objekten in einer
Baumstruktur.
Java 3D Programme: Realisierung als alleinstehende Applikationen und
als Java Applets.
Relevante Links:
http://java3d.j3d.org/
https://java3d.dev.java.net/
http://www.hs-fulda.de/caelabor
java
-
Aktuelle Alternativen bezüglich 2D / 3D Grafik-API´s:
+ DirectX
-> Ursprünglich vordringlich für Spiele entwickelt
+ OpenGL
-> universelle Grafik-Library
-> Professioneller Einsatzbereich
-> Rendering-Pipeline als HW-Lösung auf Grafikkarten
+ Java 3D (SUN Microsystems / JAVA3D.ORG)
⇒ Bis Release 1.3.1: SUN Microsystems
APIs auf DirectX oder OpenGL aufbauend
Ab Release 1.3.2: Opensource-Projekt
Prof. Dr. W. Heinzel, Hochschule Fulda, FB AI, Marquardstr. 35, 36039 Fulda
⇒ Aktuelle Binaries: Version 1.5.2; download:
https://java3d.dev.java.net/binary-builds.html
+ Visual Toolkit (VTK -> KITWARE)
-> typ. auf Tcl/Tk, Java, ..., aufbauend
-> Professioneller Einsatzbereich, Open Source
-
Java 3D API Klassenhierarchie -> zwei Typen von Klassen:
+ Kernklassen (Basisklassen, "core classes")
⇒ javax.media.j3d.* Package
-> j3dcore.jar und j3daudio.jar
⇒ mehr als 100 Klassen
+ Zubehörklassen ("utility classes")
-> com.sun.j3d.utils.* Package
-> dient der Erweiterung der elementaren Kernklassen;
leistungsfähige Erweiterungen, z.B. content loader,
simpleUniverse, geometry classes wie Boxen,..)
-
Ergänzende Java (Zubehör-) Klassen aus der Java-Entwicklungsumgebung:
+ Abstract Window Toolkit (AWT) Klassen (java.awt.*) zur Erzeugung eines 3D-Ausgabefensters
(Alternative: Swing-Klassen -> javax.swing)
+ Vektormathematik-Klassen (javax.vecmath.*) für
mathematische Objekte, z.B. Punkte, Vektoren, Matrizen, etc.
-
-
Bezugsquellen zu Java 2D/3D, Dokumentationen, Lizenzbedingungen, Installationsanweisungen, ... -> vgl. vorstehend, relevante Links
Praktische Entwicklungsumgebung für Java:
-> Eclipse, Gel, Joe, ...
-
Java-Struktur (Quelle: SUN):
Prof. Dr. W. Heinzel, Hochschule Fulda, FB AI, Marquardstr. 35, 36039 Fulda
Java 3D API auf der Ebene der User Interface Toolkits
3.2
Der Szenengraph
-
-
-
Dient der „Modellierung“ (Aufbau) des virtuellen Universums (virtual
universe); wird aus Instanzen der Java3D-Klassen erzeugt
kann als Designtool und / oder Dokumentationsform für Java3DProgramme angesehen werden
Entspricht der typischen Baumstruktur mit Knoten und Kanten;
+ Knoten (nodes): Instanzen der Java 3D – Klassen (Datenelemente)
+ Kanten (arcs): Beziehung zwischen Knoten. Folgende Alternativen:
-> Vater-Kind Beziehung (Knoten -> Subknoten)
-> Referenzbeziehung (Beziehung zwischen einem
„gewöhnlichen“ Knoten mit einer Knotenkomponente
(note component)
Achtung: Kanten verschiedener Knoten dürfen nicht auf gleichen Subknoten
verweisen -> nur einen einzigen Weg vom Wurzelknoten zum Blattknoten (leaf)
-
Knotenkomponente (note component): Gibt u.a. Darstellungsattribute,
etc., an.
Prof. Dr. W. Heinzel, Hochschule Fulda, FB AI, Marquardstr. 35, 36039 Fulda
Fallbeispiel einen Szenegraphen:
-
-
Wurzel des Szenengraphen: Virtuelle Universum (virtual universe).
-
"Locale"-Objekt(e): Subknote(n) des virtual universe
Bilden Ursprung in der 3D-Szene für den jeweils untergeordneten
Teilbaum. Ein Szenengraph kann prinzipiell mehrere "Locales"
enthalten (mehrere Koordinatensysteme). Dieses Beispiel ist jedoch
nur auf ein solches Objekt beschränkt und diese Restriktion findet
sich auch bei den meisten anderen Java 3D Applikationen.
-
Teilbaumgruppenknoten ("branch group nodes", BG): Sind den
"Locale"-Objekten untergeordnet.
+ Teilbaumgraph ("branch graph") mit Teilbaumgruppenknoten
(BG) als Wurzel. Achtung: Teilbaumgruppenknoten (BG) sind
die einzigen Elemente, die unter einem "Locale" eingefügt werden dürfen. Ein "Locale" kann prinzipiell mehrere Teilbaumgruppenknoten enthalten.
+ Subknoten des Teilbaumgruppenknoten: hier ein Transformationsgruppenknoten (TG).
+ Diesem untergeordnet ist ein Blattknoten (leaf) und eine weitere
Transformationsgruppe mit einem anderen Blattknoten.
Prof. Dr. W. Heinzel, Hochschule Fulda, FB AI, Marquardstr. 35, 36039 Fulda
Beispiel: Der erste Blattknoten entspricht in diesem Beispiel einem Planet (z.B.
Erde), wobei die erste Transformationsgruppe z.B. die Position des Planeten
im Raum angibt. Die gleiche Analogie gilt auch für den zweiten Blattknoten
(z.B. Mond), wobei hier die zweite Transformation relativ zur übergeordneten
Transformation berechnet wird. Also entspricht die Hierarchie im
Szenengraphen genau der Hierarchie aus der Realität. Die Knotenkomponente:
Definiert im Beispiel ein visuelles Attribut für das Planetobjekt, z.B. die Farbe
des Planeten.
Tabellarische Zusammenfassung der Ergebnisse des Fallbeispiels:
Szenengraphknoten
Virtuelles Universum
"Locale"
Möglicher
Mögliche
Vaterknoten
Kinderknoten
-
Virtuelles
Universum
Teilbaumgruppenknoten
"Locale"
Blattknoten
anderer
Gruppenknoten
Knotenkomponente
-
"Locales"
Beschreibung
Wurzel für die
gesamte 3DSzene
Ursprung für
den
Teilbaumgruppenknoten
untergeordneten
Teilbaum
andere
(Gruppen-)Knoten
Wurzel eines
Teilbaumgraphen
-
(Visuelles)
Objekt der 3DSzene
-
(Visuelles)
Attribut eines
3D-Objektes
Prof. Dr. W. Heinzel, Hochschule Fulda, FB AI, Marquardstr. 35, 36039 Fulda
3.3
Teilbaumgraphen
Man unterscheidet zwei Arten von Teilbaumgraphen:
-
Inhalts-Teilbaumgraph („content branch graph“)
Ansichts-Teilbaumgraph („view branch graph“)
content branch graph -> virtuelles Universum bzw. 3D-Szene. Dazu zählen
u.a.: Geometrie, visuelle Attribute, Animationen, Transformationen, Sounds,
Lichter usw.
view branch graph: -> Ansichtsparameter der 3D-Szene, z.B. Position und
Orientierung der sog. „Szenenkamera“ bzw. des Betrachters der Szene. Man
spricht in diesem Zusammenhang oft vom „point of view“ oder „eye point“.
Zusammenfassung beider Strukturen in einem Szenengraphen: Basisinformation für das Rendering-System zur Darstellung der 3D-Szene (vgl. Fallbeispiel
in nachstehender Abbildung).
Spezifiziert „Kopf“ des Be-
beschreibt physikalische Umgebung,
trachters der 3D-Szene
u.a.Audioausgabe, Steuerung phys.
Ein- und Ausgabegeräte
Prof. Dr. W. Heinzel, Hochschule Fulda, FB AI, Marquardstr. 35, 36039 Fulda
3.4
Java 3D Klassenhierarchie
Klassenhierarchie des Java 3D API Packages javax.media.j3d.*:
SceneGraphObject die Basisklasse für die meisten oder sogar fast alle Java 3D
Kern- und Zubehörklassen.
Das SceneGraphObject und seine Subklassen
Zwei Subklassen:
- Die Node-Klasse, bestehend aus Group- und Leaf-Klassen
+ entspricht den zuvor angesprochenen Gruppen- und Blattknoten.
+ werden häufig zur Bildung des Szenengraphen benutzt.
Prof. Dr. W. Heinzel, Hochschule Fulda, FB AI, Marquardstr. 35, 36039 Fulda
- Die NodeComponent-Klasse
-> beschreibt eine Knotenkomponente des Szenengraphen.
Übersicht über die Node-Klasse (und ihre Subklassen) sowie über die
NodeComponent-Klasse:
- Node
+ Basisklasse für Group und Leaf
+ Definiert einige wichtige Basismethoden, die in den abgeleiteten
Klassen implementiert werden. Der Szenengraph wird aus diesen
Node-Objekten konstruiert.
- Group
+ Beschreibt die Gruppenknoten des Szenengraphen.
+ Dient als Basisklasse für weitere Subklassen, die z.B. die Position
und Orientierung von visuellen Objekten in einer 3D-Szene
angeben.
Zwei dieser Subklassen sind die bereits beschriebenen Teilbaumund Transformationsgruppenknoten (in der grafischen Repräsentation des Szenengraphen werden diese Objekte durch Kreise mit
einem "BG" bzw. "TG" angegeben).
Leaf
+ Blattknoten des Szenengraphen dar.
+ Kann zwar keine Subknoten enthalten, sich aber auf Knotenkomponenten beziehen.
Ist Basisklasse für weitere Klassen, die 3D-Formen, Sounds und
Verhalten ("behaviors") von visuellen Objekten in der 3D-Szene
angeben.
Beispiele: Shape3D, Light und Behavior (In der grafischen Repräsentation des Szenengraphen werden Shape3D-Objekte (d.h. also
3D-Formen) durch Dreiecke mit einem "S" dargestellt).
NodeComponent
+ Beschreibt eine Knotenkomponente des Szenengraphen.
+ Dient als Basisklasse für diverse andere Subklassen
z.B. zur Festlegung von Geometrie, Darstellungsattributen, Texturund Materialeigenschaften von Shape3D-Objekten (siehe LeafKlasse).
Prof. Dr. W. Heinzel, Hochschule Fulda, FB AI, Marquardstr. 35, 36039 Fulda
3.5
Schema zur Erstellung von Java 3D-Programmen
3.5.1 Allgemeine Vorgehensweise
1. Erzeugung eines Canvas 3D-Objekts
-> Ein Canvas 3D-Objekt definiert einen Fensterbereich, in dem
die Ausgabe und ggf. Interaktion stattfinden soll und kann
(vgl. AWT-Klasse)
2. Erzeugung eines VirtualUniverse-Objekts
-> Wurzel des gesamten Szenengraphen
3. Erzeugung eines Locale-Objekts und dessen Hinzufügen
(assoziieren) zum VirtualUniverse
-> Dient als Ursprung für die untergeordneten Teilbäume
4. Erzeugen eines ViewBranchGraphen (Ansichts-Teilbaumgraphen)
a) Erzeugen eines View-Objekts
-> Enthält alle wichtigen Informationen, die zur Darstellung einer 3D-Szene von einem Blickpunkt
(viewpoint) betrachtet notwendig sind
b) Erzeugen eines ViewPlatform-Objekts
-> Beschreibt Position, Orientierung und Skalierung des
Betrachters (viewer) der 3D-Szene; Stichwort: Szenenkamera
c) Erzeugen eines PhysicalBody-Objekts
-> Spezifiziert „Kopf“ des Betrachters der 3D-Szene, z.B.
Ursprung des Koordinatensystems („zwischen linkem
und rechtem Auge“), Richtungen der x-, y- und zAchsen beim Betrachter (vgl. gluLookAt bei OpenGL)
d) Erzeugen eines PhysivalEnvironment-Objekts
-> Beschreibung der physikalischen Umgebung; dient
u.a. zur Steuerung physikalischer Eingabegeräte
(Sensoren) und der Audio-Ausgabegeräte
e) Hinzufügen der Viewplattform-, PhysicalBody-,
PhysivalEnvironment- und Canvas 3D-Objekte zum
View-Objekt
5. Erzeugen eines oder mehrerer ContentBranchGraphen
6. Kompilierung dieser Branchgraphen
-> Dabei werden die Szenengraphelemente in eine für den Java
3D Renderer effizientere Form übersetzt -> Methode
compile()
Ziel: Beschleunigung der 3D-Ausgabe. Dazu zählt z.B. die
Zusammenfassung von mehreren benachbarten
Transformationsgruppen
Prof. Dr. W. Heinzel, Hochschule Fulda, FB AI, Marquardstr. 35, 36039 Fulda
7. Einfügen der Teilgraphen in das Locale-Objekt
-> Mit diesem letzten Schritt sind der Szenengraph und alle weiteren erforderlichen Java 3D Objekte fertig konstruiert, so
dass die 3D-Ausgabe jetzt erfolgen kann
3.5.2 Arbeiten mit der SimpleUniverse - Klasse
Die meisten Java 3D Programme basieren auf dem gleichen Ansichts-Teilbaumgraphen (gleiche Kameraposition, etc.).
-> Vereinfachung der beschriebenen allgemeinen Programmstruktur
Einsatz derJava 3D Zubehör-Klasse SimpleUniverse
-> Abdeckung der Schritte 2. - 4. aus der oben angegebenen Übersicht
Schema zur Erstellung eines Java 3D-Programms bei Verwendung des
SimpleUniverse
1. Erzeugung eines Canvas 3D-Objekts
2. Erzeugung eines SimpleUniverse-Objekts, Anpassen des
SimpleUniverse-Objekts
3. Erzeugen des ContentBranchGraphen
4. Kompilierung des Branchgraphen
5. Einfügen des ContentBranchGraphen in das Locale-Objekt des
SimpleUniverse
-> Speziell für Java 3D Anfänger sinnvoll
-> Einschränkung: Es kann und wird nur mit einem einzigen View gearbeitet
Der SimpleUniverse-Konstruktor erzeugt einen Szenengraphen, einschließlich der VirtualUniverse- und Locale-Objekte, sowie den kompletten AnsichtsTeilbaumgraphen.
Prof. Dr. W. Heinzel, Hochschule Fulda, FB AI, Marquardstr. 35, 36039 Fulda
Szenengraphen bei Nutzung von SimpleUniverse:
3.6
Die Projektionsfläche
Der Ansichts-Teilbaumgraph, der durch die SimpleUniverse-Klasse erzeugt
wird, enthält die sog. Projektionsfläche ("image plate").
-> Entspricht Ebene, auf der das Bild der 3D-Szene projiziert wird
Verdeutlichung der Beziehung zwischen der Projektionsfläche, Szenenkamera
und den visuellen 3D-Szenenobjekten:
Prof. Dr. W. Heinzel, Hochschule Fulda, FB AI, Marquardstr. 35, 36039 Fulda
Die Szenenkamera befindet sich vor der Projektionsfläche, wobei die visuellen
Objekte (die hinter der Fläche sind) darauf abgebildet werden. Standardmäßig -> Ursprung des SimpleUniverse befindet sich im Punkt (0, 0, 0) -> auch das
Zentrum der Projektionsfläche.
Die Orientierungsrichtung ist dabei durch die Z-Achse beschrieben.
Von diesem Zentrum betrachtet ist die X-Achse eine horizontale Gerade mit
positiven Werten nach rechts und die Y-Achse eine vertikale Gerade mit
positiven Werten nach oben.
Bei Java 3D hat man sich darauf geeinigt, dass die Szenenkamera auf die
Position (0, 0, 2.41) gesetzt wird und die Orientierungsrichtung durch die
negative Z-Achse beschrieben wird. Man spricht hierbei von der sog. "nominal
viewing transformation".
Geeignete Methode der ViewingPlatform-Klasse:
setNominalViewingTransform()
-> setzt die nomonale Viewing-Distanz auf 2.41 m
Um auf das ViewingPlatform-Objekt in der SimpleUniverse-Klasse zugreifen zu
können, bedient man sich der folgenden Methode der SimpleUniverse-Klasse:
ViewingPlatform getViewingPlatform()
Mit Hilfe der ViewingPlatform kann man die Position der Kamera verändern,
indem man sich mit Hilfe der Methode
TransformGroup getViewPlatformTransform()
die entsprechende TransformGroup holt und ihr eine selbst erzeugte
Transfomations-Matrix zuweist.
Prof. Dr. W. Heinzel, Hochschule Fulda, FB AI, Marquardstr. 35, 36039 Fulda
Diese kann man sich mit der sehr praktischen Methode
lookAt(Point3d eye, Point3d center, Vector3d up)
der Klasse Transform3D erzeugen.
Damit könnte der entsprechende Code folgendermaßen aussehen:
// set the position of the eye point
Transform3D l3D = new Transform3D();
l3D.lookAt(new Point3d(0.8,1.4,4),
new Point3d(0,0,0),
new Vector3d(0,1,0));
l3D.invert();
simpleU.getViewingPlatform().
getViewPlatformTransform().
setTransform(l3D);
Prof. Dr. W. Heinzel, Hochschule Fulda, FB AI, Marquardstr. 35, 36039 Fulda
3.7
Ein einfaches Java 3D - Programm
/*
* Copyright Lutz / Emmel, Verlag Harry Deutsch, 2000
*
* Beispiel: ColorCubeA.java
*
* Realisierung eines farbigen Wuerfels
*
*/
// Zu importierende Klassen
import java.applet.Applet;
import java.awt.BorderLayout;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.universe.SimpleUniverse;
import com.sun.j3d.utils.geometry.ColorCube;
import javax.media.j3d.*;
public class ColorCubeA extends Applet
{
public ColorCubeA()
{
// Canvas 3D erzeugen
setLayout(new BorderLayout());
// Standardkonfiguration bestimmen
GraphicsConfiguration config =
SimpleUniverse.getPreferredConfiguration();
Canvas3D canvas3D = new Canvas3D(config);
add("Center", canvas3D);
/* der BranchGraph wird durch den Aufruf der Methode createSceneGraph
erzeugt */
BranchGroup scene = createSceneGraph();
/* die Szene wird optimiert:
Compilation der BranchGroup und der assoziierten Objekte durch
Erzeugung und Speicherung eines compilierten Szenengraphe */
scene.compile();
// ein neues SimpleUniverse mit dem Canvas3D-Objekt wird erzeugt
SimpleUniverse universe = new SimpleUniverse(canvas);
// ein Default-Viewbranch wird erzeugt
Prof. Dr. W. Heinzel, Hochschule Fulda, FB AI, Marquardstr. 35, 36039 Fulda
universe.getViewingPlatform().setNominalViewingTransform();
// die Szene wird in das Universum eingesetzt
universe.addBranchGraph(scene);
}
public BranchGroup createSceneGraph()
{
// Erzeugen eines BranchGroup-Objektes ....
BranchGroup objRoot = new BranchGroup();
// …. welches den ColorCube aufnimmt
objRoot.addChild(new ColorCube(0.4));
return objRoot;
}
public static void main(String[] argv)
{
/* falls das Programm eine Anwendung ist, wird der folgende Programmcode benötigt */
new MainFrame(new ColorCubeA(), 256, 256);
}
}
Java-Klassen im vorstehenden Beispiel (Quelle: SUN Java 3D API):
a)
Erzeugung eines Canvas3D-Objekts
The Canvas3D class is derived from the Canvas class of the Abstract Windowing Toolkit (AWT). At least one Canvas3D object must be referenced in the
viewing branch graph of the scene graph. For more information on the Canvas
class, consult a reference on the AWT.
Canvas3D Constructor
Canvas3D(GraphicsConfiguration graphicsconfiguration)
Constructs and initializes a new Canvas3D object that Java 3D can render given
a valid GraphicsConfiguration object. It is an extension of the AWT Canvas
class. For more information on the GraphicsConfiguration object see the Java
2D specification, which is part of the AWT in JDK 1.4.
Prof. Dr. W. Heinzel, Hochschule Fulda, FB AI, Marquardstr. 35, 36039 Fulda
b)
Erzeugung des SimpleUniverse
SimpleUniverse Constructors
Package: com.sun.j3d.utils.universe
This class sets up a minimal user environment to quickly and easily get a Java
3D program up and running.
This utility class creates all the necessary objects for a view branch graph.
Specifically, this class creates Locale, VirtualUniverse, ViewingPlatform, and
Viewer objects (all with their default values). The objects have the appropriate
relationships to form the view branch graph.
SimpleUniverse provides all functionality necessary for many basic Java 3D
applications. Viewer and ViewingPlatform are convenience utility classes.
These classes use the View and ViewPlatform core classes.
SimpleUniverse()
Constructs a simple virtual universe.
SimpleUniverse(Canvas3D canvas3D)
Construct as simple universe with a reference to the named Canvas3D object.
c) Realisierung des farbigen Würfels
ColorCube Constructors
Package: com.sun.j3d.utils.geometry
A ColorCube is a simple color-per-vertex cube visual object with a different
color for each face.
ColorCube extends the Shape3D class; therefore, it is a Leaf node. ColorCube is
easy to use when putting together a virtual universe.
ColorCube()
Constructs a color cube of default size. By default, a corner is located 1 meter
along each of the axis from the origin, resulting in a cube that is centered at the
origin and is 2 meters high, wide and deep.
ColorCube(double scale)
Constructs a color cube scaled by the value specified. The default size is 2
meters on an edge. The resulting ColorCube has corners at (scale, scale, scale)
and (-scale, -scale, -scale).
d)
Compilation der BranchGroup und der assoziierten Objekte durch
Erzeugung und Speicherung eines compilierten Szenengraphen
void compile()
Compiles the source BranchGroup associated with this object by creating and
caching a compiled scene graph.
Concepts of compiled and live are implemented in the SceneGraphObject class.
Prof. Dr. W. Heinzel, Hochschule Fulda, FB AI, Marquardstr. 35, 36039 Fulda
BranchGroup objects can be compiled. Compiling a BranchGroup converts the
BranchGroup object and all of its ancestors to a more efficient form for the renderer. Compiling BranchGroup objects is recommended as the last step before
making it live. It is best to only compile the BranchGroup objects inserted into
Locales.
e)
Ablauffähiges Java-Programm realisieren
Die Klasse HelloJava3Da wurde von der Oberklasse Applet abgeleitet.
Ablauffähige Anwendung
Ergänzung um Main-Programm
Klasse Mainframe zur Erzeugung eines AWT-Frames (window) ->
Ermöglichung des Ablauf eines Applets als Anwendung
MainFrame Constructor (partial list)
package: com.sun.j3d.utils.applet
MainFrame makes an applet into an application. A class derived from applet
may have a main() method which calls the MainFrame constructor. MainFrame
extends java.awt.Frame and implements java.lang.Runnable,
java.applet.AppletStub and java.applet.AppletContext.
MainFrame(java.applet.Applet applet, int width, int height)
Creates a MainFrame object that runs an applet as an application.
Parameters:
applet – the constructor of a class derived from applet.
width – the width of the window frame in pixels
height – the height of the window frame in pixels
Auswahl von Tutorials (an der FH Fulda realisiert):
- Blum/Wassermann: Aspekte in 2D und 3D.
Interaktive Lernsoftware, FH FD, FB AI, WS 2001/2002
- Klug, M.: Lernprogramm für Java 3D.
Ausarbeitung und Tutorial im Rahmen der LVA „Systemprogrammierung“,
FH FD, FB AI, WS 2001 / 2002
- Pressmann, Julia: Seminar Java 3D (Beleuchtung und Material)
Seminararbeit an der FH FD, FB AI, WS 2002/2003
- Pressmann, Julia: Java 3D Tutorium (Transformationen, Texturen)
Ausarbeitung und Tutorial im Rahmen der LVA “Systemprogrammierung”,
FH FD, FB AI, WS 2002/2003
Weitere Beispiele, etc. -> vgl. LVA
Herunterladen