Aufgabe 6.3 (60 Punkte)
Erweitern Sie das Programm um eine Maus- und Tastatusteuerung, wie
in klassischen Egoshootern. Kopieren Sie dazu die Datei Camera.java
(
/home/cg/2012/Uebung/Blatt6/Aufg/Camera.java .) in das Package util. Die Klasse stellt
bereits die Vektoren viewDir, upDir, sideDir
und camPos als Instanzvariablen zur Verfügung, die Sie im
folgenden berechnen müssen. Die Kamera hat eine bestimmt Ausrichtung
die durch zwei Winkel, und , bestimmt wird. Der
erste Winkel bestimmt dabei die horizontale Rotation, der zweite Winkel
die Neigung der Kamera. Stellen Sie sich die Kamera dabei vor, wie
Ihren Kopf. Verändern Sie , so ist dies äquivalent dazu,
dass sie Ihren ganzen Körper um die eigene Achse drehen und den Kopf
dabei starr lassen. Eine Veränderung von bewirkt, dass Sie
Ihren Kopf nach oben
bzw. nach unten
bewegen. Achten Sie jedoch darauf, dass Sie (mit hoher Wahrscheinlichkeit)
Ihren Kopf nicht beliebig nach oben bzw. unten neigen können. Dementsprechend
sollte die Kamera dies auch nicht können. Hinweis:
entspricht einem Blick in Richtung Horizont genau nach Norden.
- Implementieren Sie die Methode updateView(), die die Instanzvariable
view mittels der Vektoren viewDir, upDir
und camPos mit einer Viewmatrix füllt.
- Implementieren Sie die Methode rotate(float dPhi, float dTheta).
Die Parameter geben an, wie und verändert werden
sollen. Berechnen Sie damit die drei Vektoren viewDir, upDir
und sideDir und achten Sie dabei auf eine sinnvolle Beschränkung
des Winkels .
- Implementieren Sie die Methode move(float fb, float lr, float
ud). Hierbei soll sich die Kamera um fb Einheiten (``front/back'')
in Richtung des Vektors viewDir, lr Einheiten (``left/right'')
in Richtung des Vektors sideDir und ud Einheiten
(``up/down'') in -Richtug bewegen.
- Erweitern Sie die Klasse CubeAndPyramid um eine finale Klassenvariable
cam vom Typ Camera. Verändern Sie die Methode handleInput()
so, dass mit der Taste
die Methode changeProjection()
der Kamera aufgerufen wird. Achten Sie darauf, dass die Projektion
nur beim Loslassen der Taste geändert wird.
- Verändern Sie die Methode updateUniforms() so, dass die View-
und Projectionmatrix aus der neuen Klassenvariable cam benutzt
werden. Hinweis: Sie können das Programm nun starten. Wenn
Sie links ein Quadrat und rechts ein Dreieck sehen, funktioniert
Ihre Methode updateView() korrekt. Falls nicht, ist Ihr Fehler
höchstwahrscheinlich dort zu suchen. Die Methoden rotate(float
dPhi, float dTheta) und move(float fb, float lr, float ud)
wurden zu diesem Zeitpunkt noch nicht aufgerufen.
- Verändern Sie die Methode handleInput() der Klasse CubeAndPyramid
so, dass die Kamera auf das Drücken der Tasten , , , ,
und reagiert. Dabei bewegt sich
die Kamera nach vorne, nach links, nach hinten, nach rechts, nach
oben und nach unten. Hinweis: Statt dürfen Sie auch
verwenden. Für diese Aufgabe ist es
hilfreich, aus dem -elementigen Vektor moveDir einen
-elementigen zu machen.
- Verändern Sie die Methode handleInput() der Klasse CubeAndPyramid
so, dass die Kamera auf das Bewegen der Maus reagiert. Machen Sie
sich hierzu mit der Klasse org.lwjgl.input.Mouse vertraut.
Die Mausbewegungen sollen nur bei gedrückter linker Maustaste verarbeitet
werden. Eine Mausbewegung nach link bzw. rechts soll direkt Auswirkungen
auf den Winkel und eine Bewegung nach oben bzw. unten auf
den Winkel haben.
Musterlösung vom 07.06.2012:
Die Lösung findet sich unter
/home/cg/2012/Uebung/Blatt7/Aufg/CG12Blatt7.zip .