prev up next


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, $\varphi$ und $\theta$, 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 $\varphi$, 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 $\theta$ bewirkt, dass Sie Ihren Kopf nach oben $\left(\theta>0\right)$ bzw. nach unten $\left(\theta<0\right)$ 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: $\varphi=\theta=0$ entspricht einem Blick in Richtung Horizont genau nach Norden.

  1. Implementieren Sie die Methode updateView(), die die Instanzvariable view mittels der Vektoren viewDir, upDir und camPos mit einer Viewmatrix füllt.
  2. Implementieren Sie die Methode rotate(float dPhi, float dTheta). Die Parameter geben an, wie $\varphi$ und $\theta$ 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 $\theta$.
  3. 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 $y$-Richtug bewegen.
  4. Erweitern Sie die Klasse CubeAndPyramid um eine finale Klassenvariable cam vom Typ Camera. Verändern Sie die Methode handleInput() so, dass mit der Taste $\left[F1\right]$ die Methode changeProjection() der Kamera aufgerufen wird. Achten Sie darauf, dass die Projektion nur beim Loslassen der Taste geändert wird.
  5. 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.
  6. Verändern Sie die Methode handleInput() der Klasse CubeAndPyramid so, dass die Kamera auf das Drücken der Tasten $W$, $A$, $S$, $D$, $\left[\mathrm{SPACE}\right]$ und $C$ reagiert. Dabei bewegt sich die Kamera nach vorne, nach links, nach hinten, nach rechts, nach oben und nach unten. Hinweis: Statt $C$ dürfen Sie auch $\left[\mathrm{STRG}\right]$ verwenden. Für diese Aufgabe ist es hilfreich, aus dem $2$-elementigen Vektor moveDir einen $3$-elementigen zu machen.
  7. 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 $\varphi$ und eine Bewegung nach oben bzw. unten auf den Winkel $\theta$ haben.

Musterlösung vom 07.06.2012:

Die Lösung findet sich unter /home/cg/2012/Uebung/Blatt7/Aufg/CG12Blatt7.zip .


prev up next