Die Kamera (Grundlagen)
Was versteht man unter einer Kamera?
Bei der Kamera in 3D-Programmen handelt es sich nicht um ein konkretes Objekt, sondern um eine Struktur, die die Position und Blickrichtung des Betrachters beschreibt. Sie ermöglicht es, in die Szene "hineinzugehen" und Teile der Szenerie aus einem beliebigen Abstand und unter beliebigem Blickwinkel zu betrachten, bei größeren Szenerien unerlässlich.
Realisierung einer Kamera
Wenn z.B. die Kamera entlang der z-Achse in Richtung +z verschoben wird, bedeutet es, dass sich alle Objekte relativ zur Kamera (!) in Richtung -z verschieben. Oder wenn die Kamera nach rechts gedreht wird, erscheint die gesamte Szenerie, als sei sie nach links gedreht worden. Diese relative Transformation ist durchgängig, so dass man sagen kann: Um die Kamera zu verschieden oder zu drehen, wird die Szenerie entgegengesetzt verschoben und gedreht. Die Umkehrung zeigt sich auch in der Reihenfolge der Transformationen. Während beim Zeichnen von Objekten die Regel gilt, dass zuerst glTranslate, dann glRotate aufgerufen wird, ist es bei der Kamera umgekehrt. Die Skalierung mit glScale ist bei der Kamera unüblich und in der Regel nicht erforderlich.
Damit nicht jedes einzelne Objekt an die Kamera angepasst werden muss, wird eine Grundmatrix (view matrix) erstellt, auf der alle folgenden Zeichenbefehle aufbauen, und die somit automatisch für die richtigen Relationen zwischen Kamera und Szenerie sorgt. Dabei handelt es sich normalerweise um die Modelview-Matrix. Es ist zwar prinzipiell möglich und von der Sache her sogar logisch, die View-Matrix mit der Projektionsmatrix zu verknüpfen, aber es wird empfohlen, die Projektionsmatrix für derartige Zwecke nicht zu verwenden.
Die Lebensdauer einer View-Matrix kann je nach Anwendung (siehe unten) unterschiedlich sein. Häufig ist sie auf einen Frame begrenzt, in anderen Fällen reicht sie solange, bis explizit eine andere Matrix eingestellt wird. U.U. kann die Matrix während der gesamten Laufzeit des Programms gültig sein.
Regeln zum Umgang mit der View-Matrix
- Die Berechnung der View-Matrix muss vor allen anderen Zeichenoperationen erfolgen.
- Es ist strikt darauf zu achten, dass die View-Matrix nicht überschrieben wird. Wenn anschließend lokale Transformationen vorgenommen werden oder die Identity-Matrix geladen wird, sollten diese Befehle grundsätzlich in die Klammer glPopMatrix ... glPushMatrix gesetzt werden.
Methoden zur Gewinnung der View-Matrix
Die Standardmethode besteht darin, die Matrix mit den üblichen Transformationsbefehlen (Rotation vor Verschiebung) aufzubauen:
glLoadIdentity (); glRotate (...); glRotate (...); glTranslate (...);
Die Matrix wird extern berechnet und direkt übergeben. Diese Methode ist nützlich, wenn die View-Matrix noch für andere Zwecke gebraucht wird, z.B. für die Berechnung von Frustum-Planes.
glLoadIdentity (); glMultMatrix (Zeiger_auf_eigene_Matrix);
- Verwendung von gluLookAt. Dieser Befehl aus der Glu-Bibliothek erlaubt eine komfortable Einstellung der View-Matrix, weil die Ausrichtung der Kamera mit Hilfe eines Zielpunktes erfolgt. Darüber hinaus kann die Kamera durch die Festlegung eines Up-Vektors um die optische Achse gedreht werden. Andererseits ist es wegen der Vermeidung von Rotationswinkeln relativ umständlich, die Kamera ohne Fixierung auf ein Ziel einfach zu drehen, etwa um die y-Achse.
Anwendungen
Im wesentlichen gibt es zwei Anwendungstypen:
- Die freie Kamera. Hierbei übernimmt der Benutzer die volle Steuerung der Kamera, z.B. um das Gelände zu erkunden. Er kann die Kamera (und damit sich selbst als Betrachter) bewegen oder die Blickrichtung ändern. Er kann einen günstigen Standort suchen, um irgendwelche Vorgänge oder Dinge zu betrachten. Die freie Kamera ist nicht zuletzt in der Entwicklungsphase eines Programms von Nutzen. Damit lassen sich Positionen, Licht- und Materialeinstellungen, Vorder- und Rückseiten von Polygonen (Backface-Culling) usw. überprüfen.
- Die objektgebundene Kamera. Hierbei bestimmt ein bewegtes Objekt sowohl die Position als auch die Ausrichtung der Kamera. Oft wird sie dabei in einem bestimmten Abstand hinter dem Objekt positioniert und folgt ihm ständig. Typischer Anwendungsfall ist das Rennspiel, wo die Kamera unerlässlich ist, um das Objekt richtig steuern zu können. Evtl. kann die Kamera sogar im Objekt (z.B. Auto) untergebracht sein.