Geometrie Programmierung beginnend bei 0 ist sehr aufwendig Möglichkeit Geometrien von 3D Software (CAD Programme) einzulesen Neue Loader werden gesammelt bei www.Java3D.org
Laden von 3D Dateien in unterschiedlichen Formaten 0. loader suchen (Web) 1. importieren der loader Klasse 2. importieren weiterer notwendiger Klassen 3. deklarieren einer scene Variablen (nicht den Konstruktor benutzen) 4. erzeugen eines loader Objekts 5. laden des Files und zuweisen zu der scene Variablen 6. einsetzten von scene in den scene graph weiteres zu Loader erst mal ausgelassen
Die Klasse GeometryInfo Kein Loader ? - 3D Daten müssen eigentlich als Dreiecke oder Quadrilaterals eingegeben werden Möglichkeit kompliziertere Polygone einzugeben (nicht planar, konkav, Löcher) Dient als Grundlage für Utility Klassen Enthalten sind Informationen über: Vertizes Farben Normale StripCounts ContourCounts Textur Koordinaten
Die Klasse GeometryInfo Paket: com.sun.j3d.utils.geometry Konstruktor: GeometryInfo(int primitive) (nicht planar etc.) primitive = POLYGON_ARRAY QUAD_ARRAY (Dreiecke unabhängig) TRIANGLE_ARRAY TRIANGLE_FAN_ARRAY TRIANGLE_STRIP_ARRAY Methoden: Indexverwaltung void setColors(Color3f[] colors) void setColorIndices(int[] colorIndices) ?? void setContourCounts(int[] contourCounts)??? void setCoordinates(Point3d[] coordinates) void setCoordinateIndices(int[] coordinateIndices) void setNormals(Vector3f[] normals) void setNormalIndices(int[] normalIndices) ?? void setStripCounts(int[] stripCounts) void setTextureCoordinates(Point2f[] texCoords) void setTextureCoordinateIndices(int[] texCoordIndices) ??
Polygone dürfen nicht planar, konkav und löchrig sein. Triangulator wandelt komplex Polygone in isolierte Dreiecke um Performanzverbesserung: Stripifier Objekt wandelt Dreiecke zu Dreiecksstreifen Schattierung: es werden Flächennormale gebraucht: NormalGenerator
(Umwandlung mit Polygon Zerlegungstechniken) Der „Triangulator“ Konstruktor: Triangulator() Methode: void triangulate(GeometryInfo ginfo) (Umwandlung mit Polygon Zerlegungstechniken)
(Normalenberechnung sollte vorher stattfinden) Der Streifenmacher Konstruktor: Stripifier() Methode: void stripify(GeometryInfo ginfo) (Normalenberechnung sollte vorher stattfinden)
Der Normalen Berechner Konstruktor: NormalGenerator(double radians) Methode: void generateNormals(GeometryInfo gi) In Index Arrays kommt Vertex mehrfach vor: Winkel zwischen zwei Dreiecksnormalen > Knick Winkel Vertex gehört gleichzeitig zu verschiedenen Flächen -> zwei Normale gehören zum Vertex, Vertex liegt auf Kante sonst wird der Knick „flachgeklopft“ d.h. nur eine Normale (Mittelwert)
Anwenden der Utility Klassen Triangulator 1. GeometryInfo gi = new GeometryInfo( GeometryInfo.POLYGON_ARRAY); 2. gi.setCoordinates(coordinateData); 3. gi.setStripCounts(stripCounts); 4. 5. Triangulator tr = new Triangulator(); 6. tr.triangulate(gi); 7. 8. NormalGenerator ng = new NormalGenerator(); 9. ng.generateNormals(gi); 10. 11. Stripifier st = new Stripifier(); 12. st.stripify(gi); 13. 14. Shape3D part = new Shape3D(); 15. part.setAppearance(appearance); 16. part.setGeometry(gi.getGeometryArray()); NormalGenerator Stripifier GeometryInfo
= (transparentes) Polygon + Textur Text2d = (transparentes) Polygon + Textur Unterklasse von Shape3D Pakete: java.awt.font com.sun.j3d.utils.geometry.Text2d Text2D text2D = new Text2D("2D text is a textured polygon", new Color3f(0.9f, 1.0f, 1.0f), "Helvetica", 18, Font.ITALIC)); Manipulationen am Polygon Appearance app = text2DObject.getAppearance(); app.setPolygonAttributes(polyAttrib); Text - Textur anwendbar auf beliebige visual objects
Text3D Text3d = „Ausziehen“ des Fonts Unterklasse von Geometry Font3D Objekt wird benötigt Font3D font3d = new Font3D(new Font("Helvetica", Font.PLAIN, 10), new FontExtrusion()); Text3D textGeom = new Text3D(font3d, new String("3DText"), new Point3f(2.0f, 0.0f, 0.0f)); Position
- Geometrie wird auf eine Einheitskugel abgebildet und Hintergrund Geometrie Bild setGeometry(BranchGroup bg) Farbe setImage(ImageComponent2D img) setColor(Color3f clr) Background backg = new Background(); //black background backg.setGeometry(createBackGraph()); // add BranchGroup of background backg.setApplicationBounds(new BoundingSphere( new Point3d(), 100.0)); objRoot.addChild(backg); - Geometrie wird auf eine Einheitskugel abgebildet und beim Zeichnen auf unendlich gesetzt - Mehrere Backgrounds möglich
Aktivierungsbereich Beispiel: eine feste Lichtquelle beleuchtet sich bewegende Objekte Wie weit ist der Aktivierungsbereich (Bounds Objekt) des Lichts auszudehnen ? 1. Möglichkeit: alle möglichen Orte der Objekte einschließen - zu groß 2. Möglichkeit: Aktivierungsbereich des Lichts an die beweglichen Objekte anschließen, unabhängig von (dem Ort der) Lichtquelle. Was spricht gegen ein Bounds Objekt für diesen Zweck ? Ein Bounds Objekt würde sich nur mit der Lichtquelle bewegen -> neue Klasse: BoundingLeaf
Aktivierungsbereich Scene Graph: Konstruktor: BoundingLeaf(Bounds region)
BoundingLeaf an eine ViewingPlatform angehängt -> trifft immer zu (z.B. für Amaturenbrett im Flugsimulator) void createSceneGraph (SimpleUniverse su) { BoundingLeaf boundingLeaf = new BoundingLeaf(); PlatformGeometry platformGeom = new PlatformGeometry(); platformGeom.addChild(boundingLeaf); platformGeom.compile(); simpleUniv.getViewingPlatform().setPlatformGeometry (platformGeom); BranchGroup contentRoot = new BranchGroup(); Background backg = new Background(1.0f, 1.0f, 1.0f); backg.setApplicationBoundingLeaf(boundingLeaf); contentRoot.addChild(backg); bewirkt immer gleichen Hintergrund
Jedes von SceneGraphObject abgeleitete Objekt, kann Benutzer Daten mit folgenden Methoden speichern: void setUserData(Object userData) Object getUserData() Anwendungen ?