CGExercises

CG Exercise #04

Computergraphik √úbungsblatt #04


Blender Tutorial: Animation & Rendering



OpenGL: Erstes eigenes Programm


TeilVideos des WS 2021/22Thema
OpenGL 3.5 & 3.6YTArbeiten mit qt_template

Aufgabe 4.1: Linien zeichnen (CMake)


Linien mit OpenGL

√Ėffnen Sie ein Terminal Fenster und navigieren Sie mittels cd in das “qt_template” Verzeichnis des glVertex Frameworks, welches Sie in √úbung #01 installiert haben.

√úbersetzen Sie die Programmiervorlage und starten Sie sie:

cmake . && make && ./qt_template

Sie sollten nun ein (fast) leeres Fenster sehen. Dies ist der Startpunkt f√ľr die ersten OpenGL Befehle im ersten eigenen OpenGL Programm:

  1. Verwenden Sie einen Plain-Text-Editor wie den Emacs o.ä., um das Programm qt_template.cpp zu verändern.
  2. Zeichnen Sie eine einzelne Linie, wie in der Vorlage bereits als Kommentar vorgeschlagen.
  3. Zeichnen Sie eine weitere Linie, so dass ein Kreuz entsteht.
  4. √Ąndern Sie die Hintergrundfarbe auf Himmelblau.
  5. Entlang welcher Achse schaut der Betrachter?
  6. Welche zwei Achsen definieren die Bildebene?

Materialien:

Aufgabe 4.2: Dreiecke zeichnen (Qt Creator)


Farbige Dreiecke mit OpenGL

√Ėffnen Sie nun dasselbe Programm nicht vom Terminal aus, sondern mit Hilfe von QtCreator. Dazu doppel-klicken Sie auf die .pro-Datei im Verzeichnis “qt_template”. F√ľhren Sie das Programm nun in QtCreator aus, indem Sie auf den gr√ľnen Pfeil klicken.

Sie sollten nun dieselbe Darstellung wie in der vorhergehenden Aufgabe sehen, und k√∂nnen weitere OpenGL Befehle hinzuf√ľgen:

  1. Zeichnen Sie wie in der Vorlesung ein weißes Dreieck.
  2. Zeichnen Sie wie in der Vorlesung ein farbiges Dreieck mit unterschiedlichen Farb-Attributen f√ľr jeden Vertex.
  3. Zeichnen Sie ein weiteres Dreieck, welches sich mit dem ersten schneidet.

Hinweis: QtCreator ist die empfohlene Entwicklungsumgebung f√ľr Linux, im Notfall kann man aber auch auf die Kommandozeile (via CMake & Emacs) wie in der vorherigen Aufgabe ausweichen.


Exported Mesh
as Alias WaveFront OBJ

Blend File
CC-BY DarkLimits Studios
modified for Eevee
by A. Kalisz

Aufgabe 4.3: Blender Geometrie laden

TeilVideos des WS 2021/22Thema
OBJsYTGeometrie importieren bzw laden

Es w√§re doch sch√∂n, ein eigenes graphisches Objekt f√ľr OpenGL zu verwenden anstelle von langweiligen Dreiecken. Dazu k√∂nnen Sie Ihr aktuelles Objekt in Blender im Alias WaveFront-Format (.obj) exportieren.

Beim Export sollten die folgenden Optionen ausgewählt sein:

  • Faces/Mesh triangulieren
  • Normalen schreiben
  • UV-Koordinaten schreiben
  • Modfier anwenden (z.B. Subdivision Surface)

Beim Export sollten die folgenden Optionen NICHT ausgewählt sein:

  • Materialeigenschaften schreiben
  • Nur ausgew√§hltes Objekt schreiben

Laden Sie nun Ihr eigenes exportiertes Objekt mit der OpenGL-Programmiervorlage im Verzeichnis “qt_template”. Alternativ k√∂nnen Sie auch die Obj-Datei des oben abgebildeten Elefanten verwenden. Ihre exportierte Obj-Datei muss im selben Verzeichnis liegen. Dann laden Sie die Obj-Datei mit lglLoadObj(“filename”) in initializeOpenGL():

vbo = lglLoadObj("teapot.obj");

Dazu benötigen Sie eine entsprechende Instanzvariable vom Typ lglVBO* mit Namen vbo.

Testen Sie nun, ob die Datei korrekt geladen wurde, indem Sie √ľberpr√ľfen, ob die Instanzvariable einen NULL Zeiger enth√§lt und brechen Sie das Programm in diesem Fall ab → exit(1).

Geben Sie weiterhin die Abmessungen Ihres Objektes aus, welche Sie mit der Methode lglGetExtent() erhalten (Ausgabe via operator <<).

