Einführung in Java3D

Transcription

Einführung in Java3D
Einführung in Java3D
SS05
Ashraf Abu Baker
baker@gdv.cs.uni-frankfurt.de
Varrentrappstr. 40-42
60486 Frankfurt am Main
Raum 218
Java 3D ist eine high level Interaktive 3D Graphik-API
(Application Programming Interface) für die
Erstellung von 3D-Applikationen und -Applets in Java
-Visualisieren von wissenschaftlichen Daten
- Entwicklung medizinischer Anwendungen
- Technische Modelierung
- Animationen
Installation der Java3D-Umgebung
- JDK Java Development Kit
http://java.sun.com/j2se/
- Java3D SDK
OpenGL-SDK
java3d-1_3_1-windows-i586-opengl-sdk.exe
oder
DirectX-SDK java3d-1_3_1-windows-i586-directx-sdk.exe
http://java.sun.com/products/java-media/3D/download.html
- Bei der Installation: das JDK-Verzeichnis als
Zielverzeichnis angeben
- Für weitere Installationshinweise siehe
http://java.sun.com/products/java-media/3D/java3d-install.html
- Dokumentation
J3D-Doc:
http://java.sun.com/products/java-media/3D/download.html
J3D-Sun-Tutorial:
http://java.sun.com/products/java-media/3D/collateral/
Java 3D API Spezifikation
http://java.sun.com/products/java-media/
3D/forDevelopers/J3D_1_3_API/j3dguide/index.html
Weitere Tutorials:
http://www.sdsc.edu/~nadeau/Courses/Siggraph99/
http://www.willamette.edu/~gorr/classes/cs445/lectures/
Java_Overview
http://www.micg.et.fh-stralsund.de/Java3D/java3D.htm
Literatur:
Java3D Programming von Daniel Selman
- Ein Java3D-Programm besteht aus einer Menge von
Objekten der Java3D-Klassen
BranchGroup, TransformationsGroup, Shape3D, Geometry,
Apperance, Light, Behavior, Texture,Fog, Sound…….
- Die Gesamtheit aller Objekte eines Programms beschreibt
eine virtuelle Welt (Virtual Universe)
- Eine Virtuelle Welt wird als ein sog. Szenegraph dargestellt
- In der Regel besteht eine virtuelle Welt aus einem einzigen
Szenegraphen, kann jedoch aus mehreren bestehen
- Jeder Knote entspricht genau einer Instanz einer
Java3D-Klasse
- Ein Szenegraph weist eine Baumstruktur und besteht aus 2
Arten von Knoten (Szenegraphobjekte)
- 2 Arten von Knotentypen:
LeafNodes : Blätter des Baumes
Beispiele:
Shape3D, Light, Background, Sound,
Behavior, etc.
GroupeNodes: inneren Knoten des Baumes
Beispiele:
BranchGroup, TransfromGroup, Primitive, etc.
- Eine dritte Art von Knoten, die im Szenegraphen dargestellt
werden, jedoch nicht zum ihm gehören sind:
NodeComponents: legen die Struktur (Geometrie) und das
Erscheinungsbild (Appearance) der visuellen Objekte
des Szenegraphen fest
Beispiele :
Geometry, Appearance, Attributes, Texture, Material
- GroupeNodes und LeafNodes stehen in einer Vater-KindBeziehung (parent child relationship) zueinander
- NodeComponents werden von den anderen
Szenegraphknoten referenziert und stehen somit in einer
Referenzbeziehung zu denen
- Aufteilung eines Szenegraphen in:
Content Branch Graphs und View Branch Graph
- Szenegraph besteht aus einem oder mehrere Content Branch
Graphs, einem View Branch Graph und einem Locale-Objekt
- Ein Locale-Objekt bildet die Wurzel des Szenengraphen und
fungiert als Referenzpunkt für die Objekte in der virtuellen
Welt und wird mit einem virtuellen Koordinatensystem
assoziiert
-Der content branch graph spezifiziert die Geomentry, das
Erscheinungsbild, die Lichtquellen, das Verhalten, die
Position der visuellen Objekte in der virtuellen Welt
-Der view branch graph spezifiziert die Kameraparameter
(Position, Orientierung,…etc)
Rezept für die Erstellung von Java3DProgrammen
1. Erzeuge ein Canvas3D-Objekt
2. Erstelle ein VirtualUniverse-Objekt
3. Erzeuge ein Locale-Objekt
4. Erstelle einen View Branch Graph, der das
Canvas3d referenziert
5. Erstelle einen oder mehrere Content Graphs
6. Kompiliere den Content Branch Graph
7. Füge den Content Graphs und den View Graph in die Locale ein
- Die Schritte 2-4 können auf einmal erledigt werden, wenn man ein
Objekt der Klasse SimpleUniverse instanziiert
- Ein Objekt der Klasse SimpleUniverse enthält ein
VirtualUniverse, Locale-Objekt und View Brach Graph
Erstes Beispiel HelloJava3D1
import javax.swing.JApplet;
import javax.swing.JFrame;
//Java3D Core Package
import javax.media.j3d.BranchGroup;
import javax.media.j3d.Canvas3D;
import javax.vecmath.*;
//Java3D Utility Package
import com.sun.j3d.utils.universe.SimpleUniverse;
import com.sun.j3d.utils.geometry.ColorCube;
public class HelloJava3D1 extends JApplet {
public HelloJava3D1() {
//1. Create a canvas3d object
Canvas3D canvas3D=
new Canvas3D(SimpleUniverse.getPreferredConfiguration());
getContentPane().add(canvas3D);
//2. Create SimpleUniverse object which references the canvas3d object
SimpleUniverse simpleU = new SimpleUniverse(canvas3D);
//
This will move the ViewPlatform back a bit so that the
//
camera is positioned at point (0,0,2.41)
simpleU.getViewingPlatform().setNominalViewingTransform();
//
3. Create Content Graph
BranchGroup contentGraph = createContentGraph();
//
4.Compile the content graph
contentGraph.compile();
//
5. Insert the content graph into the Locale of the
SimpleUniverse and make it live
simpleU.addBranchGraph(contentGraph);
} // end of HelloJava3D1 (constructor)
public BranchGroup createContentGraph() {
// Create the root of the content branch graph
BranchGroup root = new BranchGroup();
// add visual objects
root.addChild(new Pyramid());
//root.addChild(new ColorCube(0.2));
return root;
} // end of CreateSceneGraph method of HelloJava3D1
// The following allows this to be run as an application
// as well as an applet
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.getContentPane().add(new HelloJava3D1());
frame.setSize(400,400);
frame.setTitle("HelloJava3D1");
frame.show();
} // end of main (method of HelloJava3D1)
} // end of class HelloJava3D1
//2. Create SimpleUniverse object which references the
canvas3d object
SimpleUniverse simpleU = new
SimpleUniverse(canvas3D);
//
This will move the ViewPlatform back a bit so that
the camera is positioned at point (0,0,2.41)
simpleU.getViewingPlatform().setNominalViewingTransform();
- Das SimpleUniverse-Objekt besteht aus :
dreidimensionaler virtuellen Universe (Locale)
Image Plage der Dimension 2x2 und Mittelpunkt (0,0,0) und einer
Kamera, die im Punkt (0,0,2.41) positioniert ist
2. Beispiel
- Das Einfügen eines ColorCube-Objekts
root.addChild(new Pyramid());
root.addChild(new ColorCubes(.2));
3D-Transformationen
- Transform3D ist eine Klasse, die eine
Transformationsmatrix speichert (Rotation, Translation,
Scaling, Scharing oder eine Kompination von
Transformationen)
- Wichtigsten Methoden:
void rotX(double angle)
void rotY(double angle)
void rotZ(double angle)
void set(Vector3f translate)
Beispiel 2
- Verschiebung der Pyramide um 0,5 Einheiten in
die positive x-Richtung
- Verschiebung des ColorCubes um 0,5 Einheiten
in die negative x-Richtung
- Nur eine Änderung des Content-Graphs erforderlich
public BranchGroup createContentGraph() {
// Create the root of the content branch graph
BranchGroup root = new BranchGroup();
// create a transformation matrix to translate the pyramid
Transform3D translatePyramid=new Transform3D();
// a translation of .5 unit towards the positive x-axis
translatePyramid.set(new Vector3f(0.5f,0,0));
// create a transformation matrix to translate the cube
Transform3D translateCube=new Transform3D();
// a translation of .5 unit towards the negative x-axis
translateCube.set(new Vector3f(-0.5f,0,0));
// create a transform group for the pyramid which refrences the
translation matrix translatePyramid
TransformGroup tgPyramid=new TransformGroup(translatePyramid);
// create a transform group for the cube which refrences the
translation matrix translateCube
TransformGroup tgCube=new TransformGroup(translateCube);
root.addChild(tgPyramid);
tgPyramid.addChild(new Pyramid());
root.addChild(tgCube);
tgCube.addChild(new ColorCube(0.2));
return root;
Der Szenegraph nach den Tranlationen
3. Beispiel
Verschiebung, Rotation des ColorCubes und Verschiebung der Pyramide
public BranchGroup createContentGraph() {
// Create the root of the content branch graph
BranchGroup root = new BranchGroup();
// create a transformation matrix to rotate and translate the
pyramid
Transform3D rotateTranslatePyramid=new Transform3D();
// a translation of .5 unit towards the positive x-Axis
rotateTranslatePyramid.set(new Vector3f(0.5f,0,0));
Transform3D rotatePyramidXY=new Transform3D();
// a rotation of 90/60 degrees clockweise around the y/X-Axis
rotatePyramidY.rotY(Math.PI/2);
rotatePyramidY.rotX(Math.PI/3);
// set the rotations together
rotateTranslatePyramid.mul(rotatePyramidXY);
//
create a transformation matrix to rotate and translate
the cube
Transform3D rotateTranslateCube=new Transform3D();
//
Axis
//
//
a roation of 45 degrees counter clockwise around the xrotateTranslateCube.rotX(Math.PI/4);
Transform3D rotateCubeY=new Transform3D();
a rotation 36 degrees clockweise around the y-Axis
rotateCubeY.rotY(-Math.PI/5);
set the rotations together
rotateTranslateCube.mul(rotateCubeY);
//
a translation of .5 unit toward the negative x-Axis
rotateTranslateCube.setTranslation(new Vector3f(-0.5f,0,0));
// create a transform group for the pyramid which refrences the
translation matrix translatePyramid
TransformGroup tgPyramid=new TransformGroup(translatePyramid);
// create a transform group for the cube which refrences the
translation matrix translateCube
TransformGroup tgCube=new TransformGroup(rotateTranslateCube);
root.addChild(tgPyramid);
tgPyramid.addChild(new Pyramid());
root.addChild(tgCube);
tgCube.addChild(new ColorCube(0.2));
return root;
} // end of CreateSceneGraph method of HelloJava3D3
Neupositionierung der Kamera in einer Szene
public HelloJava3D3() {
//
1. Create a canvas3d object
Canvas3D canvas3D = new
Canvas3D(SimpleUniverse.getPreferredConfiguration());
getContentPane().add(canvas3D);
//
2. Create SimpleUniverse object which references
the canvas3d object
SimpleUniverse simpleU = new SimpleUniverse(canvas3D);
//
This will move the ViewPlatform back a bit so that the
//
//
camera is positioned at point (0,0,2.41)
simpleU.getViewingPlatform().setNominalViewingTransform();
//
the following lines moves the camera 5 units towards
positive z-axis
the
Transform3D vT = new Transform3D();
vT.setTranslation(new Vector3f(0,0,5));
simpleU.getViewingPlatform().getViewPlatformTransform().setTrans
form(vT);