3D Programmierung mit Java Daniel F. Abawi Professur für Graphische Datenverarbeitung J. W. Goethe-Universität – Fachbereich 12 Danksagung / Quellenangabe Die Basis für diesen Foliensatz wurde von Dr. Paul Grimm (FH Erfurt) mit freundlicher Genehmigung bereitgestellt Daniel F. Abawi – Einführung in Java3D – 20. Juni 2006 Folie 2 1 Ziele dieser Einführung • Wie kann ich Java3D benutzen? • Wo kann ich Informationen finden? • Wo finde ich Beispiele? • Welche Konzepte setzt Java3D um? Daniel F. Abawi – Einführung in Java3D – 20. Juni 2006 Folie 3 Einführung - Was ist Java3D? • Java Package für interaktive 3D Graphik • Szenengraph-basierte high-level 3D Graphik API • Programmieren von interaktiven Anwendungen mit 3D Inhalten • Nahtlose Integration in Java – Kein Browser nötig (Applikationen) – Applet-fähig – Kompatibilität mit Java Webstart (JWS) Daniel F. Abawi – Einführung in Java3D – 20. Juni 2006 Folie 4 2 Was macht Java3D? • Übernahme der Bilderzeugung: – Szenenmanagement – Verdeckungsrechnung • Übernahme der Benutzerinteraktion • Plattformunabhängiges API • Implementierung für verschiedene Low-Level APIs (Open GL, Direct3D) Daniel F. Abawi – Einführung in Java3D – 20. Juni 2006 Folie 5 Was macht Java3D? • Durchführung von Optimierungen – Paralleles Rendern – Nutzung von Hardwarebeschleunigung – Reorganisation des Szenengraphen (Æ Zusatzinformationen können angegeben werden, die bei der Optimierung ausgewertet werden) Daniel F. Abawi – Einführung in Java3D – 20. Juni 2006 Folie 6 3 Szenengraphen in Java3D • Java3D wertet Szenengraph-Beschreibung in separaten, asynchronen Threads aus – Rendering von Graphik – „Rendering“ von Sound – Animation – Management der Eingabegeräte – Event Erzeugung (z. B. bei Kollisionen) Daniel F. Abawi – Einführung in Java3D – 20. Juni 2006 Folie 7 Anwendungsbeispiele Daniel F. Abawi – Einführung in Java3D – 20. Juni 2006 Folie 8 4 Starten einer Java3D Anwendung? • Standalone – Starten wie jede andere Java Applikation • Applet – Java Plugin und Java3D wird benötigt – Applet in eine WWW-Seite einbinden • Java Webstart (online und offline) – Installation von Java3D wird nicht vorausgesetzt Daniel F. Abawi – Einführung in Java3D – 20. Juni 2006 Folie 9 Nutzung von Java (und Java3D) • Nutzung des Java-Interpreters java myprogram • Nutzung des Java-Appletviewers appletviewer myprogram.html • Nutzung des Java-Compilers: javac myprogram.java • Die Benutzung einer Entwicklungsumgebung (z. B. Eclipse 3.1.2 – http://www.eclipse.org) wird empfohlen Daniel F. Abawi – Einführung in Java3D – 20. Juni 2006 Folie 10 5 Installation von Java3D • Mittlerweile gibt es eine Installationsroutine • Bei manueller (und bei der automatisierten) Installation ist darauf zu achten, daß Java3D in das korrekte Verzeichnis kopiert wird (beachte Windows JRE / evtl. installierte JDKs) • Bitte die Installationsanweisungen genau beachten! Daniel F. Abawi – Einführung in Java3D – 20. Juni 2006 Folie 11 Java3D in Web und Literatur • Offizielle Java3D Homepage https://java3d.dev.java.net/ – Download von Binaries und Beispielen – Java3D Tutorial – Java3D API Spezifikation • Aktuell ist die Version 1.4.0_01 (hier zu verwenden) Daniel F. Abawi – Einführung in Java3D – 20. Juni 2006 Folie 12 6 Java3D in Web und Literatur (Teil 2) • J3D.org (The Java3D Community Site) http://www.j3d.org – FAQs – Loader für unterschiedliche 3D-Formate – Tutorials • Weitere sehr gute Einstiegshilfen – Michael Pfeiffer (ausführlicher) http://www.3dchat.org/downctr.php?id=55 – Christopher Schnell und Sascha Strasser (sehr gutes Schnelltutorial) http://java3d.j3d.org/downloads/Java3D_schnell_tutorial.pdf Daniel F. Abawi – Einführung in Java3D – 20. Juni 2006 Folie 13 Java3D im Einzelnen • Aufbau einer einfachen Java3D-Anwendung mit einzelnen Objekten • Gruppierung und Transformation • Aufbau einer komplexen Szene mit mehreren Objekten und mit Animationen Daniel F. Abawi – Einführung in Java3D – 20. Juni 2006 Folie 14 7 Eine Applikation in Kürze • Konstruktion einer virtuellen Welt, in der alle 3D Daten enthalten sind (z. B. BranchGroups, TransformationGroups, Shape3D, Geometry, Appearance, Light, Behavior etc.) • Auswahl einer Kamera, um die 3D Daten zu betrachten • Einfügen der 3D Inhalte in die Szene – Hierarchische Anordnung der Objekte in einem Szenengraphen – Beschreibung der Interaktionen • Einbetten in eine Java-Anwendung Daniel F. Abawi – Einführung in Java3D – 20. Juni 2006 Folie 15 Minimalbeispiel (Teil 1/2) package startj3d; import import import import import import import java.applet.Applet; java.awt.BorderLayout; java.awt.GraphicsConfiguration; com.sun.j3d.utils.applet.MainFrame; com.sun.j3d.utils.geometry.ColorCube; com.sun.j3d.utils.universe.*; javax.media.j3d.*; public class Minimalbeispiel extends Applet { private SimpleUniverse u = null; public BranchGroup createSceneGraph() { BranchGroup objRoot = new BranchGroup(); objRoot.addChild(new ColorCube(0.4)); return objRoot; } public Minimalbeispiel() { } Daniel F. Abawi – Einführung in Java3D – 20. Juni 2006 Folie 16 8 Minimalbeispiel (Teil 2/2) public void init() { setLayout(new BorderLayout()); GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration(); Canvas3D c = new Canvas3D(config); add("Center", c); BranchGroup scene = createSceneGraph(); u = new SimpleUniverse(c); u.getViewingPlatform().setNominalViewingTransform(); u.addBranchGraph(scene); } public void destroy() { u.cleanup(); } public static void main(String[] args) { new MainFrame(new Minimalbeispiel(), 256, 256); } } Daniel F. Abawi – Einführung in Java3D – 20. Juni 2006 Folie 17 Aufbau eines Szenengraphen • Erzeugen von Knoten Primitive myShape1 = new Box(); Primitive myShape2 = new Cone(); • Gruppieren von Knoten BranchGroup myGroup = new BranchGroup( ); myGroup.addChild( myShape ); Daniel F. Abawi – Einführung in Java3D – 20. Juni 2006 Folie 18 9 Utility Klassen • Utility Klassen bauen auf Java3D auf • Vereinfachen oft auftretender Operationen: – Aufbau einer virtuellen Welt – Setzen der Kamera SimpleUniverse mySimple = new SimpleUniverse( myCanvas ); mySimple.addBranchGraph(myBranch); Daniel F. Abawi – Einführung in Java3D – 20. Juni 2006 Folie 19 SimpleUniverse Daniel F. Abawi – Einführung in Java3D – 20. Juni 2006 Folie 20 10 Einbetten in eine Java Anwendung Folgende Schritte sind notwendig: 1. Erzeugen eines Java AWT Frames 2. Setzen eine Java AWT Layouts 3. Erzeugen eines Canvas3D 4. Einfügen des Canvas3D Daniel F. Abawi – Einführung in Java3D – 20. Juni 2006 Folie 21 Einbetten in eine Java Anwendung public initializeUniverse() { Frame frame = new Frame( ); frame.setSize( 640, 480 ); frame.setLayout( new BorderLayout( ) ); GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration(); Canvas3D canvas = new Canvas3D(config); frame.add( "Center", canvas ); SimpleUniverse univ = new SimpleUniverse( canvas ); BranchGroup scene = createSceneGraph(); univ.addBranchGraph( scene ); frame.show( ); } Daniel F. Abawi – Einführung in Java3D – 20. Juni 2006 Folie 22 11 Benötigte Java Packages (Beispiele) • Java Packages import java.awt.*; • Java3D Packages import javax.media.j3d.*; import javax.vecmath.*; • Java3D Utility Packages import com.sun.j3d.utils.universe.*; import com.sun.j3d.utils.geometry.*; Daniel F. Abawi – Einführung in Java3D – 20. Juni 2006 Folie 23 Position • Damit der Würfel sichtbar wird, muss er aus dem Ursprung verschoben werden (falls nicht die die Methode setNominalViewingTransform() angewendet wurde) TransformGroup tg = new TransformGroup(); objRoot.addChild(tg); Transform3D t3d = new Transform3D(); t3d.set(new Vector3d (2,2,-5)); tg.setTransform(t3d); tg.addChild(new ColorCube(0.4)); Daniel F. Abawi – Einführung in Java3D – 20. Juni 2006 Folie 24 12 Materialeigenschaften • Zur Beschreibung der Materialeigenschaften muss das Appearance-Objekt entsprechend konfiguriert werden: Appearance app = new Appearance(); Material mm = new Material(); mm.setAmbientColor(1.0f, 0.0f, 0.0f ); mm.setLightingEnable(true); app.setMaterial(mm); myShape1.setAppearance(app); Daniel F. Abawi – Einführung in Java3D – 20. Juni 2006 Folie 25 Licht • Aufnahme einer Lichtquelle BoundingSphere bounds = new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0); Color3f ambientColor = new Color3f(0.8f, 0.3f, 0.9f); AmbientLight ambientLightNode = new AmbientLight(ambientColor); ambientLightNode.setInfluencingBounds(bounds); myGroup.addChild(ambientLightNode); Daniel F. Abawi – Einführung in Java3D – 20. Juni 2006 Folie 26 13 Rückblick • Darstellung von Graphik Primitiven – Beispiel 1: Box – Beispiel 2: Cone • Einbettung in eine Java-Applikation • Beschreibung der Materialeigenschaften • Verschieben des Objekts • Einfügen einer Lichtquelle Daniel F. Abawi – Einführung in Java3D – 20. Juni 2006 Folie 27 3D-Modelle • Modelle sind Beschreibungen von Objekten • Ein Shape3D-Knoten besteht aus – Geometrie – Appearance (Erscheinen) Shape3D( Geometry geometry, Appearance appearance ) • Geometrie kann aus mehreren Teilen bestehen • Appearance enthält verschiedene Attribute, die beschreiben wie die Geometrie gezeichnet wird Daniel F. Abawi – Einführung in Java3D – 20. Juni 2006 Folie 28 14 Elemente einer Geometrie • Koordinaten: Position der Knoten im Raum • Normalen (können auch automatisch berechnet werden): Nach außen orientierte Normale pro Knoten • Farben: Farbe pro Knoten • Textur-Koordinaten: Texel Position im Knoten Daniel F. Abawi – Einführung in Java3D – 20. Juni 2006 Folie 29 GeometryArray • GeometryArray erbt von Geometry • Ein GeometryArray Objekt hat vier Basistypen – Punkte – Linien – Dreiecke – Vierecke • GeometryArray bietet set und get Methoden Daniel F. Abawi – Einführung in Java3D – 20. Juni 2006 Folie 30 15 Modelle sind facettiert • Ideale Dreiecke und Vierecke • Einseitige Primitive • Reihenfolge der Eckpunkte bestimmt die Flächennormale • Gegen den Uhrzeigersinn Æ nach außen gerichtet (Beachtung der rechten Hand) Daniel F. Abawi – Einführung in Java3D – 20. Juni 2006 Folie 31 Beispiel eines Quadrats mit Punkten Point3f a = new Point3f (-width/2,-width/2,height/2); Point3f b = new Point3f (width/2,-width/2,height/2); Point3f c = new Point3f (width/2,width/2,height/2); Point3f d = new Point3f (-width/2,width/2,height/2); Point3f[] shape = new Point3f[4]; int z = 0; shape[z++] = a; shape[z++] = b; shape[z++] = c; shape[z++] = d; int[] stripCount = {4}; GeometryInfo gi = new GeometryInfo(GeometryInfo.POLYGON_ARRAY); GeometryArray ga = gi.getGeometryArray(); Daniel F. Abawi – Einführung in Java3D – 20. Juni 2006 Folie 32 16 Beispiel eines Quadrats mit einem QuadArray und Texturkoordinaten QuadArray rect = new QuadArray(4, GeometryArray.COORDINATES | GeometryArray.TEXTURE_COORDINATE_2); Point3f p3f = new Point3f(width/2, -width/2, -height/2); rect.setCoordinate(0, p3f); p3f.set(-width/2, -width/2, -height/2); rect.setCoordinate(1, p3f); p3f.set(-width/2, width/2, -height/2); rect.setCoordinate(2, p3f); p3f.set(width/2, width/2, -height/2); rect.setCoordinate(3, p3f); TexCoord2f tc2f = new TexCoord2f(0, 0); rect.setTextureCoordinate(0, 0, tc2f); tc2f.set(1, 0); rect.setTextureCoordinate(0, 1, tc2f); tc2f.set(1, 1); rect.setTextureCoordinate(0, 2, tc2f); tc2f.set(0, 1); rect.setTextureCoordinate(0, 3, tc2f); Shape3D rectobj = new Shape3D(rect); Daniel F. Abawi – Einführung in Java3D – 20. Juni 2006 Folie 33 Appearance • Kontrolle über den Rendering-Prozeß – Farbe – Transparenz – Beleuchtungsmodell – Linieneigenschaften – Und viele andere! • Alle Eigenschaften sind in der Appearance-Klasse und ihren Komponenten enthalten Daniel F. Abawi – Einführung in Java3D – 20. Juni 2006 Folie 34 17 Beispiel für verschiedene Appearance Daniel F. Abawi – Einführung in Java3D – 20. Juni 2006 Folie 35 Andere Eigenschaften • Das TransparencyAttributes Objekt steuert die Tranzparenz (0.0-1.0) • PointAttributes und LineAttributes enthalten Punktgröße und Liniendicke • PolygonAttributes regeln „culling“ und Fülleigenschaften (Punkt, Linien, Fläche) • RenderingAttributes steuern im Depth- und Alpha-Buffer Daniel F. Abawi – Einführung in Java3D – 20. Juni 2006 Folie 36 18 Texturen • Java 3D hat zwei Typen von Texturen – Texture2D für Bilder – Texture3D für Volumentexturen • Beide Typen beinhalten – Texturdaten – Filtermodi – Wrappingmodi – Berandungsfarbe Daniel F. Abawi – Einführung in Java3D – 20. Juni 2006 Folie 37 Texturen TextureLoader loader = new TextureLoader("stripe.jpg", this); ImageComponent2D image = loader.getImage(); Texture2D texture = new Texture2D(); texture.setImage(0, image); Appearance appear = new Appearance(); appear.setTexture(texture); Daniel F. Abawi – Einführung in Java3D – 20. Juni 2006 Folie 38 19 Weiteres Vorgehen • Bis jetzt: Aufbau einzelner 3D Objekte • Ab jetzt: Integration mehrerer 3D Objekte – Gruppierung von Objekten – Transformation von Objekten – Bewegung von Objekten – Lichtquellen Daniel F. Abawi – Einführung in Java3D – 20. Juni 2006 Folie 39 Live Nodes • BranchGraph, der einem Locale hinzugefügt wird ist live, d.h. er kann dargestellt werden BranchGroup myBranch = new BranchGroup( ); myBranch.addChild( myShape ); myLocale.addBranchGraph( myBranch ); • boolean isLive() Daniel F. Abawi – Einführung in Java3D – 20. Juni 2006 Folie 40 20 Compiled Nodes / Capabilities • BranchGroup kann kompiliert (optimiert) werden void compile(); • Beachte: compile bevor live • Capabilities geben an, was in einem Szenengraph noch gelesen und verändert werden darf, nachdem der Szenengraph compiled oder live ist • Capabilities wirken auf Optimierung Daniel F. Abawi – Einführung in Java3D – 20. Juni 2006 Folie 41 Capabilities (1) • Methoden für SceneGraphObject void setCapability( int bit ) void clearCapability( int bit ) boolean getCapability( int bit ) • Capabilities gibt es für jeden Knoten • In jedem Knoten gibt es Capabilities für die Attribute Daniel F. Abawi – Einführung in Java3D – 20. Juni 2006 Folie 42 21 Capabilities (2) • Beispiele von Shape3D: – ALLOW_APPEARANCE_READ – ALLOW_APPEARANCE_WRITE – ALLOW_GEOMETRY_READ – ALLOW_GEOMETRY_WRITE myShape.setCapability( Shape3D.ALLOW_APPEARANCE_WRITE ); Daniel F. Abawi – Einführung in Java3D – 20. Juni 2006 Folie 43 Gruppen in Java 3D • Unterschiedliche Typen – Group – BranchGroup – OrderedGroup / DecalGroup – SharedGroup – Switch – TransformGroup • Alle Gruppen haben Kinder – Modelle, Lichtquellen, Geräusche, Verhalten • Eigenschaften von Gruppen – Hat genau einen Vater – Beliebig viele Kinder Daniel F. Abawi – Einführung in Java3D – 20. Juni 2006 Folie 44 22 BranchGroup • Ein BranchGroup Objekt ist ein Teilbaum des Szenengraphen – Kann an ein Locale angehängt werden – Kann compiled werden – Kann als Kind einer anderen Gruppe verwendet werden – Kann zur Laufzeit verschoben oder gelöscht werden Daniel F. Abawi – Einführung in Java3D – 20. Juni 2006 Folie 45 TransformGroup • Transformationen sind Translation, Rotation und Skalierung • Transformationen akkumulieren sich bei der Traversierung des Szenengraphen • Die Transformationen tiefer im Graph werden zuerst ausgeführt Daniel F. Abawi – Einführung in Java3D – 20. Juni 2006 Folie 46 23 Transformation • Alle Modelle werden bezüglich der Weltkoordinaten plaziert • Ein TransformGroup Objekt erlaubt die Verwendung eines neuen Koordinatensystems relativ zum Vater • Verändert man die TransformGroup, so bewegen sich auch die Modelle in der Gruppe Daniel F. Abawi – Einführung in Java3D – 20. Juni 2006 Folie 47 Transform3D • Ein Transform3D Objekt beschreibt die Transformation einer TransformGroup • Dargestellt als 4x4 Double Matrix • Beispiel: Transform3D t = new Transform3D(); t.set(scale, new Vector3d(xpos, ypos, 0.0)); Daniel F. Abawi – Einführung in Java3D – 20. Juni 2006 Folie 48 24 Beispiel eines Szenengraph Daniel F. Abawi – Einführung in Java3D – 20. Juni 2006 Folie 49 Verhalten (Behavior-Klassen) • Programmierbarkeit – Verhalten sind Java-Methoden • Effizienz – Java3D führt Verhalten nur aus wenn nötig • Komposition – Verhalten werden mit Objekten verbunden – Verhalten können nebeneinander existieren und dynamisch verändert werden Daniel F. Abawi – Einführung in Java3D – 20. Juni 2006 Folie 50 25 Vorgefertigte Behavior • Interpolatoren – Alpha – Rotation – Position – Pfad • Billboards • Level of Detail Knoten • Mousebehavior Daniel F. Abawi – Einführung in Java3D – 20. Juni 2006 Folie 51 Verhalten (Behavior-Klassen) • Jedes Verhalten enthält: – Code zur Ausführung in einer processStimulus Methode – „wakeupOn“ Bedingungen, um zu steuern wann der Code durchgeführt wird – Bounding Information für die Ausführung (Bereich spezifizieren) Daniel F. Abawi – Einführung in Java3D – 20. Juni 2006 Folie 52 26 Verhalten - Bounds • Verhalten werden nur durchgeführt, wenn sich Sichtradius vom Betrachter und Bounding-Objekt des Verhaltens schneiden • Bounding-Objekt – Kugel, Würfel, Polyeder etc. – Default: Kein Bounding Objekt (deswegen auch keine Durchführung des Verhaltens) – Die Position des Verhaltens im Szenengraph bestimmt den Ursprung des Bounding-Objekts Daniel F. Abawi – Einführung in Java3D – 20. Juni 2006 Folie 53 Verhalten - Wakeup • Ein Verhalten wird nur durchgeführt, wenn die WakeupKriterien erfüllt sind – Ein gewisse Zeit ist verstrichen – Ein Event wird generiert – Transformation wird durchgeführt – Kollision oder Nähe • Kriterien können durch logische Operationen verbunden werden Daniel F. Abawi – Einführung in Java3D – 20. Juni 2006 Folie 54 27 Beispiel eines Behaviors class WakeUpAfterMovement extends Behavior { protected WakeupCondition m_WakeupCondition = null; public WakeUpAfterMovement() { } public void initialize() { wakeupOn(new WakeupOnElapsedTime(1000)); } public void processStimulus(java.util.Enumeration criteria) { while (criteria.hasMoreElements()) { WakeupCriterion wakeUp = (WakeupCriterion) criteria.nextElement(); if (wakeUp instanceof WakeupOnElapsedTime) { System.out.println(“1000 ms sind vorbei! "); } } } } Daniel F. Abawi – Einführung in Java3D – 20. Juni 2006 Folie 55 RotationInterpolator Alpha spinAlpha = new Alpha( -1,4000 ); // unendlich oft, 4000 ms Dauer RotationInterpolator spinner = new RotationInterpolator( spinAlpha, trans ); spinner.setSchedulingBounds( new BoundingSphere( new Point3d( ), 1000.0 ) ); trans.addChild( spinner ); Daniel F. Abawi – Einführung in Java3D – 20. Juni 2006 Folie 56 28 MouseBehavior TransformGroup objTrans = new TransformGroup(); MouseRotate behavior = new MouseRotate(); behavior.setTransformGroup(objTrans); objTrans.addChild(behavior); behavior.setSchedulingBounds(bounds); MouseZoom behavior2 = new MouseZoom(); MouseTranslate behavior3 = new MouseTranslate(); ... Daniel F. Abawi – Einführung in Java3D – 20. Juni 2006 Folie 57 Lichtquellen • Java3D bietet folgenden Typen – Ambientes Licht: AmbientLight – Gerichtetes Licht: DirectionalLight – Punktlichtquelle: PointLight • Attribute von allen Lichtquellen – Status (aus/an) – Farbe – Bounding-Volumen Daniel F. Abawi – Einführung in Java3D – 20. Juni 2006 Folie 58 29 Definition von Lichtquellen • Ambientes Licht: AmbientLight( Color3f color ) • Gerichtetes Licht: DirectionalLight(boolean lightOn, Color3f color, Vector3f direction) • Punktlichtquelle: PointLight(Color3f color, Point3f position, Point3f attenuation) Daniel F. Abawi – Einführung in Java3D – 20. Juni 2006 Folie 59 Picking • Java3D bietet Möglichkeiten zur Auswahl von Objekten des Szenegraphen • Ein PickShape wird mit BranchGroups geschnitten • BranchGroups enthalten Methoden zur Auswertung des Picking • Verschiedene Kriterien bei der Auswahl Daniel F. Abawi – Einführung in Java3D – 20. Juni 2006 Folie 60 30 Picking Daniel F. Abawi – Einführung in Java3D – 20. Juni 2006 Folie 61 Daniel F. Abawi – Einführung in Java3D – 20. Juni 2006 Folie 62 31 Zusammenfassung • Grundlagen • Virtuelle Welt und Physikalische Welt • Modelle • Gruppierung und Transformation • Verhalten • Lichtquellen Daniel F. Abawi – Einführung in Java3D – 20. Juni 2006 Folie 63 Danke für die Aufmerksamkeit Daniel F. Abawi – Einführung in Java3D – 20. Juni 2006 Folie 64 32