Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

© Prof. Dr. H. Gläser, Graphische Datenverarbeitung Leichtere Programmierung von Inhalt Geometrie Programmierung beginnend bei 0 ist sehr aufwendig Möglichkeit.

Ähnliche Präsentationen


Präsentation zum Thema: "© Prof. Dr. H. Gläser, Graphische Datenverarbeitung Leichtere Programmierung von Inhalt Geometrie Programmierung beginnend bei 0 ist sehr aufwendig Möglichkeit."—  Präsentation transkript:

1 © Prof. Dr. H. Gläser, Graphische Datenverarbeitung Leichtere Programmierung von Inhalt Geometrie Programmierung beginnend bei 0 ist sehr aufwendig Möglichkeit Geometrien von 3D Software (CAD Programme) einzulesen Neue Loader werden gesammelt bei

2 © Prof. Dr. H. Gläser, Graphische Datenverarbeitung Leichtere Programmierung von Inhalt 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

3 © Prof. Dr. H. Gläser, Graphische Datenverarbeitung Leichtere Programmierung von Inhalt 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

4 © Prof. Dr. H. Gläser, Graphische Datenverarbeitung Leichtere Programmierung von Inhalt Die Klasse GeometryInfo Paket: com.sun.j3d.utils.geometry Konstruktor: GeometryInfo(int primitive) primitive = POLYGON_ARRAY QUAD_ARRAY TRIANGLE_ARRAY TRIANGLE_FAN_ARRAY TRIANGLE_STRIP_ARRAY (nicht planar etc.) (Dreiecke unabhängig) Methoden: 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) ?? Indexverwaltung

5 © Prof. Dr. H. Gläser, Graphische Datenverarbeitung Leichtere Programmierung von Inhalt Performanzverbesserung: Stripifier Objekt wandelt Dreiecke zu Dreiecksstreifen Schattierung: es werden Flächennormale gebraucht: NormalGenerator Polygone dürfen nicht planar, konkav und löchrig sein. Triangulator wandelt komplex Polygone in isolierte Dreiecke um

6 © Prof. Dr. H. Gläser, Graphische Datenverarbeitung Leichtere Programmierung von Inhalt Konstruktor: Triangulator() Der Triangulator Methode: void triangulate(GeometryInfo ginfo) (Umwandlung mit Polygon Zerlegungstechniken)

7 © Prof. Dr. H. Gläser, Graphische Datenverarbeitung Leichtere Programmierung von Inhalt Konstruktor: Stripifier() Der Streifenmacher Methode: void stripify(GeometryInfo ginfo) (Normalenberechnung sollte vorher stattfinden)

8 © Prof. Dr. H. Gläser, Graphische Datenverarbeitung Leichtere Programmierung von Inhalt Konstruktor: NormalGenerator(double radians) Der Normalen Berechner In Index Arrays kommt Vertex mehrfach vor: Vertex gehört gleichzeitig zu verschiedenen Flächen -> zwei Normale gehören zum Vertex, Vertex liegt auf Kante Winkel zwischen zwei Dreiecksnormalen > Knick Winkel Methode: void generateNormals(GeometryInfo gi) sonst wird der Knick flachgeklopft d.h. nur eine Normale (Mittelwert)

9 © Prof. Dr. H. Gläser, Graphische Datenverarbeitung Leichtere Programmierung von Inhalt Anwenden der Utility Klassen 1. GeometryInfo gi = new GeometryInfo( GeometryInfo.POLYGON_ARRAY); 2. gi.setCoordinates(coordinateData); 3. gi.setStripCounts(stripCounts); Triangulator tr = new Triangulator(); 6. tr.triangulate(gi); NormalGenerator ng = new NormalGenerator(); 9. ng.generateNormals(gi); Stripifier st = new Stripifier(); 12. st.stripify(gi); Shape3D part = new Shape3D(); 15. part.setAppearance(appearance); 16. part.setGeometry(gi.getGeometryArray()); GeometryInfo Triangulator Stripifier NormalGenerator

10 © Prof. Dr. H. Gläser, Graphische Datenverarbeitung Leichtere Programmierung von Inhalt Text2d = (transparentes) Polygon + Textur Unterklasse von Shape3D Text2D text2D = new Text2D("2D text is a textured polygon", new Color3f(0.9f, 1.0f, 1.0f), "Helvetica", 18, Font.ITALIC)); Appearance app = text2DObject.getAppearance(); app.setPolygonAttributes(polyAttrib); Manipulationen am Polygon Text - Textur anwendbar auf beliebige visual objects java.awt.font com.sun.j3d.utils.geometry.Text2d Pakete:

11 © Prof. Dr. H. Gläser, Graphische Datenverarbeitung Leichtere Programmierung von Inhalt 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

12 © Prof. Dr. H. Gläser, Graphische Datenverarbeitung Leichtere Programmierung von Inhalt Hintergrund Farbe Bild Geometrie 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 setGeometry(BranchGroup bg) setImage(ImageComponent2D img) setColor(Color3f clr)

13 © Prof. Dr. H. Gläser, Graphische Datenverarbeitung Leichtere Programmierung von Inhalt 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

14 © Prof. Dr. H. Gläser, Graphische Datenverarbeitung Leichtere Programmierung von Inhalt Aktivierungsbereich Scene Graph: Konstruktor: BoundingLeaf(Bounds region)

15 © Prof. Dr. H. Gläser, Graphische Datenverarbeitung Leichtere Programmierung von Inhalt 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

16 © Prof. Dr. H. Gläser, Graphische Datenverarbeitung Leichtere Programmierung von Inhalt Jedes von SceneGraphObject abgeleitete Objekt, kann Benutzer Daten mit folgenden Methoden speichern: Object getUserData() void setUserData(Object userData) Anwendungen ?


Herunterladen ppt "© Prof. Dr. H. Gläser, Graphische Datenverarbeitung Leichtere Programmierung von Inhalt Geometrie Programmierung beginnend bei 0 ist sehr aufwendig Möglichkeit."

Ähnliche Präsentationen


Google-Anzeigen