Frage

Ich zeichne eine flache Scheibe mit gluDisk() in meiner Szene. gluDisk() zieht die Scheibe die positive Z-Achse gegenüber, aber ich mag es etwas willkürlich normal sein mit Blick auf die ich habe.
Offensichtlich muss ich glRotate() verwenden, um die Platte zu bekommen mit Blick richtig, aber was sollte die Rotation sein? Ich erinnere mich, dies mit Quaternionen berechnet werden kann, aber ich kann nicht die Mathematik zu erinnern scheint.

War es hilfreich?

Lösung

Die Lösung sollte ziemlich einfach sein und soll nicht quarternions erfordern.

Die Drehachse von normal1 zu Normal2 bekommen müssen beide orthogonal sein, so dass nur nehmen ihr Vektor-Kreuzprodukt .

Der Betrag der Drehung wird leicht abgeleitet von ihrem Skalarprodukt . Dieser Wert ist | A |. | B |. · Cos (theta), aber als die beiden Normalvektoren normalisiert werden sollen cos geben (theta), so dass nur die inverse Kosinus nimmt den Drehbetrag zu erhalten

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

P. S. muss den Winkel in Grad nicht, dass glRotate() vergessen, aber die normalen C trigonometrischen Funktionen arbeiten in Radiant.

Andere Tipps

Drehung um eine beliebige Achse: gegebener Winkel R in Radian und Einheitsvektor u = ai + bj + ck oder [a, b, c], definieren:

q0 = cos(r/2)  
q1 = sin(r/2) a   
q2 = sin(r/2) b  
q3 = sin(r/2) c  

und konstruiert aus diesen Werten die Rotationsmatrix:

   ( q0^2+q1^2 - q2^2 - q3^2 | 2*(q1*q2 - q0*q3)           | 2*(q1*q3 + q0*q2)         )
Q =( 2*(q2*q1 + q0*q3)       | (q0^2 - q1^2 + q2^2 - q3^2) | 2*(q2*q3 - q0*q1)         )
   ( 2*(q3*q1 - q0*q2)       | 2*(q3*q2 + q0*q1)           | q0^2 - q1^2 - q2^2 + q3^2 )

, um die Drehung zu finden was Sie tun müssen, können Sie das Kreuzprodukt zwischen dem Stromvektor und dem Zielvektor berechnen. Sie werden das orthogonale Vektor erhalten (der Ihren Rotationsvektor sein wird, die quaternion zu schaffen) und die Länge dieses Vektors ist die Sünde des Winkels Sie so zu kompensieren, dass das Start- und Zielvektor überlappt.

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

<cos θ/2, x*sin θ/2, y*sin θ/2, z*sin θ/2>, where |<x, y, z>| = 1

Zum Beispiel Drehen der positive Y-Achse statt zu stellen, müssen Sie es um 90 ° um die X-Achse drehen. Der Vektor <0, 1, 0> würde, und die quaternion würde = <cos 90°, 0, sin 90°, 0> <0, 0, 1, 0> werden.

, um die Figur zu drehen von der positiven Z-Achse zugewandt ist, um den Vektor <x,y,z> zugewandt Sie den Drehvektor und Drehwinkel finden müssen. Um die Drehachse zu finden, können Sie das Kreuzprodukt eines Stromvektor nehmen, und wo Sie wollen es sein.

Wenn es die positive Z-Achse zugewandt ist, würde der Stromvektor <0, 0, 1> werden. Wenn Sie es Gesicht <x,y,z> wollen, würde die Drehachse <0, 0, 1> x <x, y, z> = <-y, x, 0> wird, und der Winkel würde arctan(sqrt(x^2+y^2),z) werden. Die Quaternion wird

<cos(θ/2), -y*sin(θ/2), x*sin(θ/2), 0>, where θ = arctan(sqrt(x^2+y^2), z)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top