#1 14.08.2007 09:21:19

Chris
ExtremeMember
Ort: Erlangen, Bay
Registriert: 24.01.2005
Beiträge: 694
Web-Seite

AxisRotation to YawPitchRoll

Hallo,

folgendes Szenario: Ich hab ein Objekt. Sagen wir eine Box (=Quader) und die rotiert um eine Achse. Ich mach das mit MatrixRotationAxis()... So, wenn ich jetzt die Achse ändere dann springt das Objekt je erst in die Ursprüngliche Rotation zurück. Also die erste Drehung um die Achse geht verloren und die neue Drehung findet nicht mit dem schon rotieren Objekt statt. Is ja logisch.
Um das zu Umgehen müsste ich mir jede ehemalige Rotationsachse merken und dann ganz oft rotieren um am Schluss mein fertig rotiertes Objekt zu erhalten.

Und das ist irgendwie blöd. big_smile

Also hab ich mir gedacht ich wandle meine Rotation ( mint cont. Winkelgeschwindigkeit ) um die Achse in 3 Rotationen um X,Y und Z um. Jeweils mit eigener Winkelgeschwindigkeit. Dann bruch ich mir nurnoch die Gesamtrotation merken.
Nur hab ich keine wirkliche idee wie ich das umrechnen kann. Alles was ich bisher versucht habe resultierte in seltsamen eier-bewegungen wink

mfg Chris


Nimm meinen Rat an - ich brauch ihn sowieso nicht

Offline

 

#2 14.08.2007 09:41:30

DerPeer
GodlikeMember
Ort: Berlin
Registriert: 04.02.2005
Beiträge: 1291

Re: AxisRotation to YawPitchRoll

Also, Du kannst Dir auch einfach den Rotationszustand Deines Objektes in Form einer einfachen Matrix matRot speichern.
Darin sind alle Informationen enthalten, die den gedrehten Zustand eines Objektes beschreiben.
Möglicherweise ist es nicht trivial, die YawPitchRoll- oder Eulerwinkel da heraus abzuleiten.

Aber so hab ich das mit meinem Raumschiff auch gemacht. Jede zusätzliche aufkommende Drehung (z. B. durch Steuerdüsen) wird behandelt als eine MatrixMultiplikation der matRot mit einer ElementarRotation (Drehung um eine Koordinatenachse). Dann gibts eine neue, etwas andere matRot.

Auch Winkelgeschwindigkeiten lassen sich als Drehmatrix repräsentieren. Dann gibts eben nicht mehr Position:=Position+Velocity sondern D3DXMatrixMultiply( Orientierung, Orientierung, Drehgeschwindigkeit ).

Auch mußt Du aufpassen, ob Du von links oder rechts die Drehmatrix heranmultiplizierst. In meinen Beispielen hier geb ich keine Garantie smile
Das ist auch der Unterschied zwischen Yaw-Pitch-Roll und Euler-Winkeln. Die einen von links, die anderen von rechts.

Achso, jezt hab ich Deine Frage auch verstanden smile
Also, wenn Du eine Rotationsmatrix hast (3x3), dann sind glaub ich die 3 Spalten dasselbe wie die 3 Basisvektoren des gedrehten Systems.
Jetzt müßtest Du mit diversen Punktprodukten versuchen, die einzelnen Vektoren nach und nach auf irgendwelche x,y-, y,z- oder x,z-Ebenen zu drehen. Ist glaub ich nicht so einfach.
Wäre einfacher, wenn Du diese Winkel nicht wirklich bräuchtest.

Hoffe, es war was sinnvolles dabei smile

DerPeer

Offline

 

#3 14.08.2007 10:07:18

Chris
ExtremeMember
Ort: Erlangen, Bay
Registriert: 24.01.2005
Beiträge: 694
Web-Seite

Re: AxisRotation to YawPitchRoll

ah, natürlich!

Sehr genial! Logisch, dass ich da nicht selber drauf gekommen bin...
Ich probiers mal aus.

Danke!

Chris


Nimm meinen Rat an - ich brauch ihn sowieso nicht

Offline

 

