530 likes | 759 Views
Seminararbeit Computergrafik Thema: Szenengraphen und Java3D von Florian Valentin. Florian Valentin – Szenengraphen und Java3D. Inhalt der Präsentation. Einführung Szenengraphen Java3D API Beispielprogramm. Florian Valentin – Szenengraphen und Java3D. Einführung - Übersicht.
E N D
Seminararbeit ComputergrafikThema:Szenengraphen und Java3Dvon Florian Valentin Florian Valentin – Szenengraphen und Java3D
Inhalt der Präsentation • Einführung • Szenengraphen • Java3D API • Beispielprogramm Florian Valentin – Szenengraphen und Java3D
Einführung - Übersicht Einführung • Geschichte • Ziele • Einsatzmöglichkeiten Florian Valentin – Szenengraphen und Java3D
Einführung - Geschichte • 1994 Entwicklung eines Standards für 3D Techniken • WEB 3D Konsortium • Entstehung des VRML Standards (Silicon Graphics) • 1997 Vorstellung der Java3D API auf der SIGGRAPH(Special Interest Group on Graphics and Interactive Techniques) • Kooperation von Sun, Silicon Graphics, Intel und Apple • aktuelle Version 1.3.1 Florian Valentin – Szenengraphen und Java3D
Einführung - Ziele • höchstmögliche Performance • maximale Plattformunabhängigkeit • große Anzahl von 3D Features • Objektorientierte Entwicklung (Wiederverwendbarkeit) • Konzept des Szenenmanagement • Konzept des Szenengraphen Florian Valentin – Szenengraphen und Java3D
Einführung - Einsatz • Internetanwendungen (Applets) • Spiele • CAD – Systeme • Virtual Reality • Autorensysteme • Visualisierung von Daten in Forschung und Wirtschaft • … Florian Valentin – Szenengraphen und Java3D
Szenengraphen - Übersicht Szenengraphen • Einführung • Klassen im Szenengraphen • Klassenhierarchie • Zustände und Capabilities • Rendermodi Florian Valentin – Szenengraphen und Java3D
Szenengraphen – Einführung I Florian Valentin – Szenengraphen und Java3D
Szenengraphen – Einführung II • Konzept zur Erstellung einer 3D Szene • zentrales Element in der Java3D API • hierarchische Datenstruktur • gerichteter azyklischer Graph (DAG) • Knoteninhalte: • 3D Objekte • Zustandsinformationen • Transformationen / Rotationen • Licht • weitere Attribute Florian Valentin – Szenengraphen und Java3D
Szenengraphen – Einführung III • Beziehungen zwischen Knoten • Vater – Kind – Beziehung (parent-child link) • Referenz Beziehung (reference link) • Vorteil der Struktur • Hierarchischer Aufbau • Wiederverwendung von Teilbäumen • einfache Implementierung • Picking Unterstützung • Kollisionserkennung • Behavior Modell Florian Valentin – Szenengraphen und Java3D
Szenengraphen – Einführung IV • Nachteile • Erzeugung von ungültigen Szenengraphen • Komplexität bei großen Szenen Florian Valentin – Szenengraphen und Java3D
Szenengraphen – Klassen I • Klassen des Szenengraphen • Virtuelles Universum (VirtualUnivers) • Wurzel des Szenengraphen • enthält Referenz auf Locale – Objekt • Lokale (Locale) • Container für Teilbäume • BranchGroup Knoten ist Wurzel eines Teilbaumes • 2 Arten von Teilbäumen • Inhaltsteilbaum (content branch graph) • Ansichtsteilbaum (view branch graph) Florian Valentin – Szenengraphen und Java3D
Szenengraphen – Klassen II • Knoten (Node) • Gruppe (Group) - Positionierung von Objekten - TransformGroup (Transformationen, Rotationen) • Blatt (Leaf) • - Shape3D (Geometrie) • - ViewPlatform • Ereignisse (Behavior)- Interaktion, Animation - Picking Florian Valentin – Szenengraphen und Java3D
Szenengraphen – Klassen III • Knotenkomponenten (Nodecomponent) • Referenzen • Geometrie • Aussehen (Appearance) • Ansichtsgraph Komponenten (view branch) • Canvas3D • PhysicalBody • PhysicalEnvironment Florian Valentin – Szenengraphen und Java3D
Szenengraphen – Klassen IV Florian Valentin – Szenengraphen und Java3D
Szenengraphen - Hierarchie Florian Valentin – Szenengraphen und Java3D
Szenengraphen – Capabilities I • Szenengraph nach dem Kompilieren starr • spezielle Einstellung um Graphen zu ändern (Animation) • Szenengraph auf „Lebendigkeit“ testen • Möglichkeit zur Modifikation der Knoten • Zugriffsparameter = Capabilities • setCapability( int bit ) • clearCapability( int bit ) • boolean getCapability( int bit ) Florian Valentin – Szenengraphen und Java3D
Szenengraphen – Capabilities II • Knoten Eigenschaften • ALLOW_TRANSFORM_READ • ALLOW_TRANSFORM_WRITE • ALLOW_CHILDREN_EXTEND • ALLOW_CHILDREN_READ • ALLOW_CHILDREN_WRITE • Shape Eigenschaften • ALLOW_GEOMETRY_READ • ALLOW_GEOMETRY_WRITE • ALLOW_APPEARANCE_READ • ALLOW_APPEARANCE_WRITE • ALLOW_COLLISION_BOUNDS_READ • ALLOW_COLLISION_BOUNDS_WRITE Florian Valentin – Szenengraphen und Java3D
Szenengraphen - Rendermodi • 3 verschiedene Rendermodi • Retained • Entwickler erstellt Szene • Java3D rendert Szene ununterbrochen • Szenengraph uneingeschränkt manipulierbar • Compiled Retained • Performanzoptimierte Struktur ( compile() ) • schnellster Modus • Änderungen nur bei markierten Knoten möglich • Immediate • Pure Mode • Mix Mode Florian Valentin – Szenengraphen und Java3D
Java3D - Übersicht Java3D API • Allgemein • Geometrie • erweiterte Geometrie • Objectloader • Textobjekte • Aussehen ( Appearance ) • Transformation / Rotation • Lichteffekte • Animation / Interaktion Florian Valentin – Szenengraphen und Java3D
Java3D - Allgemein • Erweiterung der Java2 Plattform • OpenGL / DirectX • Kernklassen (core classes, javax.media.j3d) • Basisklassen für primitive Körper • Klassen für Szenengraphen • Audioengine • Loader • Zubehörklassen (utility classes, com.sun.j3d.utils) • mathematische Klassen (javax.vecmath) Florian Valentin – Szenengraphen und Java3D
Java3D – Geometrie I • verschiedene Möglichkeiten zur Szenenmodellierung • Basisklassen in Package com.sun.j3d.utils.geometry • Quader (Box) • Kegel (Cone) • Zylinder (Cylinder) • Kugel (Sphere) • ColorCube Florian Valentin – Szenengraphen und Java3D
Java3D – Geometrie II • verschiedene Konstruktoren • Beispiel Zylinder • Cylinder() erzeugt Zylinder mit Radius einer Längeneinheit und Höhe von zwei Längeneinheiten • Cylinder( float radius, float height ) erzeugt Zylinder mit vorgegebenen Werten • Cylinder( float radius, float height, Appearance appearance ) erzeugt Zylinder mit vorgegebenen Werten und bestimmten Aussehen • ähnlich bei den anderen Objekten (Sphere, Cone, Box) Florian Valentin – Szenengraphen und Java3D
Java3D – erweiterte Geometrie I • Konstruktion von eigenen Objekten • Grundlage für alle Objekte Punkt (Point3f, Point3d) • GeometryArray • PointArray (Menge von Punkten) • LineArray (2 Punkte werden mit Linie verbunden) • TriangleArray (3 Punkte bilden ein Dreieck) • QuadArray (4 Punkte bilden ein Viereck) • Unterklasse GeometryStripArray • LineStripArray • TriangleStripArray • TriangleFanArray Florian Valentin – Szenengraphen und Java3D
Java3D – erweiterte Geometrie II TriangleFanArray LineStripArray Florian Valentin – Szenengraphen und Java3D
Java3D – erweiterte Geometrie III • GeometryInfo • Objekte werden aus verschiedenen geometrischen Figuren zusammen gebaut • Klasse Shape3D • Konstruktor Shape3D( Geometry geo, Appearance app) • Methoden • void setGeometry(Geometry geo) • void setAppearance(Appearance app) • Beispiel Bauer1 Florian Valentin – Szenengraphen und Java3D
Java3D – ObjectLoader I • Loader – Klassen com.sun.j3d.loaders • Funktionen zum Einlesen von Dateien • Lw3DLoader – Lightwave 3D Dateien • ObjectFileLoader - .obj Dateien • andere Loader frei verfügbar Florian Valentin – Szenengraphen und Java3D
Java3D – ObjectLoader II • Rezept: 1. Finde einen Loader oder schreibe einen eigenen 2. Importieren der Loader – Klassen 3. Importiere alle notwendigen Klassen 4. Deklariere eine Scene Variable 5. Erzeuge ein Loader Objekt 6. Lade die Datei Scene = loader.load(String file); 7. Füge Scene in den Szenengraph einaddChild(Scene.getSceneGroup()); • Beispiel Galeone Florian Valentin – Szenengraphen und Java3D
Java3D - Textobjekte • com.sun.utils.geometry.Text2D oder Text3D • 2D Text mit Parametern Text, Schriftfarbe, -größe, -stil • Text2D(String text, Color3f color, String fontName, int fontSize, int FontStyle) • 3D Text • Klasse Font3DFont3D(Font font, FontExtrusion extrudePath) • Text3DText3D(Font3D font3d, String string, Point3f position) • Beispiel 3D Text Florian Valentin – Szenengraphen und Java3D
Java3D – Appearance I • Aussehen eines geometrischen Objekts oder Shape3D • Appearance-Bundle Attribute für Aussehen • PointAttributes (Antialiasing, Size) • LineAttributes (Antialiasing, Pattern, Line Width) • PolygonAttributes (Cull_Face, Mode, Offset, Normal_Fip) • ColoringAttributes (Color, Shader) • TransparencyAttributes (Mode, Value) Florian Valentin – Szenengraphen und Java3D
Java3D – Appearance II • RenderingAttributes (Alpha_Test_Function, Allow_Alpha_Test_Value, Allow_Depth_Enable) • Material (Ambient, Diffuse, Emissive, Specular Color, Lighting, Shininess) • TextureAttributes (Blend_Color, Mode, Transform) • Texture (Boundary_Color, Enable, Filter, Image, MipMap_Mode) • TexCoordGeneration (Enable, Format, Mode, Plane) Florian Valentin – Szenengraphen und Java3D
Java3D - Texturen • Rezept zur Anwendung von Texturen 1. Textur vorbereiten 2. Bild ladenTexture texture = new TextureLoader(“Bild.jpg”, this). getTexture(); 3. Setze Textur in ein Appearance – Bundle Appearance app = new Appearance(); app.setTexture(texture); 4. Spezifiziere Texturkoordinaten des Objektes Box textureCube = new Box(0.4f, 0.4f, 0.4f, Box.GENERATE_TEXTURE_COORDS, app); • Beispiel TextureImage Florian Valentin – Szenengraphen und Java3D
Java3D - Transformationen • Beschreibung der Position der Objekte in der Szene • mathematische Klassen (Matrix3f, 3d, 4f, 4d) • Klasse Transform3D • Transform3D • Transform3D( Matrix4f m1) • Methoden • void mul(Transform3D t1) • void setScale(Vector3D scale) • void setTranslation(Vector3D trans) • … Florian Valentin – Szenengraphen und Java3D
Java3D - Rotationen • Objekt der Klasse Transform3D • Methoden • void setRotation( Matrix3f m1) • void rotX( double angle ) • void rotY(double angle ) • … Florian Valentin – Szenengraphen und Java3D
Java3D – Lichteffekte I • Beleuchtung einer Szene (Phongmodell) • javax.media.j3d.light • Ambient Light AmbientLight(boolean lightOn, Color3f color) • Directional Light DirectionalLight(boolean lightOn, Color3f color, Vector3f direction) • Point Light PointLight(Color3f color, Point3f position, Point3f attenuation) Florian Valentin – Szenengraphen und Java3D
Java3D – Lichteffekte II • Spot Light SpotLight(Color3f color, Point3f position, Point3f attenuation, Vector3f direction, float spreadAngle, float concentration) • Methoden für Einstellung des Lichts • void setInfluenceingBounds(Bounds region) • void setColor(Color3f color) • void addScope(Group scope) • Generierung der Normalen bei Objekten • Parameter primflags • Beispiel Sphere Florian Valentin – Szenengraphen und Java3D
Java3D – Interaktion I • Veränderung eines Objektes durch den Benutzer • Maus- / Tastenaktionen, Picking Florian Valentin – Szenengraphen und Java3D
Java3D – Interaktion III • OrbitBehavior • Bewegung der Ansicht um ein Objekt • OrbitBehavior orbit = new OrbitBehavior ( canvas3D, OrbitBehavior.STOP_ZOOM ); • MouseNavigatorBehavior MouseRotate mrot = new MouseRotate (MouseBehavior.INVERT_INPUT); mrot.setTransformGroup(tfgroup); Florian Valentin – Szenengraphen und Java3D
Java3D – Interaktion II • KeyNavigatorBehavior • Aktionen bei Tastenevents • KeyNavigatorBehavior keynav = new KeyNavigatorBehavior( TransformGroup trans ); Florian Valentin – Szenengraphen und Java3D
Java3D – Interaktion III • Picking • Implementierung eigener Behavior • Maus-Event Auslöser Florian Valentin – Szenengraphen und Java3D
Java3D – Interaktion IV • Rezept für eigene Behavior 1. Erstelle Klasse die von der Klasse Behavior erbt 2. Implementiere einen Konstruktor mit Referenz auf ein Objekt Festlegen des Initial – Trigger (WakeUp Kriterium) 3. Überschreibe void initalization() Initialisierung beim Auftreten des Trigger - Events 4. Überschreibe void processStimulus() Implementierung der Aktion Florian Valentin – Szenengraphen und Java3D
Java3D – Animation I • Zeitlich bedingte Veränderungen der Objekte • Alpha • Timing für zeitbasierte Animation • alpha – value zwischen 0..1 • loopCount ( -1 = unendlich ) • mode INCREASING_ENABLE, DECREASING_ENABLE • Interpolator • benötigt Alpha – Objekt • verschiedene Animationstypen Florian Valentin – Szenengraphen und Java3D
Java3D – Animation II • Rezept für eigene Animation 1. Erstelle das zu animierende Objekt 2. Erstelle Alpha-Objekt (Steuerung) 3. Erstelle Interpolator (Referenz auf Zielobjekt + Alpha) 4. Lege Region für Animation fest 5. Füge Interpolator in den Szenengraphen ein Florian Valentin – Szenengraphen und Java3D
Beispielprogramm - Übersicht Beispielprogramm • Rezept zum Erstellen einer Szene • Einfaches Beispiel Florian Valentin – Szenengraphen und Java3D
Beispielprogramm – Rezept I • Erzeuge ein Canvas3D Objekt • Erzeuge ein VirtualUniverse Objekt • Erzeuge ein Locale Objekt und verbinde es mit dem VirtualUniverse Objekt • Konstruiere den View Ast a. Erzeuge ein View Objekt b. Erzeuge ein ViewPlatform Objekt c. Erzeuge ein Physical Body Objekt d. Erzeuge ein PhysicalEnvironment Objekt e. Verbinde die Objekte ViewPlatform, PhysicalBody, PhysicalEnvironment und Canvas3D mit dem View Objekt Florian Valentin – Szenengraphen und Java3D
Beispielprogramm – Rezept II • 5. Konstruiere den/die Content Ast/Äste • 6. Kompiliere die Äste • 7. Hänge die Äste an das Locale Objekt • Beispiel ColorCube Florian Valentin – Szenengraphen und Java3D
Beispielprogramm – Rotated Cube I public class SampleCubeRotate extends JFrame { /* Konstruktor */ public SampleCubeRotate() { Container contentPane = this.getContentPane(); /* Erstelle Zeichenfläche */ contentPane.setLayout(new BorderLayout()); GraphicsConfiguration newConfig = SimpleUniverse.getPreferredConfiguration(); Canvas3D newCanvas = new Canvas3D(newConfig); /* Erstelle Simple Univers */ SimpleUniverse newUnivers = new SimpleUniverse(newCanvas); /* Setze Zeichenfläche */ contentPane.add(newCanvas, BorderLayout.CENTER); newUnivers.getViewingPlatform(). setNominalViewingTransform(); Florian Valentin – Szenengraphen und Java3D
Beispielprogramm – Rotated Cube II /* Erzeuge Text und ColorCube */ BranchGroup newColorCube = createSceneGraph(); /* Füge Zweige an das Universum an */ newUnivers.addBranchGraph(newColorCube); setTitle("Rotated ColorCube"); setSize(300, 300); } Florian Valentin – Szenengraphen und Java3D
Beispielprogramm – Rotated Cube III BranchGroup createSceneGraph() { // Erstelle Wurzel des Teilbaums BranchGroup objRoot = new BranchGroup(); // Rotationen Transform3D rotate = new Transform3D(); rotate.rotX(Math.PI/4.0d); // Erstelle Rotationsgruppe TransformGroup objRotate = new TransformGroup(rotate); // Erstelle neue TransformGroup TransformGroup objSpin = new TransformGroup(); // Darf verändert werden objSpin.setCapability (TransformGroup.ALLOW_TRANSFORM_WRITE); Florian Valentin – Szenengraphen und Java3D
Beispielprogramm – Rotated Cube IV // füge beide Knoten zum Teilgraphen objRoot.addChild(objRotate); objRotate.addChild(objSpin); // Cube erstellen objSpin.addChild(new ColorCube(0.4)); // Erstelle Verhalten (Behavior) Transform3D yAxis = new Transform3D(); Alpha rotationAlpha = new Alpha(-1, 4000); RotationInterpolator rotator = new RotationInterpolator(rotationAlpha, objSpin, yAxis, 0.0f, (float) Math.PI*2.0f); // Erstelle Region für Verhalten BoundingSphere bounds = new BoundingSphere(); rotator.setSchedulingBounds(bounds); // Füge in Szenengraphen ein objSpin.addChild(rotator); // Gebe Teilbaum zurück return objRoot; } Florian Valentin – Szenengraphen und Java3D