Aufgabe 5: Szenengraph 1 Einführung

Werbung
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
Herunterladen