2016-07-27 20 views
0

Meine Systeme bestehen aus einem Koordinatensystem und eine Quaternion in diesem System repräsentiert eine Rolle (etwa x), Nick (etwa y) und Gier (etwa z) in Form von vier Werten (qx, qy, qz, qw).Einzelne Komponenten einer Quaternion?

Wie kann ich diese Quaternion in drei unabhängige Quaternionen aufteilen, so dass eine die Rolle darstellt, die andere die Tonhöhe und die dritte die Gierdrehungen darstellt?

Vielen Dank.

+0

Das klingt wie eine Frage besser geeignet für http://math.stackexchange.com/ als eine Programmierung Frage Website. – mituw16

+0

Gibt es eine Möglichkeit, das Q dann zu übertragen, da diese beide Stack-Exchange-Websites sind? – simplename

+0

Konvertieren Sie es einfach in Euler Angels Darstellung – minorlogic

Antwort

0

Es klingt, als sollten Sie die Euler-Winkel extrahieren, dann 3 neue Quaternionen erstellen und diese dann in der richtigen Reihenfolge erneut kombinieren, um wieder zur ursprünglichen Quaternion zu gelangen.

This PDF has formulas für die manuelle Konvertierung zwischen Euler und Quaternion. Die Formeln funktionieren im YPR-Format und nicht im RPY. Kannst du sie benutzen?

Hier sind sie in C implementiert sind:

/* euler_2_quaternion_ZYX */ 

quat->w = cos(az/2.0f) * cos(ay/2.0f) * cos(ax/2.0f) + sin(az/2.0f) * sin(ay/2.0f) * sin(ax/2.0f); 
quat->x = cos(az/2.0f) * cos(ay/2.0f) * sin(ax/2.0f) - sin(az/2.0f) * sin(ay/2.0f) * cos(ax/2.0f); 
quat->y = cos(az/2.0f) * sin(ay/2.0f) * cos(ax/2.0f) + sin(az/2.0f) * cos(ay/2.0f) * sin(ax/2.0f); 
quat->z = sin(az/2.0f) * cos(ay/2.0f) * cos(ax/2.0f) - cos(az/2.0f) * sin(ay/2.0f) * sin(ax/2.0f); 



/* quaternion_2_euler_ZYX */ 

float qx, qy, qz, qw; 

qw = quat->w; 
qx = quat->x; 
qy = quat->y; 
qz = quat->z; 

*az = atan2(qy * qz + qw * qx, 0.5f - ((qx * qx) + (qy * qy))); 
*ay = asin(-2.0f * ((qx * qz) - (qw * qy))); 
*ax = atan2(((qx * qy) + (qw * qz)), 0.5f - ((qy * qy) + (qz * qz)));