#4 14.08.2007 10:43:26

Coolcat
ProGuru
Ort: Aachen, NRW
Registriert: 24.01.2005
Beiträge: 2780
Web-Seite

Re: AxisRotation to YawPitchRoll

http://www.delphidev.de/forum/viewtopic.php?id=69
Damit kannst du eine Matrix erzeugen die eine andere Matrix um einen bestimmten Winkel dreht. Du musst allerdings aufpassen, dass die Drehschritte nicht zu klein werden. Anderenfalls kommt nämlich möglicherweise numerischer Mist dabei raus.


My software never has bugs. It just develops random features.

Offline

 

#5 14.08.2007 11:12:58

Neo
Member
Ort: Erfurt/Thüringen
Registriert: 31.01.2005
Beiträge: 78
Web-Seite

Re: AxisRotation to YawPitchRoll

Solche Problemchen werden für gewöhnlich elegant mit Quaternions gelöst. Die Funktionsweise ist ähnlich die von DerPeer, allerdings schneller und nicht so fehleranfällig (Gimballock etc...).
All deine Rotationen werden durch Quaternions repräsentiert. Die neue Drehrotation kannst du z.B. mit D3DXQuaternionRotationAxis erzeugen. Anschließend multiplizierst du die lokale Rotation mit der absoluten Rotation mit D3DXQuaternionMultiply. Die Richtung hierbei ist ebenso wichtig wie bei Matrizen. Probier es einfach aus, gibt nur 2 Möglichkeiten.
Am Ende aller Rotationen, also bevor du die endgültige Worldmatrix berechnest, wandelst du die Rotation in eine Rotationsmatrix mit D3DXMatrixRotationQuaternion um.

Neo

Offline

 

#6 14.08.2007 15:20:17

DerPeer
GodlikeMember
Ort: Berlin
Registriert: 04.02.2005
Beiträge: 1291

Re: AxisRotation to YawPitchRoll

@Coolcat: Ich hab damals vielleicht lange gebraucht, um den Fehler zu finden! Ich meine den numerischen Mist. Nach einiger Zeit wurde mein Raumschiff nämlich immer kleiner und irgendwie auch verzerrt. Ich hatte schon an meinem Verstand gezweifelt.
Dem hab ich dann abgeholfen, indem ich immer sichergestellt hab, daß die Basisvektoren in der Länge eins sind, und den dritten immer aus den ersten zwei berechnet. Klappt wunderbar.
Weiß nicht, ob es dieses Problem auch mit Quaternionen gibt.

DerPeer

Offline

 

#7 14.08.2007 16:11:42

Coolcat
ProGuru
Ort: Aachen, NRW
Registriert: 24.01.2005
Beiträge: 2780
Web-Seite

Re: AxisRotation to YawPitchRoll

Zitat:

Weiß nicht, ob es dieses Problem auch mit Quaternionen gibt.

Die Dinger sollen irgendwie besser sein, ich habe sie aber bisher noch nicht verwendet. (Ich hab die Mathematik dahinter noch nicht ganz kapiert und hatte bisher auch keine Zeit mich damit ausführlicher zu beschäftigen)


My software never has bugs. It just develops random features.

Offline

 

#8 14.08.2007 20:22:39

Neo
Member
Ort: Erfurt/Thüringen
Registriert: 31.01.2005
Beiträge: 78
Web-Seite

Re: AxisRotation to YawPitchRoll

Solche Probleme gibt es überall wo Gleitkommazahlen auftreten, auch bei Quaternions. Hier kann man das Problem aber mit einem einfachen D3DXQuaternionNormalize beseitigen, ähnlich wie DerPeer das mit seinen Basisvektoren macht.
Die Mathematik dahinter ist im Endeffekt nur zweitrangig. Wichtig ist, das ein Quaternion über vier Gleitkommazahlen jede beliebige Rotation darstellen kann, wohingegen für eine Matrix 9 Zahlen benötigt werden. Das führt zu vereinfachten Berechnungen die am Ende performanter und weniger fehleranfällig sind.

Neo

Offline

 

Brett Fußzeile

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson