Wie kann ich eine Quaternion richtig um alle Achsen drehen?

Ich möchte eine First-Person-Kamera codieren, deren Drehung in einer Quaternion gespeichert ist. Leider stimmt etwas mit der Rotation nicht.

Die folgende Funktion ist für das Drehen der Kamera verantwortlich. Die ParameterMouse undSpeed Übergeben Sie die Mausbewegung und Rotationsgeschwindigkeit. Dann ruft die Funktion das Rotationsquaternion ab, dreht es und speichert das Ergebnis. Übrigens benutze ichBullet Physics Von dort kommen die Typen und Funktionen.

void Rotate(vec2 Mouse, float Speed)
{
    btTransform transform = camera->getWorldTransform();
    btQuaternion rotation = transform.getRotation();

    Mouse = Mouse * Speed;                    // apply mouse sensitivity
    btQuaternion change(Mouse.y, Mouse.x, 0); // create quaternion from angles
    rotation = change * rotation;             // rotate camera by that

    transform.setRotation(rotation);
    camera->setWorldTransform(transform);
}

Um die resultierende Kameradrehung zu veranschaulichen, wenn sich die Maus bewegt, zeige ich Ihnen eine Handzeichnung. Auf der linken Seite wird die falsche Drehung angezeigt, die die Kamera tatsächlich ausführt. Auf der rechten Seite wird der gewünschte korrekte Fall angezeigt. Die Pfeile zeigen an, wie sich die Kamera dreht, wenn Sie die Maus nach oben (orange) und unten (blau) bewegen.

Wie Sie sehen, ist die Drehung korrekt, solange das Gieren Null ist. Aber je mehr Gieren es hat, desto kleiner werden die Kreise, in denen sich die Kamera dreht. Im Gegensatz dazu sollten die Kreise immer wie eine Länge über die gesamte Kugel verlaufen.

Ich bin nicht sehr vertraut mit Quaternionen, also frage ich hier, wie ich sie richtig drehen soll.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage