Converted c[] to xyzw format. Should not be accidentally transposing the matrix.

This commit is contained in:
Thompson Lee 2016-08-07 10:01:02 -04:00
parent fa348aadf3
commit ade43ca4d2

View File

@ -12,42 +12,42 @@ C3D_FQuat Quat_FromMtx(const C3D_Mtx* m)
C3D_FQuat q; C3D_FQuat q;
//Check the main diagonal of the passed-in matrix for positive/negative signs. //Check the main diagonal of the passed-in matrix for positive/negative signs.
trace = m->r[0].c[0] + m->r[1].c[1] + m->r[2].c[2]; trace = m->r[0].x + m->r[1].y + m->r[2].z;
if (trace > 0.0f) if (trace > 0.0f)
{ {
//Diagonal is positive. //Diagonal is positive.
sqrtTrace = sqrtf(trace + 1.0f); sqrtTrace = sqrtf(trace + 1.0f);
q.w = sqrtTrace / 2.0f; q.w = sqrtTrace / 2.0f;
sqrtTrace = 0.5 / sqrtTrace; sqrtTrace = 0.5 / sqrtTrace;
q.x = (m->r[1].c[2] - m->r[2].c[1]) * sqrtTrace; q.x = (m->r[1].z - m->r[2].y) * sqrtTrace;
q.y = (m->r[2].c[0] - m->r[0].c[2]) * sqrtTrace; q.y = (m->r[2].x - m->r[0].z) * sqrtTrace;
q.z = (m->r[0].c[1] - m->r[1].c[0]) * sqrtTrace; q.z = (m->r[0].y - m->r[1].x) * sqrtTrace;
} }
else else
{ {
//Diagonal is negative or equals to zero. We need to identify which major diagonal element has the greatest value. //Diagonal is negative or equals to zero. We need to identify which major diagonal element has the greatest value.
if (m->r[0].c[0] > m->r[1].c[1] && m->r[0].c[0] > m->r[2].c[2]) if (m->r[0].x > m->r[1].y && m->r[0].x > m->r[2].z)
{ {
sqrtTrace = 2.0f * sqrtf(1.0f + m->r[0].c[0] - m->r[1].c[1] - m->r[2].c[2]); sqrtTrace = 2.0f * sqrtf(1.0f + m->r[0].x - m->r[1].y - m->r[2].z);
q.w = (m->r[2].c[1] - m->r[1].c[2]) / sqrtTrace; q.w = (m->r[2].y - m->r[1].z) / sqrtTrace;
q.x = 0.25f * sqrtTrace; q.x = 0.25f * sqrtTrace;
q.y = (m->r[0].c[1] - m->r[1].c[0]) / sqrtTrace; q.y = (m->r[0].y - m->r[1].x) / sqrtTrace;
q.z = (m->r[0].c[2] - m->r[2].c[0]) / sqrtTrace; q.z = (m->r[0].z - m->r[2].x) / sqrtTrace;
} }
else if (m->r[1].c[1] > m->r[2].c[2]) else if (m->r[1].y > m->r[2].z)
{ {
sqrtTrace = 2.0f * sqrtf(1.0f + m->r[1].c[1] - m->r[0].c[0] - m->r[2].c[2]); sqrtTrace = 2.0f * sqrtf(1.0f + m->r[1].y - m->r[0].x - m->r[2].z);
q.w = (m->r[0].c[2] - m->r[2].c[0]) / sqrtTrace; q.w = (m->r[0].z - m->r[2].x) / sqrtTrace;
q.x = (m->r[0].c[1] - m->r[1].c[0]) / sqrtTrace; q.x = (m->r[0].y - m->r[1].x) / sqrtTrace;
q.y = 0.25f * sqrtTrace; q.y = 0.25f * sqrtTrace;
q.z = (m->r[1].c[2] - m->r[2].c[1]) / sqrtTrace; q.z = (m->r[1].z - m->r[2].y) / sqrtTrace;
} }
else else
{ {
sqrtTrace = 2.0f * sqrtf(1.0f + m->r[2].c[2] - m->r[0].c[0] - m->r[1].c[1]); sqrtTrace = 2.0f * sqrtf(1.0f + m->r[2].z - m->r[0].x - m->r[1].y);
q.w = (m->r[1].c[0] - m->r[0].c[1]) / sqrtTrace; q.w = (m->r[1].x - m->r[0].y) / sqrtTrace;
q.x = (m->r[0].c[2] - m->r[2].c[0]) / sqrtTrace; q.x = (m->r[0].z - m->r[2].x) / sqrtTrace;
q.y = (m->r[1].c[2] - m->r[2].c[1]) / sqrtTrace; q.y = (m->r[1].z - m->r[2].y) / sqrtTrace;
q.z = 0.25f * sqrtTrace; q.z = 0.25f * sqrtTrace;
} }
} }