Ich erstelle ein sehr einfaches Projekt mit OpenGL und stehe fest mit Rotationen. Ich versuche, ein Objekt unabhängig in allen 3 Achsen zu drehen: X, Y und Z. Ich hatte schlaflose Nächte aufgrund des "Gimbal Lock" -Problems, nachdem ich mich um eine Achse gedreht hatte. Ich habe dann gelernt, dass Quaternionen mein Problem lösen würden. Ich habe über Quaternionen recherchiert und es implementiert, aber ich war nicht in der Lage, meine Rotationen in Quaternionen umzuwandeln. Wenn ich zum Beispiel um die Z-Achse um 90 Grad rotieren möchte, erzeuge ich einfach den Vektor {0,0,1} für meine Quaternion und rotiere ihn um diese Achse um 90 Grad mit dem Code hier:
Ссылка (die komplizierteste Matrix in Richtung der Boden)
Das ist in Ordnung für einen Vektor, aber ich möchte zuerst um 90 Grad um Z drehen, dann um 90 Grad um X (nur als Beispiel). Welchen Vektor muss ich weitergeben? Wie berechne ich diesen Vektor? Ich bin nicht gut mit Matrizen und Trigonometrie (ich kenne die Grundlagen und die allgemeinen Regeln, aber ich bin einfach kein Genie), aber ich muss das schaffen. Es gibt viele Tutorials über Quaternionen, aber ich verstehe keine (oder sie beantworten meine Frage nicht). Ich muss nur lernen, den Vektor für Rotationen um mehr als eine kombinierte Achse zu konstruieren.
UPDATE : Ich habe diese nette Seite über Quaternionen gefunden und beschlossen, sie so zu implementieren: Ссылка
Hier ist mein Code für die Quaternion-Multiplikation:
%Vor% Hier ist mein Code zum Anwenden einer Quaternion auf meine Modelview-Matrix (ich habe eine tmodelview
Variable, die meine Ziel-Modelview-Matrix ist):
Und mein Code für die Rotation (den ich extern anrufe), wobei quaternion
eine Klassenvariable des Cubes ist:
Ich rufe, sagen rotatex
, für 10-11 mal für rotieren nur 1 Grad, aber mein Würfel wird fast 90 Grad nach 10-11 mal von 1 Grad gedreht, was keinen Sinn macht. Auch nach dem Aufruf von Rotationsfunktionen in verschiedenen Achsen wird Mein Cube schief, wird zweidimensional und verschwindet irreversibel (eine Spalte in der Modellansichtsmatrix wird nur Nullen), was offensichtlich bei einer korrekten Implementierung der Quaternionen nicht passieren sollte. p>
Sie nähern sich dem in die falsche Richtung. Wenn Sie drei Drehungen des Euler-Winkels für die X-, Y- und Z-Achse haben, können Sie sie nicht in eine Quaternion und dann in eine Matrix umwandeln. Gimbal Lock entsteht aufgrund der Darstellung Ihrer gewünschten Rotation. Wenn Sie die gewünschte Drehung als X-Y-Z-Euler-Winkel speichern, erhalten Sie eine Gimbal-Sperre.
Sie müssen Ihre gewünschte Ausrichtung als Quaternion speichern, um die Vorteile zu erhalten. Das heißt, es ist möglich, eine aktuelle Orientierung als Quaternion zu nehmen und dann die Frage zu stellen: "Wie drehe ich das um die Z-Achse um 90 Grad und benutze das als meine neue Orientierung?", Aber es ist nicht sinnvoll, "meine aktuelle Orientierung wird durch diese XYZ-Euler-Winkel definiert, wie verwandle ich das in eine Quaternion? ".
Eine vollständige Behandlung der relevanten Teile von Quaternionen wäre ziemlich langwierig. Diese Website kann Ihnen helfen. Es ist erwähnenswert, dass die Website, die Sie verlinkt haben, wirklich zu sein scheint über Achswinkelrotationen sprechen, nicht Quaternionen.
Bearbeiten: Der von Ihnen gepostete Code ist korrekt, außer dass die Zeichen für tmodelview[6]
und tmodelview[9]
falsch sind.
Tags und Links c++ opengl matrix quaternions