420 likes | 569 Views
Java3D. Einfacher scene graph. View branch graph. BG. Shape3D Knoten. S. Aussehen. Geometrie. visual object. Java3D. Shape3D. Shape3D() Shape3D(Geometry geometry) Shape3D(Geometry geometry, Appearance appearance ) void setGeometry(Geometry geometry)
E N D
Java3D Einfacher scene graph View branch graph BG Shape3D Knoten S Aussehen Geometrie visual object
Java3D Shape3D Shape3D() Shape3D(Geometry geometry) Shape3D(Geometry geometry, Appearance appearance ) void setGeometry(Geometry geometry) void setAppearance(Appearance appearance) ALLOW_GEOMETRY_READ | WRITE ALLOW_APPEARANCE_READ | WRITE ALLOW_COLLISION_BOUNDS_READ | WRITE
Java3D Klassenhierachie Appearance Geometry Material NodeComponent Texture ViewPlatform Attributes SceneGraphObject Sound Group Background Node Behavior Fog Leaf Light Morph Shape3D
Java3D Herstellung eines „visual Object“ 1. public class VisualObject extends Shape3D{ 2. 3. private Geometry voGeometry; 4. private Appearance voAppearance; 5. 6. // create Shape3D with geometry and appearance 7. // the geometry is created in method createGeometry 8. // the appearance is created in method createAppearance 9. public VisualObject() { 10. 11. voGeometry = createGeometry(); 12. voAppearance = createAppearance(); 13. this.setGeometry(voGeometry); 14. this.setAppearance(voAppearance); 15. } 16. 17. private Geometry createGeometry() { 18. // code to create default geometry of visual object 19. } 20. 21. private Appearance createAppearance () { 22. // code to create default appearance of visual object 23. } 24. 25. } // end of class VisualObject
Java3D Einfügen eines „visual Object“ in den „scene graph“ objRoot.addChild( new VisualObject() ); (objRoot ist von Group abgeleitet)
Java3D Vorprogrammierte (utility) Klassen für geometrische „Primitive“ geometrische Primitive können sein: Würfel, Kugel, Kegel, Zylinder nur Aussehen (appearance) nicht die Geometrie änderbar Paket: com.sun.j3d.utils.geometry
Java3D Klassenhierarchie für geometrische „Primitive“ java.lang.Object javax.media.j3d.SceneGraphObject javax.media.j3d.Node javax.media.j3d.Group com.sun.j3d.utils.geometry.Primitive com.sun.j3d.utils.geometry.Box com.sun.j3d.utils.geometry.Cone com.sun.j3d.utils.geometry.Cylinder com.sun.j3d.utils.geometry.Sphere
Java3D Klasse Primitive Definiert alle Eigenschaften, die Box, Sphere, Cone, Cylindergemeinsam sind z.B. default Zahl der Polygone die benutzt werden, um Flächen darzustellen -> 3D Flächendarstellung
Java3D Gemeinsame Methoden von „Box“, „Cylinder“, „Cone“ Shape3D getShape(int id) „Box“, „Cylinder“, „Cone“ setzen sich aus weiteren Shape3DObjekten zusammen (z.B. die Flächen des Würfels) Diese Objekte haben eigene Geometrie KnotenKomponenten getShape(int id) holt die Fläche mit der Nummer id void setAppearance(Appearance appearance) Aussehen aller inneren Objekte wird gesetzt
Java3D Konstruktoren für „Box“ Box() Erzeugt 2m x 2m x 2m Würfel zwischen (-1,-1,-1) und (1,1,1) (m = Meter) Box(float x, float y, float z, Appearance appearance) Erzeugt xm x ym x zm Würfel im Ursprung y Konstruktoren für „Cone“ 2m Cone() 1m (umgebender Würfel im Ursprung) Cone(float radius, float height)
Java3D Konstruktoren für „Cylinder“ y Cylinder() 2m 1m (umgebender Würfel im Ursprung) Cylinder(float radius, float height) Cylinder(float radius, float height, Appearance appearance) Konstruktoren für „Sphere“ Sphere() Radius = 1m Sphere(float radius) Sphere(float radius, Appearance appearance)
Java3D Beispiel: Herstellen eines JoJo
Warum dieser BG ? Warum diese TG‘s ? Java3D View branch graph BG BG TG TG Jojo Objekt TG TG cone Objekt cone Objekt G G S S S S Geometry Geometry Geometry Geometry Appearance Appearance
Java3D BG Wäre dies nicht eine Vereinfachung ? View branch graph BG TG Jojo Objekt TG cone Objekt G Appearance S S Geometry Geometry
Java3D Wäre nicht zumindest dies möglich ? View branch graph BG BG TG TG Jojo Objekt TG TG cone Objekt G S S Geometry Geometry Appearance
Java3D Programmierbeispiel „ConeYoyo“
Java3D Mathematische Klassen Viele Geometrie Unterklassen beschreiben Primitive, die auf Vertizes (Eckpunkten) basieren, z.B. Punkte, Linien, gefüllte Polygone Im Paket javax.vecmath.* sind mathematische Klassen zur Beschreibung von Vertex basierten Daten zusammengefasst
Java3D Tupel Tupel: (zahl, nochNeZahl, weitereZahl, ...) Im vecmath Paket sind Tupel* Klassen Oberklassen, von denen die eigentlichen „Nutz“ Klassen abgeleitet werden: Tuple3b Tuple3f Tuple3d Tuple4b Tuple4f Tuple4d Tuple2f Tuple2d Dabei bezeichnet die Zahl die Anzahl der Zahlen im Tupel Der Buchstabe ist der Datentyp im Tupel: b = byte, f = single precision float, d = double precision float
Java3D Unterklassen Von den Tupelklassen sind jeweils folgende Klassen abgeleitet: Point* Color* Vector* <- für Texturen TexCoord*
Java3D Konstruktoren Beispielhaft für die Konstruktoren der Tupelklassen Tuple2f Konstruiert ein Tupel (0,0) Tuple2f() Tuple2f(float x, float y) Tuple2f(float[] t) klont Tuple Tuple2f(Tuple2f t) Tuple2f(Tuple2d t)
Java3D Methoden Beispielhaft für die Methoden der Tupelklassen (höhere Dimensionalität ist entsprechend anzupassen): void set(float x, float y) void set(float[] t) boolean equals(Tuple2f t1) this = this+t1 final void add(Tuple2f t1) void add(Tuple2f t1, Tuple2f t2) this = t1+t2 void sub(Tuple2f t1, Tuple2f t2) this = t1-t2 void sub(Tuple2f t1) this = this-t1 negate Vektor in place ? void negate(Tuple2f t1) void negate() void absolute(Tuple2f t1) jede Komponente wirdauf ihr Absolutes gesetzt
Java3D Punktklasse Punktklassen beschreiben - die Koordinaten eines Eckpunkts oder die Position - eines Rasterbilds, - einer Punktlichtquelle, - eines Geräuschs etc. Beispielhaft hier Point3f: float distance(Point3f p1) float distanceSquared(Point3f p1) abs(x1-x2)+ abs(y1-y2)+ abs(z1-z2) float distanceL1(Point3f p1)
Java3D Farbklassen Color3* RGB System Color4* zusätzlich Transparenz Byte: 0 bis 255 Single Precision Float: 0.0 bis 1.0 Kein double Precision Float Gegenüber Tuple3* bzw. Tuple4* keine zusätzlichen Methoden, d.h. erben alle Methoden von den Tuple Klassen class ColorConstants{ 4. public static final Color3f red = new Color3f(1.0f,0.0f,0.0f); 5. public static final Color3f green = new Color3f(0.0f,1.0f,0.0f); 6. public static final Color3f blue = new Color3f(0.0f,0.0f,1.0f); 7. public static final Color3f yellow = new Color3f(1.0f,1.0f,0.0f); 8. public static final Color3f cyan = new Color3f(0.0f,1.0f,1.0f); 9. public static final Color3f magenta = new Color3f(1.0f,0.0f,1.0f); 10. public static final Color3f white = new Color3f(1.0f,1.0f,1.0f); 11. public static final Color3f black = new Color3f(0.0f,0.0f,0.0f); 12.}
Java3D Vektorklassen Oberflächennormale, Richtung von Lichtquellen Geräuschausbreitung Nicht ererbte Methoden: float length() float lengthSquared() void cross(Vector3f v1, Vector3f v2) float dot(Vector3f v1) void normalize() void normalize(Vector3f v1) float angle(Vector3f v1) Winkel in radian zwischen 0 und
Java3D TexCoord Klassen Textur Koordinaten bei einem Vertex Es gibt nur TexCoord2f und TexCoord3f Keine nicht ererbte Methoden
Java3D Geometrie Klassen Geometry ist eine abstrakte Oberklasse Jedes Shape3D Objekt sollte seine setGeometry() Methode benutzen um sich mit einem (und nur einem) Geometry Objekt zu verbinden
Java3D Geometrie Klassen: Klassenhierarchie Geometry ist eine abstrakte Oberklasse Jedes Shape3D Objekt sollte seine setGeometry() Methode benutzen um sich mit einem (und nur einem) Geometry Objekt zu verbinden Geometry Objekte fallen in drei Unterklassen: - vertex basierte Geometrien ohne Index: jeder Vertex wird beim zeichnen eines visual objects nur einmal benutzt - vertex basierte Geometrien mit Index: die Vertizes werden beim zeichnen eines visual objects mehrfach verwendet - übrige (die Klassen Raster, Text3D, compressedGeometry)
Java3D Geometrie Klassen: Klassenhierarchie
Java3D GeometryArray Klassen In einem GeometryArray Objekt gibt es mehrere „data arrays“: - Ein Array für Vertizes (Koordinatentripel bzw. Eckpunkte) - Ein Array für die zu den Eckpunkten gehörenden Farben - Ein Array für die zu den Eckpunkten gehörenden Oberflächen- normalen - Ein Array für die zugehörigen Textur Koordinaten Größe des Arrays = Zahl der Eckpunkte der Geometrie
Java3D GeometryArray Klassen 3 Schritte im Leben eines Geometry Objekts: 1. Objekt erzeugen 2. Objekt mit Daten füllen 3. Objekt mit zugehörigem Shape3D Objekt assoziieren
Inhalt programmieren GeometryArray Klassen Schritt 1 Angeben: - Zahl der Eckpunkte zu was ? - Welche Daten werden an jedem Eckpunkt zusätzlich angegeben („vertex format“) Konstruktor (Vorsicht - GeometryArray ist abstract): GeometryArray(int vertexCount, int vertexFormat) COORDINATES Muss gesetzt werden ! NORMALS COLOR_3 COLOR_4 Farben mit Transparenz ! TEXTURE_COORDINATE_2 2D Textur Koordinaten TEXTURE_COORDINATE_3 3D Textur Koordinaten bitweisesOR
Inhalt programmieren GeometryArray Klassen Schritt 2 Methoden zum Füllen mit Daten: void setCoordinate(int index, float[] coordinate) void setCoordinate(int index, double[] coordinate) void setCoordinate(int index, Point* coordinate) void setCoordinates(int index, float[] coordinates) void setCoordinates(int index, double[] coordinates) void setCoordinates(int index, Point*[] coordinates) void setColor(int index, float[] color) void setColor(int index, byte[] color) void setColor(int index, Color* color) void setColors(int index, float[] colors) void setColors(int index, byte[] colors) void setColors(int index, Color*[] colors)
Inhalt programmieren GeometryArray Klassen Schritt 2 Methoden zum Füllen mit Daten: void setNormal(int index, float[] normal) void setNormal(int index, Vector* normal) void setNormals(int index, float[] normals) void setNormals(int index, Vector*[] normals) void setTextureCoordinate(int index, float[] texCoord) void setTextureCoordinate(int index, Point* coordinate) void setTextureCoordinates(int index, float[] texCoords) void setTextureCoordinates(int index, Point*[] texCoords)
Inhalt programmieren GeometryArray Klassen Schritt 3 Objekt mit zugehörigem Shape3D Objekt assoziieren axisBG.addChild(new Shape3D(<GeometryArray Objekt>)); Unter-Klassen von GeometryArray
Inhalt programmieren Unter-Klassen von GeometryArray Unterschiedliche Verbindung der Vertizes: „quadrilaterals“: Vorsicht: muss konvex, planare, ohne Selbstüberschneidung
Inhalt programmieren Unter-Klassen von GeometryStripArray Streifen = z.B. die 4 Flächen beim Jojo Unterschiedliche Verbindung der Vertizes: (für Linien im 3dim) Wie geht‘s hier weiter ? (Wie wird v5 verbunden?) Konstruktor Beispiel (TriangleStripArray, TriangleFanArray genauso) LineStripArray(int vtxCount, int vertexFormat, int stripVertexCounts[]) Zahl der Vertizes für einen Strip. Summe der stripVertexCounts = vtxCount !
Inhalt programmieren stripVertexCounts[] : die nächste Anzahl (stripVertexCounts[i]) gehört zu einer Fläche. Die Rand Vertizes müssen wieder auftauchen. stripVertexCounts[] v1 3 v2 6 v3 3 v4 v5 v6 v7 v8 v9 v10 v11 v12
Inhalt programmieren Ein Jojo kann mit TriangleFanArray erzeugt werden 4 Flächen mit je einem Zentralpunkt Pro Fläche 18 Vertizes, d.h. stripVertexCounts = {18,18,18,18} setCoordinates(0, coords) Ordnung in coords: Zentralpunkt, 17 übrige Punkte, Zentralpunkt, 17 übrige Punkte u.s.w. In Java3D keine gefüllten Primitive mit mehr als 4 Seiten ! -> Verwendung von z.B. der Triangulater utility Klasse um komplexe Polygone in Dreiecke bzw. Fächer (Fans) zu zerlegen
Inhalt programmieren Mehrfachverwendung von Vertizes IndexedXXArray (int vtxCount, int vtxFormat, int indexCount) IndexedXXStripArray(int vtxCount, int vtxFormat, int stripVtxCounts[], int indexCount) - Performanz schlechter - Berechnung der Normalen
Inhalt programmieren Das Erscheingunsbild („Appearance“) Geometry genügt nicht, um das vollständige Aussehen des visual object zufriedenstellend zu beschreiben Shape3D kann noch ein Appearance Objekt referenzieren Appearance Objekt „bündelt“ die Erscheinungsinformationen
Inhalt programmieren Das Erscheingunsbild („Appearance“) Attribut Klassen, die die Erscheinung eigentlich beschreiben: . PointAttributes . LineAttributes . PolygonAttributes . ColoringAttributes . TransparencyAttributes . RenderingAttributes . Material . TextureAttributes . Texture . TexCoordGeneration So wird „gebündelt“: ColoringAttributes ca = new ColoringAttributes(); ca.setColor (1.0, 1.0, 0.0); Appearance app = new Appearance(); app.setColoringAttributes(ca); Aliasing Polygon: culling(2.4.6.), stitching Rendering Attributes: hidden surface removal
Inhalt programmieren Weiterer interessante Punkte Kapitel 2 Aliasing Polygon: culling(2.4.6.), stitching Rendering Attributes: hidden surface removal twisted Strip Back Face Culling Exercises