Intrinsic Euler zu Richtungsvektor
-
Hi,
meine 3D Engine benutzt sogen. "Intrinsic Euler Angles" zum beschreiben von Rotationen. Die Reihenfolge der Rotationen habe ich als Z-Y'-X'' festgelegt, das heißt dass bei der anfänglichen Rotation um die Z-Achse die anderen Rotationsachsen "mitgedreht" werden, daher Y' und X''. Für OpenGL bewanderte Leute: ich drehe ein Objekt dann wie folgt:
glRotatef( z, 0, 0, 1 ); glRotatef( y, 0, 1, 0 ); glRotatef( x, 1, 0, 0 );
Nun möchte ich diese Rotation in einen Richtungsvektor umwandeln.
Ich habe einen Standardweg gefunden:x = cos(yaw)*cos(pitch) y = sin(yaw)*cos(pitch) z = sin(pitch)
Bei diesem wird die anfängliche Drehung um die Z-Achse (währe Roll) gar nicht beachtet. Das mag funktionieren wenn man feste Rotationsachsen benutzt, jedoch nicht wenn sich die Y und die X-Drehachse sozusagen "mitdreht".
Kann mir da jemand weiterhelfen?
-
RedPuma schrieb:
Nun möchte ich diese Rotation in einen Richtungsvektor umwandeln.
Wie soll das genau gehen? Sprich: Was willst du? Wenn du eine Rotation durch einen Vektor darstellen willst, dann brauchst du mindestens noch einen Winkel dazu. Also... Rotationsachse + Winkel.
Dein Code da unten rotiert (wahrscheinlich) den ersten Einheitsvektor mit den entsprechenden Parametern. Darum ist auch klar, warum die Rotation um die z-Achse nicht berücksichtigt wird. Wenn du einen Vektor um die Achse drehst, in die der Vektor zeigt, dann ändert sich der Vektor ja auch nicht.
-
Ich hab das Problem gerade gelöst, meine Überlegungen zu der Funktion oben waren mal wieder ein geistiger Schnellschuss, die Routine funktioniert doch. Man muss nur etwas aufpassen was genau man rotiert und was dabei herauskommt.
Ach ja und mit "Richtungsvektor" meinte ich einen Vektor der im lokalen Koordinatensystem des rotierten Objekts immer eine feste Richtung besitzt (z.B in Richtung der positiven X-Achse des Objektes).
-
ProgChild schrieb:
Wenn du eine Rotation durch einen Vektor darstellen willst, dann brauchst du mindestens noch einen Winkel dazu. Also... Rotationsachse + Winkel.
Es ist durchaus möglich, eine Rotation in einem Vektor zu verpacken, z.B. kann man den Winkel über die Länge codieren.
-
Bei meinem Problem ging es aber nicht um Rotationsachsen und dergleichen, ich wollte einfach einen "Forward-Vector" haben. In meinem Beispiel kommt bei dem Euler-Angle (0,0,0) ein Vektor raus der entlang der positiven X-Achse zeigt. Dies ist allerdings mit einem Informationsverlust verbunden, da sich aus dem Richtungsvektor die Orientierung nur unvollständig wiederherstellen lässt.
Damit hier auch eine vollständige Lösung steht, hier der Code für ein Rechtshändiges Koordinatensystem, Referenzvektor (1,0,0) und Euler-Definition Z-Y'-X'':inline void AngleToVector( const Vector3d &Angle, Vector3d &Vec ) { float s2, c2, s3, c3; s3 = SIN( Angle.x ); c3 = COS( Angle.x ); s2 = SIN( Angle.y ); c2 = COS( Angle.y ); Vec.x = c2 * c3; Vec.y = c2 * s3; Vec.z = -s2; }
Wenn man will kann man noch die (SSE ?) Operation SinCos einfließen lassen welche IMHO Sinus und Cosinus mit einer Operation berechnet.