CGExercises

CG Exercise #04

Computergraphik Ãœbungsblatt #04


Blender Tutorial: Animation & Rendering



OpenGL: Erstes eigenes Programm


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 oder Visual Studio Code, 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 welchen Winkel $\Delta\alpha=\omega \cdot \Delta t$ müssen Sie das Objekt in jeden Frame rotieren, wenn Sie 30 fps annehmen und eine volle Umdrehung alle 3 Sekunden stattfinden soll?


Hausaufgaben bis zum nächsten 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=-\frac{1}{6}9.81\frac{m}{s^2}$ (Mond-Gravitation)
    2. $h := h+v\Delta t$
    3. $v := -v$ für $h<0$

Options: