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
- Holen Sie sich die Kamera nach oben und die richtigen Vektoren. Beachten Sie, dass sie normalisiert werden sollten.
- Liefert den Vektor vom Fokuspunkt zur Kamera (camPosition - Focus). Dies ist der Vektor, den Sie drehen werden. Nennen wir diesen camFocusVector .
- Entscheiden Sie, um wie viel Sie sich in Gier- / Neigungsrichtung in Bezug auf die Kamera drehen möchten
- Erstellen Sie zwei Rotationsmatrizen. Die erste Rotationsmatrix wird der Einsatz bis der Kamera wie die Achse und Gierwinkel , dass Sie sich entschieden. Die zweite Rotationsmatrix wird die Verwendung direkt von der Kamera wie die Achse und Pitch Winkel dass Sie sich entschieden.
- Drehen Sie nun den camFocusVector mit den neuen Rotationsmatrizen. Dies ist nun Ihre neue Position der Kamera relativ zum Ursprung. Wir möchten natürlich, dass es relativ zum Fokuspunkt ist ...
- Fügen Sie die Fokuspunktposition zu camFocusVector hinzu . Dies ist jetzt die neue Position Ihrer Kamera. Übersetzen Sie Ihre Kamera entsprechend.
- Bitten Sie die Kamera abschließend, sich auf das Fokusmessfeld zu konzentrieren, indem Sie Ihre lookAt () - Funktion aufrufen
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 ).