CGExercises

CG Exercise #06

Computergraphik ├ťbungsblatt #06


OpenGL Tutorial: Hierarchische Modellierung



OpenGL: Roboterarm



Verwendete Meshes

Aufgabe 6.1: Roboterarm, Pr├Ąliminarien

Starten Sie mit dem Quelltext robot.cpp.

Dieses Programm zeichnet einen W├╝rfel und eine Kugel, und erlaubt die H├Âhe des W├╝rfels mit Hilfe von Tastendr├╝cken zu ver├Ąndern. Machen Sie sich mit dem Quelltext vertraut, und analysieren Sie ihn.

Materialien:

Aufgabe 6.2: Roboterarm, Grundplatte

Bisher wird ein W├╝rfel und eine Kugel gezeichnet. Jetzt wollen wir aus diesen einfachen graphischen Grundk├Ârpern einen Roboterarm zusammenbauen. Die W├╝rfel werden die Armsegmente, die Kugeln die Gelenke usw. Wie der Arm des Roboters im Raum steht, wird durch die jeweiligen Drehwinkel an den Gelenken (d.h. den Roboterachsen) bestimmt.

Damit wir die einzelnen Elemente unabh├Ąngig voneinander bewegen k├Ânnen, werden wir den Arm mittels hierarchischer Modellierung aufbauen. Und um die einzelnen Elemente besser unterscheiden zu k├Ânnen, benutzen wir verschiedene Farben f├╝r die einzelnen Elemente.


Skalierte Basisplatte

Zeichnen Sie als erstes eine Grundplatte, in deren Mitte der Roboter St├╝ck f├╝r St├╝ck aufgebaut wird. Skalieren Sie also den W├╝rfel mit Hilfe einer Skalierungsmatrix (mat4::scale()) vor allem in der z-Achse so, dass er relativ flach wird.

In der Mitte zeichnen Sie eine Kugel, die das 1. Drehgelenk des anschlie├čenden 1. Armsegments darstellen soll. Daf├╝r ben├Âtigen wir eine ModelView-Matrix f├╝r ein lokales Koordinatensystem, welches in der Mitte der Basisplatte liegt. Alle weiteren lokalen Koordinatensysteme der Armsegmente bauen darauf auf. Diese Matrix berechnen wir daher zuerst und speichern diese in der Variable $MV$.

Dann setzen wir die ModelView-Matrizen vor dem Zeichnen der entsprechenden graphischen Primitve mit Hilfe von lglModelView(), da jedes Primitiv eine andere ModelView-Matrix nutzt. Die Projektions-Matrix ├Ąndert sich nicht, und muss daher auch nicht neu mittels lglProjection() gesetzt werden.


Erstes Segment

Aufgabe 6.3: Roboterarm, Erstes Segment

Zeichnen Sie dann das erste Armsegment. Daf├╝r m├╝ssen Sie aufbauend auf der bisherigen ModelView-Matrix $MV$ weitere Transformationen durchf├╝hren, bevor Sie den n├Ąchsten Quader zeichnen. Sie brauchen daf├╝r kein neues Objekt, Sie k├Ânnen das bereits existierende einfach ein zweites Mal zeichnen. Denken Sie daran, dass die Zeichenroutine das Koordinatensystem in der Mitte des W├╝rfels erwartet, und dass der W├╝rfel die Einheits-Kantenl├Ąnge 1 hat. F├╝r das erste Segment wird der W├╝rfel in der H├Âhe skaliert und um die H├Ąlfte der Arml├Ąnge nach oben transliert.

Zeichnen Sie dann wieder ein Gelenk bzw. eine Kugel. Auch dieses Gelenk muss wieder an die richtige Stelle am Ende des Arms geschoben werden. Verwenden Sie daf├╝r die vorher berechneten Matrizen, die wir bis auf die abschlie├čende Skalierungsmatrix wiederverwenden k├Ânnen, d.h. die ModelView-Matrix des letzten Elements ist wiederum die Basis f├╝r die n├Ąchsten Elemente.

Drehen Sie den Arm um 45 Grad um seine eigene Achse (d.h. die Y-Achse).

Aufgabe 6.4: Lokales Modellierungs-Koordinatensystem

Es ist wichtig, sich zu erinnern, wo sich das jeweilige Koordinatensystem befindet, und welche Achse wohin zeigt - zeichnen Sie daher ein lglCoordSys-Objekt am jeweils oberen Ende des Arms.

Aufgabe 6.5: Rotation per Tastendruck

Erm├Âglichen Sie dem Arm, sich um seine eigene Achse zu drehen, wenn Sie z.B. die Tasten ‘q’ und ‘w’ dr├╝cken. Speichern Sie den Drehwinkel in einer Instanz-Variablen, und benutzen Sie ihn in der renderOpenGL()-Routine, um die ModelView-Matrix entsprechend zu modifizieren.


Roboterarm mit 3 Segmenten

Aufgabe 6.6: Weitere Segmente

Analog zu den vorherigen Schritten bauen Sie nun jeweils abwechslend ein weiteres Gelenk und ein weiteres Armsegment an, um zwei weitere Armsegmente zu realisieren. Diesmal rotieren die Armsegmente an den Gelenken um die X-Achse. Den Winkel stellen Sie mit passenden Tasten ein. Vergessen Sie nicht, eine andere Farbe f├╝r diese Armsegmente zu verwenden.

├ťberpr├╝fen Sie, ob die Winkel der einzelnen Segmente erhalten bleiben, wenn Sie ein fr├╝heres Segment drehen.



Roboterarm mit Greifer

Aufgabe 6.7: Greifer (Optional, Bonuspunkte ++)

Bauen Sie an das letzte Roboterarmsegment jetzt einen Greifer an, der sich um sein “Handgelenk” drehen kann, und seine Greiferfinger ├Âffnen und schlie├čen kann.


Hausaufgaben bis zum siebten Praktikum


1. OpenGL / Meshes:
In welchem Format sind Meshes in einer OBJ Datei gespeichert in Bezug auf folgende Schlagw├Ârter:

  • tri-stripping
  • indexed face set
  • triangle orientation (clockwise=cw / counter-clockwise=ccw)
  • normal orientation (inside, outside)
  • texture coordinates (range)

Tipp: Schauen Sie die OBJ-Datei an, in der Sie Ihr Objekt abgespeichert haben - dies ist eine “lesbare” Text-Datei! Analysieren Sie deren Struktur und Inhalt! Denken Sie daran, bei Unklarheiten auch zu googlen.

2. OpenGL / Baryzentrische Koordinaten:
Ein Dreieck mit den folgenden Koordinaten und dazugeh├Ârigen Farbattributen soll rasterisiert werden:

$v_1 = (0, 1)^T$, $C_1 = (1, 1, 0)$ (gelb)
$v_2 = (2, 3)^T$, $C_2 = (0, \frac12, 0)$ (dunkelgr├╝n)
$v_3 = (4, 0)^T$, $C_3 = (0, 0, 1)$ (blau)
Bestimmen Sie die baryzentrisch interpolierte Farbe an der Position v = $(2, 1)^T$

3. OpenGL / Texturkoordinaten:
Ein Rechteck mit den Bildschirmkoordinaten (0 50), (100 50), (100 0) und (0 0) wird mit einer Textur mit einem 4├Ś4 Schachbrettmuster gef├╝llt; dabei haben die 4 Eckpunkte die Texturkoordinaten (0.5 1), (1 0.5), (0.5 0) und (0 0.5).

  1. Skizzieren Sie das entstehende texturierte Rechteck. Zeichen Sie dazu erst die ganze Textur in Texturkoordinaten, und ├╝berlegen Sie Sich in dieser Zeichnung, welcher Teil der Textur ├╝berhaupt verwendet wird.
  2. Welche Texturkoordinate ergibt sich in der Mitte des Rechtecks?
  3. Welche gl-Befehle ben├Âtigen Sie, um mit OpenGL ein entsprechendes Textur-Objekt zu erzeugen und zu aktivieren (nur Reihenfolge)?

4. OpenGL / Mip-Mapping:

  1. Wieviele Stufen hat die MipMap-Pyramide f├╝r obige Textur?
  2. Welche Farbe ergibt sich f├╝r die letzte Stufe?
  3. MipMaps funktionierten urspr├╝nglich nur f├╝r Texturen mit einer 2er-Potenz als Gr├Â├če. ├ťberlegen Sie, was die Ursache daf├╝r gewesen sein k├Ânnte.

Options: