Quaternion Mathematik für die Rotation?

8

Ich zeichne eine flache Scheibe mit gluDisk() in meiner Szene. gluDisk() zeichnet die Festplatte in Richtung der positiven Z-Achse, aber ich möchte, dass sie einer beliebigen Norm entspricht, die ich habe.
Natürlich muss ich glRotate() verwenden, um die Festplatte korrekt anzuzeigen, aber was sollte die Rotation sein? Ich erinnere mich, dass dies mit Quaternions berechnet werden kann, aber ich kann mich nicht an die Mathematik erinnern.

    
shoosh 18.04.2009, 22:02
quelle

3 Antworten

16

Die Lösung sollte ziemlich einfach sein und sollte keine Quartalszahlen erfordern.

Die Rotationsachse von Normal1 zu Normal2 muss orthogonal zu beiden sein, also nehmen Sie einfach ihr Vektorprodukt .

Die Größe der Rotation wird leicht von ihrem dot-product abgeleitet. Dieser Wert ist | A |. | B | .cos (Theta), aber da die beiden Normalenvektoren normalisiert werden sollten, ergibt sich cos (Theta), also nehmen Sie einfach den inversen Kosinus, um den Rotationsbetrag zu erhalten.

Der resultierende Vektor und Winkel sind die erforderlichen Parameter für glRotate() - es ist nicht notwendig, die tatsächliche Rotationsmatrix selbst zu berechnen.

ps. vergiss nicht, dass glRotate() den Winkel in Grad benötigt, aber die normalen C trig Funktionen funktionieren im Bogenmaß.

    
Alnitak 18.04.2009, 22:48
quelle
6

Rotation um eine beliebige Achse: Gegebene Winkel r im Bogenmaß und Einheitsvektor u = ai + bj + ck oder [a, b, c], definieren:

%Vor%

und konstruiere aus diesen Werten die Rotationsmatrix:

%Vor%

Um die gewünschte Rotation zu finden, können Sie das Kreuzprodukt zwischen dem aktuellen Vektor und dem Zielvektor berechnen. Sie erhalten den orthogonalen Vektor (der Ihr Rotationsvektor ist, um die Quaternion zu erzeugen) und die Länge dieses Vektors ist die Sünde des Winkels, den Sie kompensieren müssen, damit sich der Start- und der Zielvektor überlappen.

    
Stefano Borini 18.04.2009 22:39
quelle
3

Quaternionen beschreiben eine Rotation um eine Achse. <w,x,y,z> rotiert um die Achse <x,y,z> in Abhängigkeit von der Balance zwischen der Größe von w und der Größe des Vektors.

%Vor%

Wenn Sie ihn zum Beispiel so drehen, dass er der positiven Y-Achse zugewandt ist, müssen Sie ihn um 90 ° um die X-Achse drehen. Der Vektor wäre <0, 1, 0> und die Quaternion wäre <cos 90°, 0, sin 90°, 0> = <0, 0, 1, 0> .

Um die Figur von der positiven Z-Achse zum Vektor <x,y,z> zu drehen, müssen Sie den Rotationsvektor und den Rotationswinkel finden. Um die Rotationsachse zu finden, können Sie das Kreuzprodukt eines aktuellen Vektors nehmen und wo Sie es haben möchten.

Wenn es der positiven Z-Achse zugewandt ist, wäre der aktuelle Vektor <0, 0, 1> . Wenn Sie möchten, dass <x,y,z> angezeigt wird, wäre die Rotationsachse <0, 0, 1> x <x, y, z> = <-y, x, 0> und der Winkel wäre arctan(sqrt(x^2+y^2),z) . Die Quaternion wird

%Vor%     
Markus Jarderot 18.04.2009 22:21
quelle