Die objektgebundene Kamera
Was ist eine objektgebundene Kamera?
Im Gegensatz zur freien Kamera richtet sich nun die Position bzw. die Blickrichtung nach einem bewegten Objekt. Die Kamera folgt dem Objekt in einem bestimmten Abstand. Oft wird die Kamera in einem bestimmten Abstand hinter dem Objekt und etwas oberhalb (mit Neigung nach unten) plaziert; gelegentlich bringt man die Kamera in dem Objekt unter, z.B. im Cockpit. Der Benutzer hat keinen direkten Einfluss auf die Kamera, evtl. kann er aber auf verschiedene Sichtweisen umschalten.
Die "starre" Kamera
Es gibt mehrere Möglichkeiten, mit der Kamera einem Objekt zu folgen. Am einfachsten zu realisieren ist die folgende:
- Die Kamera hat stets denselben Abstand vom Objekt.
- Die Ausrichtung der Kamera folgt exakt der Bewegungsrichtung des Objekts.
- Die Kamera ist immer genau auf das Objekt fokussiert.
Die Bilder zeigen den Ablauf. Die schwarzen Pfeile deuten die Bewegung des Objektes an, die schwarzen Punkte sind die jeweiligen Positionen des Objekts. Die roten Pfeile dagegen geben den Abstand und die Ausrichtung der Kamera wieder. Da der Abstand zum Objekt konstant bleibt, haben die roten Pfeile gleiche Länge.

Wenn sich die Bewegungsrichtung des Objektes ändert, muss die Kamera in eine neue Position gebracht werden. Bei stärkeren Richtungsänderungen kann der Positionswechsel sehr drastisch sein. Jeder Richtungs- und Positionswechsel der Kamera hat ein neues Blickfeld zur Folge, was die Orientierung erschwert. Das kann in extremen Fällen (rechtes Bild) diese Art der Kamera unbrauchbar machen. Das Objekt prallt von einem Hindernis zurück. Die Kamera schwenkt dadurch hinter das Hindernis, das u.U. die Sicht auf das Objekt versperrt. Auf jeden Fall geht bei derartigen Vorgängen die Orientierung verloren. Deshalb ist die starre Kamera nur geeignet, wenn sich dich die Bewegungsrichtung nur geringfügig ändert.
Realisierung der starren Kamera
Wegen der festen Fixierung auf das Objekt bietet sich an, gluLookAt zu verwenden.
static TPoint pos; // Position des Objektes static TVector vel; // Geschwindigkeit des Objektes static TPoint viewpos ; // Position der Kamera void UpdateView () { TVector dir = vel; dir.y = 0; NormalizeVector (&dir); dir = ScaleVector (-4, dir); viewpos.x = pos.x + dir.x; viewpos.y = pos.y; viewpos.z = pos.z + dir.z; gluLookAt (viewpos.x, viewpos.y, viewpos.z, pos.x, pos.y, pos.z, 0, 1, 0); }
Kamera mit schrittweiser Annäherung an die Bewegungsrichtung
Die Schwächen der starren Kamera sind hauptsächlich auf das rigorose Einschwenken in die neue Bewegungsrichtung zurückzuführen. Durch behutsames Anpassen an die neue Richtung kann der unangenehme Effekt deutlich gemildert werden. Als neue Kamerarichtung wird hierbei die Richtung von der alten Kameraposition zur neuen Objektposition angenommen. Sowohl die Richtunsgänderung als auch die Positionsänderung der Kamera fällt dadurch erheblich geringer aus.

Das Objekt wird nicht nur starr von hinten gezeigt, sondern bei Richtungsänderungen vorübergehend auch von der Seite. Dass sich die Kamerarichtung nur asymptotisch der Bewegungsrichtung angleicht, stört nicht.
Realisierung:
Wie bei der starren Kamera bleibt das Objekt im Focus der Kamera, so dass wiederum mit gluLookAt gearbeitet werden kann:
void UpdateView () { TVector dir; dir = SubtractPoints (ctrl.pos, ctrl.viewpos); dir.y = 0; NormalizeVector (&dir); dir = ScaleVector (-4, dir); ... }
Ein anderer Ansatz besteht darin, als neue Kamerarichtung die Winkelhalbierende zwischen der alten Richtung und der neuen Bewegungsrichtung des Objektes zu nehmen. Der Skalierungsfaktor in der mit * gekennzeichneten Zeile (dort 1) ermöglicht die Annäherung an einen der beiden Schenkel.
void UpdateView () { TVector dir, dir1, dir2; dir1 = SubtractPoints (ctrl.pos, ctrl.viewpos); dir1.y = 0; NormalizeVector (&dir1); * dir1 = ScaleVector (1, dir1); dir2 = ctrl.vel; dir2.y = 0; NormalizeVector (&dir2); dir = AddVectors (dir1, dir2); NormalizeVector (&dir); dir = ScaleVector (-4, dir); ... }
Weitere Möglichkeiten
Die vorgestellten Verfahren sind nur exemplarische Modelle. Weitere Modelle sind denkbar. So kann es z.B. sinnvoll sein, das Objekt nicht immer genau im Zentrum des Fokus zu halten (wohl aber im Blickfeld). Damit lässt sich das Ausscheren des Objektes besser oder angenehmer beobachten. Alle derartigen Bemühungen haben das Ziel, die Kamera gegenüber den Bewegungen des Objektes träge zu machen. Wie weit man dabei zweckmäßigerweise geht, richtet sich vor allem danach, wie sich das Objekt bewegt.