kmVec3* const kmMat3RotationToAxisAngle(kmVec3* pAxis, kmScalar* radians, const kmMat3* pIn) { /*Surely not this easy?*/ kmQuaternion temp; kmQuaternionRotationMatrix(&temp, pIn); kmQuaternionToAxisAngle(&temp, pAxis, radians); return pAxis; }
/** * Take the rotation from a 4x4 transformation matrix, and return it as an axis and an angle (in radians) * returns the output axis. */ kmVec3* kmMat4RotationToAxisAngle(kmVec3* pAxis, kmScalar* radians, const kmMat4* pIn) { /*Surely not this easy?*/ kmQuaternion temp; kmMat3 rotation; kmMat4ExtractRotation(&rotation, pIn); kmQuaternionRotationMatrix(&temp, &rotation); kmQuaternionToAxisAngle(&temp, pAxis, radians); return pAxis; }
kmQuaternion* kmQuaternionLookRotation(kmQuaternion* pOut, const kmVec3* direction, const kmVec3* upDirection) { kmMat4 lookAt; kmMat3 rot; kmMat4LookAt(&lookAt, &KM_VEC3_ZERO, direction, upDirection); kmMat4ExtractRotationMat3(&lookAt, &rot); kmQuaternionRotationMatrix(pOut, &rot); kmQuaternionNormalize(pOut, pOut); return pOut; }
kmQuaternion* kmQuaternionLookRotation(kmQuaternion* pOut, const kmVec3* direction, const kmVec3* up) { kmMat3 tmp; kmMat3LookAt(&tmp, &KM_VEC3_ZERO, direction, up); return kmQuaternionNormalize(pOut, kmQuaternionRotationMatrix(pOut, &tmp)); /* if(!direction->x && !direction->y && !direction->z) { return kmQuaternionIdentity(pOut); } kmVec3 right; kmVec3Cross(&right, up, direction); pOut->w = sqrtf(1.0f + right.x + up->y + direction->z) * 0.5f; float w4_recip = 1.0f / (4.0f * pOut->w); pOut->x = (up->z - direction->y) * w4_recip; pOut->y = (direction->x - right.z) * w4_recip; pOut->z = (right.y - up->x) * w4_recip; return kmQuaternionNormalize(pOut, pOut);*/ }