Archived

This topic is now archived and is closed to further replies.

HalfLucifer

Quaternions - how to convert matrix to quat?

Recommended Posts

I understand how to convert quaternion to matrix representation, but the mat-to-quat conversion is so hard to understand that I could not figure it out. The code below quote from: http://www.gamasutra.com/features/19980703/quaternions_01.htm MatToQuat(float m[4][4], QUAT * quat) { float tr, s, q[4]; int i, j, k; int nxt[3] = {1, 2, 0}; tr = m[0][0] + m[1][1] + m[2][2]; // check the diagonal if (tr > 0.0) { s = sqrt (tr + 1.0); quat->w = s / 2.0; s = 0.5 / s; quat->x = (m[1][2] - m[2][1]) * s; quat->y = (m[2][0] - m[0][2]) * s; quat->z = (m[0][1] - m[1][0]) * s; } else { // diagonal is negative i = 0; if (m[1][1] > m[0][0]) i = 1; if (m[2][2] > m[i]) i = 2; j = nxt[i]; k = nxt[j]; s = sqrt ((m[i][i] - (m[j][j] + m[k][k])) + 1.0); q[i] = s * 0.5; if (s != 0.0) s = 0.5 / s; q[3] = (m[j][k] - m[k][j]) * s; q[j] = (m[i][j] + m[j][i]) * s; q[k] = (m[i][k] + m[k][i]) * s; quat->x = q[0]; quat->y = q[1]; quat->z = q[2]; quat->w = q[3]; } } Why check the diagonal negative or not? What the variable "s" really means? Could someone please explain the theory behind the code or comment the code line by line? Big thanks for that.

Share this post


Link to post
Share on other sites