mat4 to quaternion

This commit is contained in:
Recep Aslantas
2018-04-07 19:46:46 +03:00
parent f5140ea005
commit 257c57d41f
10 changed files with 132 additions and 5 deletions

View File

@@ -53,6 +53,14 @@ CGLM_EXPORT
void
glmc_mat4_mulv(mat4 m, vec4 v, vec4 dest);
CGLM_EXPORT
void
glmc_mat4_mulq(mat4 m, versor q, mat4 dest);
CGLM_EXPORT
void
glmc_mat4_quat(mat4 m, versor dest);
CGLM_EXPORT
void
glmc_mat4_transpose_to(mat4 m, mat4 dest);

View File

@@ -334,6 +334,36 @@ glm_mat4_mulq(mat4 m, versor q, mat4 dest) {
glm_mat4_mul(m, rot, dest);
}
/*!
* @brief convert mat4's rotation part to quaternion
*
* @param[in] m left matrix
* @param[out] dest destination quaternion
*/
CGLM_INLINE
void
glm_mat4_quat(mat4 m, versor dest) {
versor q;
float m00, m10, m20,
m01, m11, m21,
m02, m12, m22;
m00 = m[0][0]; m10 = m[1][0]; m20 = m[2][0];
m01 = m[0][1]; m11 = m[1][1]; m21 = m[2][1];
m02 = m[0][2]; m12 = m[1][2]; m22 = m[2][2];
q[0] = sqrtf(glm_max(0.0f, 1.0f + m00 + m11 + m22)) * 0.5f; /* w */
q[1] = sqrtf(glm_max(0.0f, 1.0f + m00 - m11 - m22)) * 0.5f; /* x */
q[2] = sqrtf(glm_max(0.0f, 1.0f - m00 + m11 - m22)) * 0.5f; /* y */
q[3] = sqrtf(glm_max(0.0f, 1.0f - m00 - m11 + m22)) * 0.5f; /* z */
q[1] *= glm_signf(m12 - m21);
q[2] *= glm_signf(m20 - m02);
q[3] *= glm_signf(m01 - m10);
glm_vec4_copy(q, dest);
}
/*!
* @brief multiply vector with mat4's mat3 part(rotation)
*