Java3DTM und Direct3D® Gegenüberstellung von Direct3D und Java3D am praktischen Beispiel Florian Heidinger 3D-APIs der 1997 Java3D 3. Generation 90er Jahre Direct3D, OpenGL Java3DTM und Direct3D® Treffen der Generationen 3D-API der 4. Generation Florian Heidinger Java3DTM und Direct3D® Kein altes Eisen: die 3. Generation Entwickelt durch Microsoft als Bestandteil von DirectX Lauffähig nur unter WindowsBetriebssystemen Low-Level-API Hardwarebeschleunigung und Emulation Direct3D Laufzeitumgebung ist Bestandteil des Betriebsyst. COM-Objekte und Schnittstellen Florian Heidinger Programmiersprachen: C/C++, MS Java, VisualBasic Hardwaretransparenz (aus Sicht des Anwendungsentwicklers) Vorwiegend prozeduraler Programmaufbau Java3DTM und Direct3D® Ein neuer Stern am Graphik-Himmel Entwickelt durch Unternehmensallianz (Sun, Intel, IBM, Apple) High-Level-API Java3D „Write Once, Run Anywhere“Paradigma Java-Pakete (Packages) und Laufzeitbibliothek Florian Heidinger Programmiersprachen: Java Nutzung einer LowLevel-API zur Durchführung der Zeichenaufträge objektorientierter API- und Szenenaufbau à Szenengraph Java3DTM und Direct3D® Die Architektur verbindet Java3D-Anwendung Java3D-Anwendung Java3D Java3D API API Direct3D-Anwendung Direct3D-Anwendung Direct3D Direct3D API API Java Java Virtual Virtual Machine Machine OpenGL OpenGL Hardware Hardware und und Hardware-Treiber Hardware-Treiber Florian Heidinger Java3DTM und Direct3D® Schritte zum Erfolg in Java3D 1. Fenster und Canvas3D-Objekt erzeugen à Darstellungsfläche schaffen und Zeichengerät auswählen bzw. initialisieren 2. Ansichtsgraph erzeugen (SimpleUniverse) à Positionierung und Ausrichtung des Betrachters 3. Inhaltsgraph erzeugen à Definition des Szeneninhaltes 4. Kompilieren der Teilgraphen à Interne optimale Form der Szene bilden 5. Hinzufügen zum „Locale“-Objekt Die meisten der Schritte besitzen Entsprechungen in einer Direct3D-Anwendung Florian Heidinger Java3DTM und Direct3D® Fenster unter Windows mit Java • Nutzung der Klassen des AWT (Abstract Windowing Toolkit), um Fenster zu erzeugen • LayoutManager, um die Darstellungsfläche des Frame in verschiedene Bereiche einzuteilen à Importieren entsprechender AWT- und Layout-Manager Klassen à Erstellen eines Frame-Objekts, dem primäre Fenstereigenschaften wie Breite und Höhe als Konstruktor-Parameter übergeben werden (sekundäre Eigenschaften über SET-Methoden einstellbar) à Instanziierung eines LayoutManager-Objekts à Zuweisen des Layouts über die „setLayout()“-Methode Florian Heidinger Java3DTM und Direct3D® Fenster unter Windows in Direct3D • Aufrufe gegen die Windows-API (Win32-API), um ein geeignetes Fenster zu erzeugen à Inkludieren der „windows.h“-Headerdatei (Struktur-, Konstanten- und Methodendefinitionen) • Drei Schritte: 1. Fensterobjekt (Schablone) für neue Fenster (WNDCLASSEX-Struktur) definieren und mit Werten füllen = sekundäre Fenstereigenschaften festlegen 2. Fensterobjekt bei Windows registrieren 3. Fenster durch Aufruf von „CreateWindowEx()“ erzeugen (Parameter sind primäre Fenstereigenschaften, sowie der Name des Fensterobjekts) à Keine LayoutManager unter Windows Florian Heidinger Java3DTM und Direct3D® Canvas3D eine mysteriöse Klasse • Erzeugen eines Canvas3D-Objektes mit Hilfe eines der beiden Konstruktoren • Hinzufügen zur Darstellungsfläche des Fensters durch „add“Methode à Java 3D Implementierung initialisiert die Low-Level API, um Canvas3D Darstellungsfläche zu schaffen: – DoubleBuffer und Z-Buffer – 16 Bit-Farbtiefe (True-Color) – Viewport entsprechend der Größe des Layoutbereichs in Pixeln • Definition einer perspektivische Projektion Florian Heidinger Java3DTM und Direct3D® Initialisieren von Direct3D DIRECT3D8 DIRECT3D8 COM-System Direct3DCreate8() DIRECT3D8 DIRECT3D8 LPDIRECT3D8 LPDIRECT3D8 CreateDevice() DIRECT3DDIRECT3DDEVICE8 DEVICE8 LPDIRECT3DLPDIRECT3DDEVICE8 DEVICE8 Florian Heidinger Java3DTM und Direct3D® Ansichtsgraph in Java3D • Benutzerposition und Blickrichtung • Verwendung des „SimpleUniverse“ mit Positionierung des Benutzers im Punkt (0.0, 0.0, 2.41) und Blickrichtung in negative Z-Richtung à Standard-Ansichtstransformation • Animation der Benutzerposition durch eine erweiterte Welttransformation à World-View-Matrix (Behaviors werden in der Regel Transformationsgruppen im Inhaltsgraphen zugeordnet) – Rotationen um gleiche Achse und Winkel, jedoch in entgegengesetzter Rotationsrichtung – Translationen mit entgegengesetzt gerichtetem Vektor – Transformation mit allen Weltmatrizen der Szenenobjekte nach dem LIFO-Prinzip multiplizieren Florian Heidinger Java3DTM und Direct3D® Direct3D-Rendering Pipeline VertexBuffer VertexBuffer Welttransformation Welttransformation Ansichtstransformation Ansichtstransformation Vertex-Shader Projektionstransformation Projektionstransformation VertexAssembly-Prozess VertexAssembly-Prozess Farbe, Farbe, TexturkoorTexturkoordinaten, dinaten, ... ... Pixel-Shader Pixel-Shader Material, Material, TexturTexturgraphik, graphik, ... ... Alpha, Alpha, Stencil Stencil und und Tiefentests FlorianTiefentests Heidinger FrameFrameBuffer Buffer Java3DTM und Direct3D® Ansichts- und Projektionstransformation in Direct3D • Projektionsmatrix für perspektivische oder orthogonale Projektion mit Hilfe von Bibliotheksfunktionen („D3DXMatrixPerspectiveLH()“) • Konstante Ansichtsmatrix zum Initialisierungszeitpunkt auch hier Nutzung einer Bibliotheksfunktionen „D3DXMatrixLookAtLH()“, mit Angabe des Kamerastandorts, Zielpunkt und Kameralagevektor • DIRECT3DDEVICE8-Objekt ist Bindeglied zwischen Anwendung und Rendering-Pipeline à Zentrale Bedeutung in der Direct3D-Programmierung • Erzeugte Matrizen über „setTransform()“-Methode des DIRECT3DDEVICE8-Objektes in die Rendering-Pipeline einstellen Florian Heidinger Java3DTM und Direct3D® Inhaltsgraph in Java3D Florian Heidinger Java3DTM und Direct3D® Inhaltsdefintion einer Szene in Direct3D • Ablegen von Daten in Strukturen • die Strukturelemente besitzen dabei weitgehende Übereinstimmung mit Klassenvariablen in Java3D, z. B. Material, Lichtquellen, etc. • Vertextformat flexibel (FVF) • Geometriedaten als Strukturarray in VertexBuffer-Objekte speichern • Direct3D verwendet linkshändiges Koordinatensystem à Anpassung der Geometriedaten und / oder Ansichtstransformation ist bei der Ausführung einer Java3D-Anwendung erforderlich Florian Heidinger Java3DTM und Direct3D® Links- und rechtshändiges Koordinatensystem Java3D Java3D (rechtshändiges (rechtshändiges Koordinatensystem) Koordinatensystem) V0 V1 Direct3D Direct3D (linkshändiges (linkshändiges Koordinatensystem) Koordinatensystem) V0 Reihenfolge der Raumpunkte invertieren V2 V2 V1 à Zusätzlich Skalierung der Ansichtstransformationsmatrix um den Faktor –1 in Z-Richtung Florian Heidinger Java3DTM und Direct3D® Kompilieren des Szenengraphen • 1. Zusammenfassung von Transformationsgruppen ohne gesetztes CapabilityBit BG • 2. Kombination von Shape3D-Objekten, die Nachfolger einer gemeinsamen Transformationsgruppe sind und das gleiche Appearance-Objekt referenzieren B Florian Heidinger TG L TG TG G L G S S Appearance • à optimierte interne Form des Szenengraphen Ansichtsgraph Texture2D Material Geometry ColoringAttr. Appearance Texture2D Geometry Material ColoringAttr. Java3DTM und Direct3D® Der Java3D Renderer • Nachdem alle im in der internen Form des Szenengraphen definierten Objekte instanziiert und initialisiert wurden, kann der Java3D Renderer gestartet werden while(true) while(true){{ Benutzereingaben Benutzereingaben verarbeiten verarbeiten IfIf(Anwendungsende) (Anwendungsende) break break Verhalten Verhaltenbearbeiten bearbeiten(Welttrans.) (Welttrans.) Szenengraph Szenengraph traversieren traversieren und und sichtbare sichtbareObjekte Objektean andie dieDirect3D Direct3D API API übergeben übergeben //zeichnen zeichnen }} • „StateOrdered“-Rendering: Zeichenfolge, bei der zwischen den Zeichenvorgängen zweier Objekte möglichst wenige Statusänderungen in der Rendering-Pipeline der Low-Level API durchgeführt werden müssen. Florian Heidinger Java3DTM und Direct3D® Zeichnen der Objekte in Direct3D • Das Zeichnen geschieht in der Hauptschleife der „WinMain“-Methode à ähnliche Struktur, wie der Java3D Renderer • Zunächst Verarbeitung der an das Fenster der Anwendung gerichteten Nachrichten in einer Callback-Prozedur • Falls in einem Durchlauf keine Nachrichten zu verarbeiten sind, kann der eigentliche Zeichenvorgang stattfinden, der dem DIRECT3DDEVICE8-Objekt durch „BeginScene()“ und „EndScene()“ angezeigt wird • Zeichenfolge in Direct3D vollständig durch den Benutzer spezifiziert (vor dem Aufruf der „DrawPrimitive()“-Methode Rendering-Pipeline mit den richtigen Geometriedaten (VertexBuffer), der Welttransformationsmatrix, Textur, Material usw. versorgen) Florian Heidinger Java3DTM und Direct3D® Optimale Zeichenfolge 1. Gruppieren von Objekten mit gleicher Textur à Das Nach- bzw. Umladen von Texturen aus dem Hauptspeicher ist aufwendigste Operation 2. Gruppieren von Objekten mit anderen Texturen aber gleicher Geometrie 3. Gruppieren von Objekten mit anderen Texturen und Geometrien aber gleicher Welttransformation oder gleichem Material à Auf die Beispielanwendung bezogen sollten also z. B. zunächst die Pyramidenseitenflächen beider Pyramiden und erst anschließend die beiden Bodenflächen gezeichnet werden (oder umgekehrt) Florian Heidinger Java3DTM und Direct3D® Aller Anfang ist schwer ! • Komplexe API, die sich dem Einsteiger in die Graphikprogrammierung nur schwer erschließt • Erhöhter zeitlicher Aufwand und mehrfaches an benutzerdefiniertem Programmcode im Vergleich zu OpenGL oder Java3D • Viel Erfahrung erforderlich, um eine annährend optimale Zeichenfolge von geometrischen Objekten zu implementieren • Zahlreiche hilfreiche Funktionen wie Normalen- und Texturkoordinaten-Generatoren fehlen • Bietet dem fortgeschrittenen Benutzer jedoch weitere, von Java3D bis jetzt nicht unterstützte Funktionen wie Multitexturing, Partikeleffekte uvm. an Florian Heidinger Java3DTM und Direct3D® Literatur(1) Java3D: Bouvier, Dennis Subra, Mohan Sun Microsystems, www.j3d.org Florian Heidinger “The Java3D Tutorial” – Kapitel 1-7 (1999) “Java Markets Whitepaper” (1998) “The Java3D API Technical Whitepaper” (1997) “Java 3D API Collateral – 1.2.1 Performance Guide” (2002) “Java 3D Programming: A Technical Overview” (1998) “Java 3D API” Java3DTM und Direct3D® Literatur(2) Direct3D: Dunlop, Robert Microsoft, Zerbst, Stefan Florian Heidinger “Teach Yourself DirectX 7 in 24 Hours” (1998) “DirectX 8.0 Documentation (Visual C++)“ (2000) “3D GraphikProgrammierung und Spiele-Programmierung mit DirectX“ (2002)