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:
parent
ae0ce14c9d
commit
8a3982d625
@ -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);
|
||||
///@}
|
||||
|
28
source/maths/quat_frompitchyawroll.c
Normal file
28
source/maths/quat_frompitchyawroll.c
Normal 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);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user