Added Quat_FromPitchYawRoll() helper function. (#25)

Quickly converts pitch, yaw, and roll rotations to the Quaternion equivalent orientation, with optimized code.
This commit is contained in:
Thompson Lee 2016-08-22 16:14:26 -04:00 committed by fincs
parent ae0ce14c9d
commit 8a3982d625
2 changed files with 37 additions and 0 deletions

View File

@ -668,4 +668,13 @@ static inline C3D_FVec FVec3_CrossQuat(C3D_FVec v, C3D_FQuat q)
// v×q = q^-1×v
return Quat_CrossFVec3(Quat_Inverse(q), v);
}
/**
* @brief Converting Pitch, Yaw, and Roll to Quaternion equivalent
* @param[in] pitch The pitch angle in radians.
* @param[in] yaw The yaw angle in radians.
* @param[in] roll The roll angle in radians.
* @return C3D_FQuat The Quaternion equivalent with the pitch, yaw, and roll orientations applied.
*/
C3D_FQuat Quat_FromPitchYawRoll(float pitch, float yaw, float roll, bool bRightSide);
///@}

View File

@ -0,0 +1,28 @@
#include <c3d/maths.h>
C3D_FQuat Quat_FromPitchYawRoll(float pitch, float yaw, float roll, bool bRightSide)
{
float pitch_c = cosf(pitch / 2.0f);
float pitch_s = sinf(pitch / 2.0f);
float yaw_c = cosf(yaw / 2.0f);
float yaw_s = sinf(yaw / 2.0f);
float roll_c = cosf(roll / 2.0f);
float roll_s = sinf(roll / 2.0f);
if (bRightSide)
{
return Quat_New(
pitch_s * yaw_c * roll_c - pitch_c * yaw_s * roll_s,
pitch_c * yaw_s * roll_c + pitch_s * yaw_c * roll_s,
pitch_c * yaw_c * roll_s - pitch_s * yaw_s * roll_c,
pitch_c * yaw_c * roll_c + pitch_s * yaw_s * roll_s);
}
else
{
return Quat_New(
pitch_s * yaw_c * roll_c + pitch_c * yaw_s * roll_s,
pitch_c * yaw_s * roll_c - pitch_s * yaw_c * roll_s,
pitch_c * yaw_c * roll_s + pitch_s * yaw_s * roll_c,
pitch_c * yaw_c * roll_c - pitch_s * yaw_s * roll_s);
}
}