Aufgabe 5, Interactive Computer Graphics, SS 2015 Dennis Wiebusch Aufgabe 5: Szenengraph Die Bearbeitung der Übungsaufgaben in Modul ICG verwendet ein minimales OpenGL Framework auf Basis von LWJGL. • ICG Exercise Support Framework: https://www.hci.uni-wuerzburg.de/lectures/ss15/icg/exercises/icg-ss15.zip • Zusatzcode: https://www.hci.uni-wuerzburg.de/lectures/ss15/icg/exercises/rendering.zip Diese Aufgabe beschäftigt sich mit der Verwendung der Mathe-Library aus den vorherigen Übungen. Zu diesem Zweck werden weitere Dateien benötigt, welche unter oben stehendem Link oder alternativ im WueCampus Kurs verfügbar sind. 1 Einführung Nachdem sich die vorherigen Übungen mit der Implementierung grundlegender Funktionen aus der Linearen Algebra sowie dem Zeichnen einfacher Geometrien (Linien und Dreiecke) beschäftigt haben, soll hier eine geeignete Datenstruktur zur Verwaltung dieser Geometrien erstellt werden. Dazu sollen zunächst die Ergebnisse aus den vorherigen Übungen verwendet werden, bevor die Verwendung von OpenGL angegangen wird. Wie in der Vorlesung eingeführt besteht ein Szenengraph aus Knoten und gerichteten Kanten, die auf unterschiedliche Art und Weise implementiert werden können: • Kanten können implizit und explizit dargestellt werden. In erstem Fall enthält jeder Knoten eine Container-Datenstruktur, welche alle Kindknoten zusammenfasst. Eine explizite Darstellung benötigt eine zusätzliche Datenstruktur zur Repräsentation einer Kante, welche die verbundenen Knoten sowie eine Richtung enthält. In diesem Fall würde ein Knoten statt seiner Kindknoten eine Liste aller ausgehenden (und ggf. eingehenden) Kanten enthalten. Vorteile der impliziten Repräsentation sind ein geringerer Implementierungsaufwand sowie höhere Performance, wohingegen die explizite Variante das hinzufügen weiterer Funktionalität (z.B. temporäres deaktivieren einer Kante) erlaubt. 1 Aufgabe 5, Interactive Computer Graphics, SS 2015 Dennis Wiebusch • Knoten können von unterschiedlichem Typ sein (Gruppenknoten, Kameraknoten, Geometrieknoten, ...). Auch hier sind verschiedene Varianten möglich. Beispielsweise können Funktionen direkt in der Knotenklasse implementiert werden (hier ist die Verwendung einer objektorientierten Programmiersprache hilfreich, welche die Erstellung einer Basisklasse mit grundlegender Funktionalität sowie das ableiten weiterer, spezialisierter Klassen erlaubt) oder Traverser verwendet werden, welche den Szenengraph durchlaufen und die jeweilige Funktionalität (z.B. das Rendering) von den Daten trennen. Die kompliziertere Umsetzung einer Traverser-basierten Implementierung hat den Vorteil, dass nachträgliches Austauschen von Funktionalität deutlich vereinfacht wird. So kann zum Beispiel ein OpenGL Traverser durch einen DirectX Traverser ausgetauscht werden, ohne dass die eigentlichen Inhalte des Szenengraphen angepasst werden müssen. 2 Basisimplementierung Wählen sie aus den oben aufgezeigten Möglichkeiten eine Kombination aus und erstellen sie Klassen für verschiedene Knotentypen (zu Beginn mindestens Gruppenknoten und Geometrieknoten). Falls sie sich für eine explizite Kantenrepräsentation entschieden haben erstellen sie auch eine Klasse für Kanten. Die Knotenklassen (bzw. eventuell implementierte Traverser) sollte folgende Basisfunktionalität enthalten: • Zugriff auf Kindknoten • Repräsentation von Transformationen (Matrizen) • später: Zeichnen der Geometrie 3 Test Erstellen sie (im Programmcode) mit Hilfe der Erzeugten Datenstrukturen einen Szenengraphen, welcher eine einfache Szene repräsentiert. Dieser soll weder Geometrien enthalten noch gerendert werden, es geht in dieser Aufgabe ausschließlich um einen Test der Datenstruktur selbst. Der Szenengraph soll (mindestens) drei Knoten enthalten, die miteinander verbunden sind. Der zu erzeugende Graph ist in Abbildung 1 gezeigt: Der Ursprungsknoten soll eine Translation enthalten, der mittlere Knoten eine Rotation und der Blattknoten eine Skalierung. Implementieren sie in der Knotenklasse eine toString(Matrix m) Methode, welche 1. für Gruppenknoten den Namen des Knotens ausgibt und die toString Methode aller Kindknoten aufruft 2 Aufgabe 5, Interactive Computer Graphics, SS 2015 Dennis Wiebusch T R S Abbildung 1: Test Szenengraph 2. für einen Blattknoten die Position des Punkts (1, 0, 0, 1) ausgibt. Dabei ist zu beachten, dass die Matrizen beim traversieren des Graphen multipliziert werden (der Punkt (1, 0, 0, 1) sollte also im Endeffekt mit T ∗ R ∗ S multipliziert werden, bevor das Ergebnis ausgegeben wird). Rufen sie die Funktion für die verschiedenen Knoten im Graphen auf (dazu ist initial die Identitätsmatrix zu übergeben) und überprüfen sie die Ausgaben. 4 Simulation Schreiben sie eine Schleife, welche die Rotationsmatrix des mittleren Knotens in 10 Grad Schritten erhöht (bis 360 Grad) und führen sie jeweils die toString Methode aus der vorherigen Aufgabe aus und beobachten sie die Ergebnisse. Material • ICG Exercise Support Framework, https://www.hci.uni-wuerzburg.de/lectures/ss15/ icg/exercises/icg-exercise-support-docs/ • Lightweight Java Game Library (LWJGL), http://www.lwjgl.org/ 3