Ich versuche, Code zu schreiben, indem ich ein Objekt drehe.
Ich habe es implementiert als:
Die Drehung um die X-Achse ergibt sich aus dem Ausmaß der Änderung der y-Koordinaten einer Maus, und die Drehung um die Y-Achse ergibt sich aus dem Ausmaß der Änderung der x-Koordinaten einer Maus.
Diese Methode ist einfach und funktioniert einwandfrei, bis auf der Achse die Z-Achse übereinstimmt, kurz gesagt, eine Gimble-Sperre auftritt.
Wie kann ich die Drehung um die Z-Achse verwenden, um eine kardanische Verriegelung zu vermeiden?
Antworten:
Die einfache Lösung besteht darin, die Ausrichtung des Objekts nicht als Winkel um Achsen (X-, Y-, Z-Achse) zu speichern, wie beispielsweise in Eulerwinkeln.
Speichern Sie die Ausrichtung des Objekts als Matrix oder Quaternion.
Dies kann bei Verwendung von Eulerwinkeln zu einer Kardanverriegelung führen:
Kein Kardanschloss:
Auch kein Kardanschloss:
Wenn nun die Maus geändert wird, multiplizieren Sie m_orientation mit der Orientierungsänderung, die sich aus der Mausbewegung in jedem Frame ergibt.
quelle
Dieses Buch (Echtzeit-Rendering) hat mir sehr geholfen! Siehe auf Seite 66 und 70. Es hat sehr gute Grafiken und Erklärungen. Quaternionen finden Sie auch auf Seite 72! :) :)
Drehung um eine beliebige Achse
Dadurch wird die Kamera mit der Drehung per Mauseingabe gerendert:
Mit der Mauseingabe ändern Sie Gieren (Kopf), Nick und Roll.
quelle