3D Rotationsberechnung mit Axis + Angle

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

 

Ava

Gast

Betreff: 3D Rotationsberechnung mit Axis + Angle

BeitragSa, Jun 20, 2009 9:24
Antworten mit Zitat
In der Hoffnung, dass mir hier irgendein kluger Kopf weiterhelfen kann... Confused

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. Sad

Das es irgendwas mit Quaternionen (wofür auch immer die gut sind Evil or Very Mad) zu tun hat, habe ich bereits herausgefunden ... was genau ist daran so toll ? Immerhin wird hierfür ein zusätzlicher Wert benötigt ...

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!?! Evil or Very Mad


[/EDIT 2] Okay, ich revidiere ... es funzed nicht. Confused Es war lediglich ein Zufallserfolg. *seuftz* Die Winkel, die er mir für eine simple 90°-Pitch-Rotation ausgibt, sind völlig fürn Arsch ... und in die anderen Richtungen sieht es noch bescheidener aus. >_<

Maaan, da will ich nur mal ne ganz primitive Animation importieren .. und die kommen mit so behinderten Daten daher. *rummotz* Evil or Very Mad
 

Kruemelator

BeitragSa, Jun 20, 2009 12:06
Antworten mit Zitat
Benutzer-Profile anzeigen
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?
 

Ava

Gast

BeitragSa, Jun 20, 2009 12:33
Antworten mit Zitat
Soweit ich das mittlerweile verstasnden habe, scheint es genau so zu sein, jap. ^^

Noobody

BeitragSa, Jun 20, 2009 12:45
Antworten mit Zitat
Benutzer-Profile anzeigen
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:

user posted image

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 Razz
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
 

Ava

Gast

BeitragSa, Jun 20, 2009 13:38
Antworten mit Zitat
@Noobody
Danke für Deine ausführliche Antwort! Smile

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.Rolling Eyes Hinzu kommt, dass ich auch nicht wirklich nen Plan habe, was die Angaben im ASE wirklich aussagen bzw. wie die einzelnen Angaben richtig ausgewertet werden. Confused

Ganz schön blöd das Ganze, echt ma! ^^

Noobody

BeitragMi, Jun 24, 2009 15:37
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Razz
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

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group