5.7 KiB
5.7 KiB
Computer Grafik 1 - Gruppe Purple
Mitglieder
Luca {
Wresch,
Conte
};
Jonas {
Dillmann,
Niewidok
};
Finn {
Wolters
};
Bauen, Starten und Bedienen des Programms
$ cd src
$ make run
Bedienung über Keyboard :D
- WASD für freie Kamerabewegung
- R & F oder Shift + Leertaste: Kamera Hoch & Runter bewegen
- 1,2,3,4,5,6 für Verschiedene Kamerapositionen
- 1: Vor den Tafeln
- 2-4: Verschiedene Sitzplätze
- 5: Vogelperspektive
- 6: Close-Up vom Normal Map Demo Cube
- X & C: Tafel Hoch & Runter schieben
- ESC: Programm schließen
weitere Infos
- Alle Objekte werden durch eine Scene Graph Datei (.scg) mit selbst entwickelter Syntax definiert und platziert.
Erklärung der Scene Graph Syntax:
# Mit einem # beginnende Zeilen sind Kommentare
# Definition eines Models
# Jedem Model muss eine einzigartige ID gegeben werden
model 0
# Angabe der OBJ Datei, aus der die Modelldaten eingelesen werden
# Alle Dateipfade sollten absolut sein oder ralativ zum working directory
file myObjFile.obj
# Angabe einer Textur Datei
texture myTexture.jpg
# Angabe einer zweiten Textur Datei. Diese wird über die erste gelegt
texture2 mySecondTexture.png
# Angabe einer Normal Map
normal myNormalMap.png
# Angabe des Shininess Wertes des Models
shininess 10.0
# Objekte sind Scene Graph Nodes.
# Auch sie brauchen eine einzigartige ID
# Diese ID muss nur unter den Objekten einzigartig sein
# Ein Objekt kann also die selbe ID haben wie ein Model
obj 102
# Angabe des Modells, das das Objekt nutzt.
# Diese Angabe ist optional. Sie kann weggelassen werden, wenn es sich z.B. um ein Group Objekt handelt
# Hier wird die vorher gesetzte Model ID referenziert
use 0
# Angabe des Parent Nodes mittels Objekt ID
# Diese Angabe ist optional. Wenn kein Parent Node angegeben ist, wird automatisch der root node (ID: -1) als parent gesetzt
parent 101
# Angabe eines Namen
# Optional. Kann im Code verwendet werden um den Scene Graph nach diesem Objekt zu durchsuchen.
# Für diesen Zweck kann aber auch die Objekt ID genutzt werden.
# Beim Printen des Scene Graph (s. Konsolenausgabe bei Programmstart) wird der Name geprintet
# Ist keine Name gesetzt, wird stattdessen die Objekt ID geprintet
name MeinObjekt
# Transformationen
# Die Transformationen werden in der Reihenfolge ausgeführt, in der sie angegeben wurden
# Transformationen propagieren auf jegliche Child Elemente weiter
translate 1.0 0.0 0.0
scale 1.0 1.5 0.5
rotateX 1.0
rotateY 3.141
rotateZ 0.1
# Beispiel
model 0
file sphere.obj
texture sun.jpg
model 1
file sphere.obj
texture earth.png
model 2
file sphere.obj
texture moon.png
normal moon-normal.png
obj 0
name Sonnensystem
obj 1
use 0
name Sonne
parent 0
scale 2.0 2.0 2.0
obj 2
use 1
name Erde
parent 0
translate 5.0 0.0 0.0
obj 3
use 2
name Mond
parent 2
scale 0.2 0.2 0.2
translate 0.0 0.0 2.0
- es befinden sich zwei Punkt-Lichtquellen im Raum die sich langsam im Kreis umeinander drehen
- die Zwei fliegenden Würfel befinden sich zur Veranschaulichung an den Positionen dieser Lichtquellen
- Die Box neben dem Lehrerpult ist dort um Normal Maps zu demonstrieren. 6 Drücken für Close-Up Ansicht. Am besten ist der Effekt in der Spekularreflektion sichtbar. Einfach kurz warten bis das Lich im richtigen Winkel darüber fliegt
- Die Tafeln nutzen 2 übereinandergelegte Texturen: Eine für die Tafel selbst, und eine für den darauf geschriebenen Text
- Alle Objekte der Szene wurden in Blender erstellt und importiert
- Texturen der Objekte wurden aus dem Internet Importiert, selbst erstellt, oder bestehen aus realen Fotos
- Alle Objekte wurden einzeln UV-Mapped (ist eine ziemliche Drecksarbeit) - dazu wurden außerdem teilweise Texturen gemerged, damit besseres UV-Mapping möglich war
- Bis auf wenige Ausnahmen wurden alle Objekte möglichst Wahrheitsgetreu modelliert und haben einen 1:1 Maßstab
- Die Stuhlreihen wurde einfachheitshalber nicht wie im Vorlesungssaal gekrümmt sondern sind gerade dargestellt.
TODO LIST
- README-Datei mit Informationen zum Bauen, zum Starten und zur Bedienung des Programms
- Matrixfunktionen zur Umsetzung der benötigten Transformationen (Verschiebung, Drehung, Skalierung, Position und Orientierung der Kamera, Perspektivprojektion, Normalenmatrix)
- mehrere Objekte in einer 3D-Szene
- Animation der Kamera und/oder eines Objekts
- Beleuchtung der Szene, wie in der Vorlesung beschrieben
- Texturierung von mindestens einem Objekt
Wenn ihr nicht nur bestehen sondern auch eine gute Note bekommen möchtet, müsst ihr auch möglichst viele der folgenden Anforderungen erfüllen:
- Import von Geometriedaten aus separaten Dateien
- sinnvolle Aufteilung des Codes auf mehrere Dateien (insb. Shader-Code in separaten Dateien)
- Datentypen und Hilfsfunktionen für Shader, Geometriedaten, Texturen
- Überprüfung übergebener Funktionsparameter durch Assertions (soweit möglich)
- Tests für alle Matrixfunktionen
- Strukturierung der Szene durch einen einfachen Szenengraph
- einfache Benutzerinteraktion mit Kamera und/oder Objekten (z. B. über Tastatur)
- Beleuchtung der Szene mit mehr als einer Lichtquelle
- gleichzeitige Verwendung von mindestens zwei Texturen in einem Objekt
- gleichzeitige Verwendung von mindestens zwei verschiedenen Shader-Programmen in einer Szene
- transparente Objekte
- Verwendung einer Umgebungstextur
- [?] Spiegelung der Umgebungstextur auf einigen Objekten
- Nebel in einer komplexen 3D-Szene
Für eine besonders gute Note ist die Umsetzung mindestens einer fortgeschrittenen Technik erforderlich, die nicht in der obigen Liste genannt wird und für die ihr die notwendigen Details selbst recherchieren müsst.
Weitere Bewertungskriterien sind Code-Qualität, Projektidee und Ästhetik.