6
\$\begingroup\$

I have a quaternion, coming from a system with the following:(intertial sensor)

Right handed. Forward direction: Y axis Right direction: X axis Up direction: Z axis 

I need to convert this into a coordinate system that is: (Unreal engine)

left-handed. Forward direction: X axis Right direction: Y axis Up direction: Z axis 

I have tried negating the axis, and angle, I have tried switching values, i cannot get this to work. All help greatly appreciated! I am working in C#, with Microsoft.Xna.Quaternion.

\$\endgroup\$
3
  • 1
    \$\begingroup\$ Is your situation a duplicate of this SO question Convert quaternion from right-handed to left-handed coordinate system? \$\endgroup\$ Commented Aug 30, 2016 at 22:15
  • \$\begingroup\$ @Pikalek Reading the title i'd say yes, however as you read OP's question, it seems he's not really interested in right-left-handedness but instead in swapping the uses of the x and y axis \$\endgroup\$ Commented Nov 3, 2017 at 8:34
  • \$\begingroup\$ There are many similar posts but I added an answer that i found works in this other post. Hope it helps. stackoverflow.com/questions/39040325/… \$\endgroup\$ Commented Nov 22, 2022 at 11:38

2 Answers 2

8
\$\begingroup\$

To convert the Quaternion, we need to convert the imaginary part (xyz) which represents the axis of rotation into the destination coordinate system. In this case, that means exchanging x & y while leaving z unchanged.

Then, because we've changed the handedness of our coordinate system, our angle takes the opposite sign (a +ve rotation in a right-handed coordinate system is a -ve rotation about the corresponding axis in a left-handed coordinate system). This leaves the real part (w) unchanged, since cos(theta) = cos(-theta), and negates the imaginary part, since sin(theta) = -sin(-theta)

Combining these two effects, we get the following:

Quaternion ConvertSensorToUnreal(float x, float y, float z, float w) { Quaternion output; output.x = -y; output.y = -x; output.z = -z; output.w = w; return output; } 
\$\endgroup\$
1
\$\begingroup\$

Rotation - counter clockwise is +ve and clockwise is -ve

Rx(90)*Rz(-90)*Ry(90) will switch in the way you wanted. Either you perform these rotation using quaternions or convert them into DCM (Direction Cosine Matrix) and then perform the rotation and convert back to quaternions.

I hope this will solve your issue.

\$\endgroup\$

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.