diff --git a/include/cglm-euler.h b/include/cglm-euler.h index 741b902..4dc4b82 100644 --- a/include/cglm-euler.h +++ b/include/cglm-euler.h @@ -137,6 +137,40 @@ glm_euler(float pitch, dest[3][3] = 1.0f; } +/*! + * @brief build rotation matrix from euler angles(xyz) + * + * @param[in] angles angles as vector [x, y, z] + * @param[out] dest rotation matrix + */ +CGLM_INLINE +void +glm_eulerv(vec3 angles, mat4 dest) { + float cx, cy, cz, + sx, sy, sz; + + sx = sinf(angles[0]); cx = cosf(angles[0]); + sy = sinf(angles[1]); cy = cosf(angles[1]); + sz = sinf(angles[2]); cz = cosf(angles[2]); + + dest[0][0] = cy * cz; + dest[0][1] = cz * sx * sy + cx * sz; + dest[0][2] =-cx * cz * sy + sx * sz; + dest[1][0] =-cy * sz; + dest[1][1] = cx * cz - sx * sy * sz; + dest[1][2] = cz * sx + cx * sy * sz; + dest[2][0] = sy; + dest[2][1] =-cy * sx; + dest[2][2] = cx * cy; + dest[0][3] = 0.0f; + dest[1][3] = 0.0f; + dest[2][3] = 0.0f; + dest[3][0] = 0.0f; + dest[3][1] = 0.0f; + dest[3][2] = 0.0f; + dest[3][3] = 1.0f; +} + /*! * @brief build rotation matrix from euler angles (zyx) */