Das geladene Objekt wird nun mit der Methode lglRender(vbo) in renderOpenGL() gezeichnet.

Es kann sein, dass die Abmessungen des Objektes zu gro√ü sind, so dass Sie es erst skalieren m√ľssen, um es sinnvoll rendern zu k√∂nnen. Verwenden Sie dazu den Befehl lglScale() in initializeOpenGL(). Der Teapot (Datei “teapot.obj”) muss z.B. mit dem Faktor 0.01 skaliert werden.

Aufgabe 4.4: OpenGL State Machine


OpenGL Cheat Sheet

Verändern Sie die Darstellung, indem Sie verschiedene Effekte durch Parametereinstellungen der OpenGL State Machine anschalten:

Orthographische Projektion:

Ihr Objekt wird noch verzerrt dargestellt, weil keine Projektion definiert ist. Verwenden Sie die folgende orthographische Projektion analog zu glOrtho (siehe auch OpenGL Cheat Sheet und OpenGL Programming Guide):

lglProjection(-1, 1, -1, 1, -1, 1)

Ihr Objekt wird nun immer noch verzerrt dargestellt, weil das Seitenverh√§ltnis (aspect ratio) noch nicht ber√ľcksichtigt wird. Das Seitenverh√§ltnis berechnet sich zu aspect = (float)width()/height(). An welchen zwei Stellen in obiger Projektion muss das Seitenverh√§ltnis anstelle einer 1 verwendet werden?

Z-Buffer:

Schalten Sie testweise den Z-Buffer aus. Welchen lgl-Befehl bzw. welche Taste benötigen Sie dazu?

Optional: Wireframe Darstellung:

Stellen Sie Ihr Objekt im sog. Wireframe-Modus dar. Welchen lgl-Befehl benötigen Sie dazu?

Optional: Obj-Datei animieren:

Animieren Sie Ihr Objekt, indem Sie es rotieren lassen. Verwenden Sie dazu den Befehl lglRotate(). Um wieviel Grad m√ľssen Sie das Objekt f√ľr jeden Frame rotieren, wenn Sie 30 fps annehmen und eine volle Umdrehung alle 3 Sekunden stattfinden soll?


Hausaufgaben bis zum f√ľnften Praktikum


Musterlösung: Bitte stellen Sie Ihre Musterlösung aus dem Praktikum kurz vor.

1. Matrizen:

  1. Rotation und Translation:
    In der Vorlesung haben wir beispielhaft mit einer Transformationsmatrix einen 3D Vektor transformiert. Die Transformation bestand aus einer Rotation und einer nachfolgenden Translation. Wie nennen wir so eine Transformation?
  2. Wie sieht diese Matrix konkret aus, d.h. aus welchen Teilmatrizen ist diese aufgebaut? Erklären Sie diese Bestandteile der Matrix!
  3. Berechnen Sie die 4×4 Modellierungs-Matrix $M_M$, welche eine Rotation um 180 Grad um die Y-Achse und eine anschlie√üende Translation um den Vektor (0,0,−5) repr√§sentiert.
  4. Viewing-Transformation:
    Berechnen Sie die View-Matrix $M_V$ einer Kamera, die an der Position (0,0,−10) steht und entlang der positiven Z-Achse schaut. Hinweis: Die Viewing-Transformation ist die Inverse der Modellierungstransformation der Kamera! Standardm√§√üig schaut die Kamera in OpenGL entlang der negativen Z-Achse!

2. Animation:

  1. Zeichnen Sie mit dem OpenGL-Framework einen Einheitsw√ľrfel, der aus 6 verschiedenfarbigen LGL_QUADs besteht.
  2. Als nächstes soll dieser mit der Winkelgeschwindigkeit $\omega=30$ rotieren. Verwenden Sie den Funktionsparameter dt als $\Delta t$. Eine Objektrotation erreicht man mit lglRotate.

3. Optionale Animationen:

  1. Verschieben Sie Ihr Objekt, indem Sie es mit einer H√∂he $h$ translieren (mittels lglTranslate). Achtung: vergessen Sie nicht, die Verschiebung des letzten Frames am Anfang des n√§chsten Frames mit lglLoadIdentity() wieder r√ľckg√§ngig zu machen.
  2. Versuchen Sie, Ihr Objekt zus√§tzlich zur Rotation h√ľpfen zu lassen, indem Sie mit der H√∂he $h$ translieren und die H√∂he $h$ und die Fallgeschwindigkeit $v$ in jedem Frame anpassen:
    1. $v := v+G\Delta t$ mit $G=-9.81\frac{m}{s^2}$
    2. $h := h+v\Delta t$
    3. $v := -v$ f√ľr $h<0$

Options: