Institut für Computervisualistik Universität Koblenz 19. un 20. November 2012
Inhaltsverzeichnis 1 Transformationen Translation Skalierung Rotation 2 Reihenfolge von Transformationen Beispiele 3 Programmieraufgabe 4 GLUT & Keyboardeingaben
Worum geht s? CGI bis jetzt nur statische Szenen Ohne Bewegung wäre die Computergrafik langweilig Ziel: Durch Transformationen, Rotationen, Skalierungen Bewegung schaffen
Translation Translation Verschiebung Es existiert ein Verschiebungsvektor t = ( tx Der( Vektor ) wird ( auf alle Eckpunkte ) des Objektes addiert. p x tx + p p y = x t y + p y t y )
Translation Translation mit OpenGL gltranslatef(x, y, z) x, y, z definiert den Verschiebungsvektor Resultat: eine Verschiebungsmatrix, welche auf die aktuelle Matrix multiplizert wird
Translation Translationsmatrix 1 0 0 t x T (t x, t y, t z ) = 0 1 0 t y 0 0 1 t z 0 0 0 1
Skalierung Skalierung Objekte ( werden ) ( mit Faktoren ) für x, y und z skaliert. p x sx p p y = x s y p y
Skalierung Skalieren mit OpenGL glscalef(x, y, z) x, y, z definiert die Verzerrung der Achsen Resultat: eine Skalierungsmatrix, welche auf die aktuelle Matrix multiplizert wird
Skalierung Skalierungsmatrix s x 0 0 0 S(s x, s y, s z ) = 0 s y 0 0 0 0 s z 0 0 0 0 1
Rotation Rotation Objekte werden um eine bestimmte Achse und einen bestimmten Winkel gedreht
Rotation Rotieren mit OpenGL glrotatef(angle, x, y, z) angle beschreibt den Winkel (in Grad) um den rotiert werden soll x, y, z definiert eine Rotationsachse Resultat: eine Rotationssmatrix, welche auf die aktuelle Matrix multiplizert wird
Rotation Rotationsmatrizen 1 0 0 0 R x (α) = 0 cosα sinα 0 0 sinα cosα 0 0 0 0 1 cosα 0 sinα 0 R y (α) = 0 1 0 0 sinα 0 cosα 0 0 0 0 1 cosα sinα 0 0 R z (α) = sinα cosα 0 0 0 0 1 0 0 0 0 1
Rotation Matrizenakkumulation Verschiedene Transformationen können hintereinander ausgeführt werden Die einzelnen Matrizen werden akkumuliert, indem sie immer auf die aktuelle Matrix multipliziert werden OpenGL legt die Matrizen auf einen Stack LIFO Reihenfolge der ausgeführten Transformationen: von unten nach oben im Code
Rotation Matrizenstack Es existiert eine globale Matrix, an die die einzelnen Transformationen von rechts multipliziert werden MODELVIEW Richtigen Stack auswählen: GL PROJECTION ist nur für die Projektion zuständig Also umschalten auf glmatrixmode(gl MODELVIEW) Mit glloadidentity() die Einheitsmatrix aufrufen
Unterscheidung zwischen: Rotation/Skalierung um den Ursprung Rotation/Skalierung mit Bezug auf einen Punkt Erst Skalieren, dann Rotieren Erst Rotieren, dann Skalieren
Beispiele Beispiel Reihenfolge I Rotation um den Ursprung Rotation um den Ursprung
Beispiele Beispiel Reihenfolge I Rotation um den Ursprung Rotation um den Ursprung Rotation um den Mittelpunkt Translation unter Berücksichtigung des Mittelpunktes in den Ursprung Rotation im Ursprung Translation um den Referenzpunkt zurück zur Ausgangsposition
Beispiele Beispiel Reihenfolge II Skalierung um den Ursprung Skalierung um den Ursprung
Beispiele Beispiel Reihenfolge II Skalierung um den Ursprung Skalierung um den Ursprung Skalierung um den Mittelpunkt Translation unter Berücksichtigung des Mittelpunktes in den Ursprung Skalierung im Ursprung Translation um den Referenzpunkt zurück zur Ausgangsposition
Beispiele Beispiel Reihenfolge III Skalierung und Rotation Translation in den Ursprung Rotation Skalierung
Beispiele Beispiel Reihenfolge III Skalierung und Rotation Translation in den Ursprung Rotation Skalierung Skalierung und Rotation Translation in den Ursprung Skalierung Rotation
Rotating Star Ein Stern soll sich um seinen Mittelpunkt drehen Es soll möglich sein, den Mittelpunkt des Sterns per Mauseingabe festzulegen
Rotating Star Ein Stern soll sich um seinen Mittelpunkt drehen Es soll möglich sein, den Mittelpunkt des Sterns per Mauseingabe festzulegen Überlegung Welche Transformationen sind nötig? In welcher Reihenfolge müssen sie ausgeführt werden?
Keyboardeingaben - glutkeyboardfunc Für Zahlen und Buchstaben, alles was einen ASCII Code hat void keyboard(unsigned char key, int x, int y) Character key bezeichnet den ASCII Code des gedrückten Zeichens x und y geben die Mausposition bei gedrückter Keyboard-Taste zurück
Keyboardeingaben - glutspecialfunc Für special Keyboard Events, wie F1 oder Pfeiltasten void special(int key, int x, int y) Integer key zum Beispiel: GLUT KEY LEFT x und y geben die Mausposition bei gedrückter Keyboard-Taste zurück
Animationen - glutidlefunc Wird immer dann aufgerufen, wenn der Window-Manager nichts zu tun hat. void idle(void) Für kontinuierliche Animationen in der idle() die display() aufrufen glutpostredisplay()
Anmelden der Funktionen in der main() glutkeyboardfunc(keyboard) glutspecialfunc(special) glutidlefunc(idle)
Flackerfreie Darstellung von Animationen Immer in den Backbuffer rendern Front- und Backbuffer dann tauschen In der main() Doublebuffer anlegen glutinitdisplaymode(glut DOUBLE GLUT RGB) In der display() mit glutswapbuffers() zum Zeichnen aufrufen