Ich zeichne eine Szene, in der sich die Kamera frei im Universum bewegt. Die Kameraklasse verfolgt die Ansicht (oder Lesen ) Punkt, um die Position der Kamera, und die Aufwärts - Vektor. Diese Vektoren / Punkte werden dann an gluLookAt übergeben.
Schwenken und Zoomen sind nahezu trivial zu implementieren. Aber ich bin eine Drehung um die Suche nach Blick auf Punkt viel eher ein Problem zu sein. Ich möchte eine Funktion Camera.rotate schreiben , die 2 Winkel nimmt, eine , die sich dreht nach oben / unten und eine , die dreht sich nach links / rechts entlang einer imaginären Kugel , die über die zentriert Blick auf Punkt.
Gibt es eine einfache Möglichkeit, dies zu tun?
Ich habe (kurz) über Quaternionen gelesen, aber ich wollte sehen, ob es angesichts des relativ einfachen Aufbaus meiner Szene eine einfachere Lösung gibt.
Antworten:
Was Sie verlangen, heißt Arcball-Rotation. Quaternionen sind nur dann die einfache Lösung, wenn Sie wissen, wie sie funktionieren. Sie können dies jedoch auch ohne Quaternionen erreichen.
Voraussetzungen
Wissen Sie, wie man Objekte im Allgemeinen dreht? Angenommen, Sie haben ein Objekt am Ursprung. Wissen Sie, wie Sie es drehen (Hinweis: Multiplizieren Sie mit einer Rotationsmatrix)? Wenn ja, dann gehe ich davon aus, dass Sie wissen, was passieren wird, wenn Sie das Objekt zuerst übersetzen und dann drehen?
Sie müssen wissen, wie man eine Rotationsmatrix aus der Winkelachse berechnet.
Lösung
Vorbehalte
Sie müssen nach bestimmten Fällen oder Besonderheiten Ausschau halten, bei denen Ihre Kamera nicht mehr funktioniert. Zum Beispiel gerade nach unten / oben schauen. Ich werde Sie herausfinden lassen, wie Sie damit umgehen sollen.
EDIT1: Neuberechnung der Orthonormalvektoren der Kamera
Sie kennen bereits die Richtung der Kamera ((cameraPos - focusPoint) .normalize ()). Angenommen, Ihre Kamera ist auf + Y (oder die aktuelle Aufwärtsachse Ihrer Welt liegt bei Ihnen). Jetzt einfach die Richtung mit dem Pfeil nach oben kreuzen , um das richtige zu finden . Getan? Nee! Ihr Aufwärtsvektor ist nicht mehr orthogonal zu den beiden anderen. Um das Quer zu beheben rechts mit Richtung und Sie Ihren neuen bekommen oben .
Notiere dass der Gram-Schmidt is really what should be used to orthonormalize vectors.
Beachten Sie auch hier die Vorsichtsmaßnahmen, da dies in einigen Fällen nicht funktioniert (die Richtung ist beispielsweise parallel nach oben ).
quelle
normalize(up ^ camFocusVector)
(or its opposite if left-handed).What you need is a typical ArcBall camera, which is basically a camera that keeps a target location and allows you to move the camera in a "spherical" way around that target.
It's in XNA but IIRC I've used this implementation before, and it worked quite well:
http://roy-t.nl/index.php/2010/02/21/xna-simple-arcballcamera/
quelle
Here's my code for rotating around a point, found myself reusing it a lot.
quelle
This very simple algorith to achieve that is pretty awesome:
Being P the center point about you want to rotate (the "look at"or "target" point):
I used it and its nice.
Source found at sister-site stackoverflow: /programming/287655/opengl-rotating-a-camera-around-a-point
quelle