improve matrix to quaternion

This commit is contained in:
Recep Aslantas
2018-04-09 00:46:00 +03:00
parent 381b2fdcc0
commit f0daaca58b
5 changed files with 86 additions and 87 deletions

View File

@@ -186,6 +186,54 @@ glm_mat3_mulv(mat3 m, vec3 v, vec3 dest) {
dest[2] = m[0][2] * v[0] + m[1][2] * v[1] + m[2][2] * v[2];
}
/*!
* @brief convert mat4's rotation part to quaternion
*
* @param[in] m left matrix
* @param[out] dest destination quaternion
*/
CGLM_INLINE
void
glm_mat3_quat(mat3 m, versor dest) {
float trace, r, rinv;
trace = m[0][0] + m[1][1] + m[2][2];
if (trace >= 0.0f) {
r = 2.0f * sqrtf(1 + trace);
rinv = 1.0f / r;
dest[1] = rinv * (m[1][2] - m[2][1]);
dest[2] = rinv * (m[2][0] - m[0][2]);
dest[3] = rinv * (m[0][1] - m[1][0]);
dest[0] = r * 0.25f;
} else if (m[0][0] >= m[1][1] && m[0][0] >= m[2][2]) {
r = 2.0f * sqrtf(1 - m[1][1] - m[2][2] + m[0][0]);
rinv = 1.0f / r;
dest[1] = r * 0.25f;
dest[2] = rinv * (m[0][1] + m[1][0]);
dest[3] = rinv * (m[0][2] + m[2][0]);
dest[0] = rinv * (m[1][2] - m[2][1]);
} else if (m[1][1] >= m[2][2]) {
r = 2.0f * sqrtf(1 - m[0][0] - m[2][2] + m[1][1]);
rinv = 1.0f / r;
dest[1] = rinv * (m[0][1] + m[1][0]);
dest[2] = r * 0.25f;
dest[3] = rinv * (m[1][2] + m[2][1]);
dest[0] = rinv * (m[2][0] - m[0][2]);
} else {
r = 2.0f * sqrtf(1 - m[0][0] - m[1][1] + m[2][2]);
rinv = 1.0f / r;
dest[1] = rinv * (m[0][2] + m[2][0]);
dest[2] = rinv * (m[1][2] + m[2][1]);
dest[3] = r * 0.25f;
dest[0] = rinv * (m[0][1] - m[1][0]);
}
}
/*!
* @brief scale (multiply with scalar) matrix
*