From ade43ca4d2b16fe39d038e907b9a7cf030fc4446 Mon Sep 17 00:00:00 2001 From: Thompson Lee Date: Sun, 7 Aug 2016 10:01:02 -0400 Subject: [PATCH] Converted c[] to xyzw format. Should not be accidentally transposing the matrix. --- source/maths/quat_frommtx.c | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/source/maths/quat_frommtx.c b/source/maths/quat_frommtx.c index 64bafc5..0a34c1c 100644 --- a/source/maths/quat_frommtx.c +++ b/source/maths/quat_frommtx.c @@ -12,42 +12,42 @@ C3D_FQuat Quat_FromMtx(const C3D_Mtx* m) C3D_FQuat q; //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) { //Diagonal is positive. sqrtTrace = sqrtf(trace + 1.0f); q.w = sqrtTrace / 2.0f; sqrtTrace = 0.5 / sqrtTrace; - q.x = (m->r[1].c[2] - m->r[2].c[1]) * sqrtTrace; - q.y = (m->r[2].c[0] - m->r[0].c[2]) * sqrtTrace; - q.z = (m->r[0].c[1] - m->r[1].c[0]) * sqrtTrace; + q.x = (m->r[1].z - m->r[2].y) * sqrtTrace; + q.y = (m->r[2].x - m->r[0].z) * sqrtTrace; + q.z = (m->r[0].y - m->r[1].x) * sqrtTrace; } else { //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]); - q.w = (m->r[2].c[1] - m->r[1].c[2]) / sqrtTrace; + sqrtTrace = 2.0f * sqrtf(1.0f + m->r[0].x - m->r[1].y - m->r[2].z); + q.w = (m->r[2].y - m->r[1].z) / sqrtTrace; q.x = 0.25f * sqrtTrace; - q.y = (m->r[0].c[1] - m->r[1].c[0]) / sqrtTrace; - q.z = (m->r[0].c[2] - m->r[2].c[0]) / sqrtTrace; + q.y = (m->r[0].y - m->r[1].x) / 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]); - q.w = (m->r[0].c[2] - m->r[2].c[0]) / sqrtTrace; - q.x = (m->r[0].c[1] - m->r[1].c[0]) / sqrtTrace; + sqrtTrace = 2.0f * sqrtf(1.0f + m->r[1].y - m->r[0].x - m->r[2].z); + q.w = (m->r[0].z - m->r[2].x) / sqrtTrace; + q.x = (m->r[0].y - m->r[1].x) / 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 { - sqrtTrace = 2.0f * sqrtf(1.0f + m->r[2].c[2] - m->r[0].c[0] - m->r[1].c[1]); - q.w = (m->r[1].c[0] - m->r[0].c[1]) / sqrtTrace; - q.x = (m->r[0].c[2] - m->r[2].c[0]) / sqrtTrace; - q.y = (m->r[1].c[2] - m->r[2].c[1]) / sqrtTrace; + sqrtTrace = 2.0f * sqrtf(1.0f + m->r[2].z - m->r[0].x - m->r[1].y); + q.w = (m->r[1].x - m->r[0].y) / sqrtTrace; + q.x = (m->r[0].z - m->r[2].x) / sqrtTrace; + q.y = (m->r[1].z - m->r[2].y) / sqrtTrace; q.z = 0.25f * sqrtTrace; } }