Ich versuche, eine vereinfachte Hubschraubersimulation (im Moment ist es ein Würfel) in 3D zu erstellen, und ich habe einige Probleme mit der Rotation. Ein Hubschrauber kann sich entlang der drei Achsen drehen:
- Mit dem hinteren Propeller auf sich selbst drehen: Drehung der y-Achse
- Neigen Sie nach links und rechts, um nach links oder rechts zu gehen: Drehung der z-Achse
- Kippen Sie nach oben und unten, um vorwärts oder rückwärts zu gehen: Drehung der x-Achse
Ich muss in der Lage sein, jede Achse einzeln zu steuern. Bisher habe ich versucht, Eulerwinkel zu verwenden, aber unabhängig von der Reihenfolge der Drehung stoße ich entweder auf ein kardanisches Schloss oder auf einige Achsen, die "Orte wechseln".
Ich muss anscheinend Quaternionen verwenden, aber ich weiß nicht, wie ich jede einzelne Achse steuern soll, da Quaternionen eine Richtung und einen Winkel verwenden. Soll ich drei Quaternionen erstellen und diese miteinander multiplizieren? Würde ich nicht die gleichen Probleme haben?
Das Seltsame ist, wenn ich mit meinem Finger die drei Achsen meines Hubschraubers darstelle (Daumen hoch = y, Index = z, Mitte = x), scheine ich nicht auf diese Probleme zu stoßen. Warum?
Antworten:
Sie sollten entweder eine Matrix oder eine Quaternion verwenden können, um die aktuelle Ausrichtung Ihres Hubschraubers zu speichern. Das Problem, auf das Sie stoßen, ist, wie Sie Änderungen in Pitch / Yaw / Roll auf den Hubschrauber anwenden.
Ich denke, Sie möchten in jedem Frame Pitch / Yaw / Roll auf den Hubschrauber im lokalen Raum anwenden. Sie können dies tun, indem Sie die Änderung von Nick / Gieren / Rollen für diesen Rahmen übernehmen und eine Rotationsmatrix erstellen (Sie können dies mit Eulerwinkeln tun). Anschließend drehen Sie die vorherige Ausrichtung des Hubschraubers um diese Matrix (wobei die vorherige Ausrichtung entweder als Matrix oder als Quaternion dargestellt wird). Sie erhalten die Orientierung für den neuen Rahmen.
Die Darstellung der Ausrichtung des Hubschraubers als Quaternion hat den Vorteil, dass die Interpolation zwischen Quaternionen viel einfacher ist als die Interpolation zwischen Matrizen. Wenn Sie also in Zukunft eine aktuelle Ausrichtung haben und die Rotation pro Frame herausfinden möchten, die Sie zu einem gewünschten Zeitpunkt zu einer neuen Ausrichtung bringt, ist die Quaternionendarstellung möglicherweise freundlicher für Sie.
quelle
Grundsätzlich können Sie jede andere Darstellung von Rotationen verwenden, außer Euler-Winkel. Matrizen, Quaternionen und sogar Achsenwinkel machen, was Sie wollen.
Sie haben Recht, Sie würden mit den gleichen Problemen enden. Der Schlüssel besteht darin, die aktuelle Ausrichtung (Matrix, Quaternion) Ihres Objekts zu speichern und beim Ändern der Ausrichtung nur ein Delta anzuwenden .
Wenn Sie 10 Grad um y drehen möchten, erstellen Sie einfach eine Delta- Matrix / Quaternion dafür und multiplizieren Sie diese mit Ihrer aktuellen Ausrichtung (wenn Sie die Post-Multiplikation für Matrizen verwenden). Wenn Sie es umgekehrt multiplizieren, dreht es das System um die y-Achse der Welt und nicht um die y-Achse des Objekts.
Ich finde diese Ressource sehr nützlich, sie kommt auch mit Quellcode und erklärt die Theorie sehr gut.
quelle
Das Problem, von dem ich denke, dass Sie es sehen, ist ein Unterschied in der Achsendrehung und den Geschwindigkeitsvektoren (und auch, dass Ihnen eine Richtung fehlt). Wenn sich ein Hubschrauber nach vorne neigt, um sich vorwärts zu bewegen, drückt der Antrieb der Hubschrauberblätter die Luft in einem senkrechten Winkel zu dem, was Sie als X-Achse bezeichnet haben, sowohl nach unten als auch nach hinten.
Sie haben einen vierten Freiheitsgrad, den Sie verpasst haben: Die Geschwindigkeit der Blätter steuert das Luftvolumen, das gedrückt wird, und auch den Auftrieb, den der Hubschrauber erzeugt.
Trotzdem steuern Ihre "Neigung nach links und rechts" und "Neigung nach oben und unten" im Allgemeinen den Hubschrauber in einem bestimmten Flugzeug. Das heißt, ein Hubschrauber sollte nicht nach unten fliegen, wenn er vorwärts, rückwärts oder zur Seite kippt - aber der Auftrieb muss sich möglicherweise ändern, und die Geschwindigkeit wird von der "gegenüberliegenden" Seite des durch gebildeten rechtwinkligen Dreiecks gesteuert Verbinden Sie den Hubschrauber mit einer geraden Linie nach unten (Schwerkraft) und der Hypotenuse (Lift) mit dem Boden. Das sollte Ihren Geschwindigkeitsvektor zur Verwendung geben.
Sie sollten in der Lage sein, Quaternionen zu verwenden, aber Ihre Quaternionswerte nicht auf der Neigung des Hubschraubers selbst basieren - versuchen Sie stattdessen, die vom Hubschrauber erzeugten Bewegungskräfte zu verwenden.
quelle