Followers 0

# Quaternion coordinate axis change

## 2 posts in this topic

Hi guys, I’m having problems with an animation that uses quaternions. The problem is that the bones are given to me in the form of quaternions such that:
1) The system is right handed.
2) In particular the example of bone I want to resolve is this:
[img]http://dl.dropbox.com/u/41632816/Hueso.PNG[/img][img]http://dl.dropbox.com/u/41632816/Axis.PNG[/img]

In my game the corresponding bone frame of reference is left handed. In particular it is:
[img]http://dl.dropbox.com/u/41632816/Unity.PNG[/img][img]http://dl.dropbox.com/u/41632816/Axis2.PNG[/img]

So the map would be:

from = +Y along arm, +X right, +Z forward
to = -X along arm, -Z right, -Y forward

In resume my problems are:
* The quaternion of the rotation is in a left hand system
* My system is right handed and with different axis

Watching an example I found that the change in the quaternion seems to be:
Where originalRotation is the rotation in the right hand system
myRotation is the rotation in my axis

Quaternion myRotation = new Quaternion(-originalRotation.y, originalRotation.z, originalRotation.x, originalRotation.w);

This seems to work... but I don’t know how to get there.... it is a change of frame of reference with quaternion with a handness change...
Thanks in avance Edited by BobXIV
0

##### Share on other sites
I guess you're an artist?
If so, you should not care. The programmer writing the filter should.
But I suppose that's you anyway.
I converted the quaternion to a matrix and converted the matrix. Not quite The Right Thing but keeps the whole point of encoding a rigid transform, and that was all that I needed.
0

##### Share on other sites
Since you asked, you may be interested in reading how to derive the quaternion corresponding to a different orthonormal reference frame. I assume you know that each rotation in 3D can be represented as a rotation or some angle [i]theta[/i] around an axis [b]axis[/b]. A unit quaternion representing such rotation is defined as

cos([i]theta[/i]/2) + sin([i]theta[/i]/2)*[b]axis[/b].

In this post I will not use the quaternion representation, but the angle-axis representation with the [url="http://en.wikipedia.org/wiki/Rodrigues"]Rodrigues' rotation formula[/url]

R([i]theta[/i], [b]axis[/b])*[b]v[/b] = cos([i]theta[/i])*v + sin([i]theta[/i])*cross([b]axis[/b], [b]v[/b]) + (1 - cos([i]theta[/i]))*dot([b]axis[/b], [b]v[/b])*[b]axis.[/b]

Let M be the orthogonal matrix of the change of coordinate from the orthonormal reference frame A to the orthonormal reference frame B, R([i]thetaA[/i], [b]axisA[/b]) the rotation in the reference frame A and R([i]thetaB[/i], [b]axisB[/b]) the corresponding rotation in the reference frame B. Then the rotations should satisfy

R([i]thetaB[/i], [b]axisB[/b])*M*[b]v[/b] = M*R([i]thetaA[/i], [b]axisA[/b])*[b]v[/b]

Since R([i]thetaA[/i], [b]axisA[/b])*[b]axisA[/b] = [b]axisA[/b], then we should have R([i]thetaB[/i], [b]axisB[/b])*M*[b]axisA[/b] = M*R([i]thetaA[/i], [b]axisA[/b])*[b]axisA[/b] = M*[b]axisA[/b]. Then M*[b]axisA[/b] should be parallel to [b]axisB[/b]. In particular, it will be equal to +axisB or -axisB. Let S represent this sign.

Using the Rodrigues' rotation formula we obtain

cos([i]thetaB[/i])*M*[b]v[/b] + sin([i]thetaB[/i])*cross([b]axisB[/b], M*[b]v[/b]) + (1 - cos([i]thetaB[/i]))*dot([b]axisB[/b], M*[b]v[/b])*[b]axisB[/b] = M*( cos([i]thetaA[/i])*[b]v[/b] + sin([i]thetaA[/i])*cross([b]axisA[/b], [b]v[/b]) + (1 - cos([i]thetaA[/i]))*dot([b]axisA[/b], [b]v[/b])*[b]axisA[/b] )

We should now clearly have cos([i]thetaB[/i]) = cos([i]thetaA[/i]) which implies (in [-pi, pi]) abs([i]thetaB[/i]) = abs([i]thetaA[/i]). We also have that M*cross([b]axisA[/b], [b]v[/b]) = det(M)*cross(M*[b]axisA[/b], M*[b]v[/b]) = S*det(M)*cross([b]axisB[/b], M*[b]v[/b]). Thus, sin([i]thetaB[/i]) = sin([i]thetaA[/i])*S*det(M). Finally, we have

dot([b]axisB[/b], M*[b]v[/b])*[b]axisB[/b] = dot([b]axisA[/b], [b]v[/b])*M*[b]axisA[/b] = S*dot(M*[b]axisA[/b], M*[b]v[/b])*[b]axisB[/b] = ([b]axisB[/b], M*[b]v[/b])*[b]axisB[/b].

We can thus choose S to be either +1 or -1 and then use the equation sin([i]thetaB[/i]) = sin([i]thetaA[/i])*S*det(M) to fix [i]thetaB[/i] accordingly. For example, if we choose S=-1, then sin([i]thetaA[/i]) = sin([i]thetaB[/i]) in your case which implies [i]thetaA[/i] = [i]thetaB[/i]. If S=+1 was chosen, then sin([i]thetaA[/i]) = -sin([i]thetaB[/i]) and [i]thetaA[/i] = -[i]thetaB[/i].
1

## Create an account

Register a new account