3D Rotationsberechnung mit Axis + Angle
Übersicht

AvaGastBetreff: 3D Rotationsberechnung mit Axis + Angle |
![]() Antworten mit Zitat |
|
---|---|---|
In der Hoffnung, dass mir hier irgendein kluger Kopf weiterhelfen kann... ![]() Problem: Gegeben ist eine Rotation im Axis / Angle Format. Gebraucht wird eine Rotation im Pitch / Yaw / Roll Format. Ich habe nicht die Spur einer Ahnung, wie ich dies umrechnen soll. Im Netz gibt es ne Menge wissenschaftlicher Formelaufstellungen zur Axis / Angle Rotation. Da ich aber leider nicht besonder gebildet bin, bringt mich das nicht ansatzweise voran. ![]() Das es irgendwas mit Quaternionen (wofür auch immer die gut sind ![]() Ganz viele Fragezeichen!! Gruss, Ava [/EDIT] Die Umrechnung habe ich scheinbar irgendwie gelöst. (An dieser Stelle ein dickes Dankeschön an den MiniB3D-Source!). Ist ja nen echt super aufwendiger Scheiss!! Bleibt die Frage nach dem Sinn!?! ![]() [/EDIT 2] Okay, ich revidiere ... es funzed nicht. ![]() Maaan, da will ich nur mal ne ganz primitive Animation importieren .. und die kommen mit so behinderten Daten daher. *rummotz* ![]() |
||
Kruemelator |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich habe davon noch nie gehört. Was ist das den? Wird da angegeben wo ein Körper "hinschaut" und dann wie weit er um diese "Sicht-Achse" gedreht ist? | ||
AvaGast |
![]() Antworten mit Zitat |
|
---|---|---|
Soweit ich das mittlerweile verstasnden habe, scheint es genau so zu sein, jap. ^^ | ||
![]() |
Noobody |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das wird noch relativ oft gebraucht, da diese Darstellung durch Quaternionen erzeugt wird. Mithilfe von Quaternionen kann man nämlich Punkte im 3D - Raum drehen, ohne dass sich der sogenannte Gimbal Lock einstellt. Ausserdem verwenden Physikengines auch gerne diese Darstellung, da man die Rotationsgeschwindigkeit durch eine Drehgeschwindigkeit um die Drehachse angeben kann - in der eulerschen Darstellung bräuchte man drei Winkelgeschwindigkeiten, mit denen sich nicht so leicht rechnen lässt.
Auf Wikipedia existiert ein Artikel darüber, wie sich Quaternionen wieder in Eulersche Winkel zurückrechnen lassen, hier zu finden. Die Herleitung braucht dich dabei nicht gross zu interessieren, nur diese Formel hier ist wichtig: ![]() q0 bis q3 sind dabei die Elemente des Quaternions. Dieses Quaternion musst du vorher noch aus Winkel und Drehachse erzeugen, aber das geht vergleichsweise einfach: Code: [AUSKLAPPEN] Local Q0:Float = Cos( Drehwinkel/2. )
Local Q1:Float = Sin( Drehwinkel/2. )*DrehAchseX Local Q2:Float = Sin( Drehwinkel/2. )*DrehAchseY Local Q3:Float = Sin( Drehwinkel/2. )*DrehAchseZ Bedingung ist, dass die Drehachse die Länge 1 hat, ansonsten bekommst du komische Resultate. Sobald du nun das Quaternion hast, musst du die einzelnen Elemente nur noch in die obige Formel einsetzen und du erhältst die Eulerschen Winkel. Ich muss zugeben, dass ich vorher noch nicht viel mit Quaternionen gerechnet habe, daher auf diese Angaben keine Gewähr ![]() |
||
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun |
AvaGast |
![]() Antworten mit Zitat |
|
---|---|---|
@Noobody
Danke für Deine ausführliche Antwort! ![]() Also die Quaternionen habe ich ja schon (die lade ich aus einer ASE File). Da habe ich nun endlich Matrizen kapiert und gehofft, das wärs mit dem 3D-Transformationsgedöhns ... und dann kommen da diese Dinger, und ... och nöö! Wie es aussieht, werde ich mich dann wohl noch sehr intensiv mit denen beschäftigen müssen. *seuftz* Hab nämlich schon gelesen, dass die sich nicht einfach auf Winkel (Pitch, Yaw, Roll) addieren lassen ... könnte natürlich auch der Grund dafür sein, warum die bisherigen Ergebnisse völliger Murks waren. ![]() ![]() Ganz schön blöd das Ganze, echt ma! ^^ |
||
![]() |
Noobody |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich hab das obige mal in eine Funktion umgesetzt, um einfach von Axis/Angle zu den Euler-Winkeln konvertieren zu können.
Parameter sollten anhand des Namens relativ selbsterklärend sein ![]() Zurückgeliefert wird ein Float - Array mit den Winkeln im Pitch/Yaw/Roll - Format. Code: [AUSKLAPPEN] Function AxisAngleToEuler:Float[]( AxisX:Float, AxisY:Float, AxisZ:Float, Angle:Float )
Local Q0:Float = Cos( Angle/2.0 ) Local Q1:Float = Sin( Angle/2.0 )*AxisX Local Q2:Float = Sin( Angle/2.0 )*AxisY Local Q3:Float = Sin( Angle/2.0 )*AxisZ Local Euler:Float[ 3 ] Euler[ 0 ] = ATan( 2*( Q0*Q1 + Q2*Q3 )/( 1 - 2*( Q1*Q1 + Q2*Q2 ) ) ) Euler[ 1 ] = ASin( 2*( Q0*Q2 - Q3*Q1 ) ) Euler[ 2 ] = ATan( 2*( Q0*Q3 + Q1*Q2 )/( 1 - 2*( Q2*Q2 + Q3*Q3 ) ) ) Return Euler End Function Ich habe die Funktion für ein paar Fälle getestet, wo sie relativ gut funktioniert hat (hie und da Float - Ungenauigkeiten, allerdings noch im akzeptablen im Rahmen von ±0.001), daher nehme ich an, dass sie stimmt. |
||
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group