|
|
|
@ -481,9 +481,9 @@ void QuaternionT<T>::from_axis_angle(const Vector3<T> &axis, T theta)
@@ -481,9 +481,9 @@ void QuaternionT<T>::from_axis_angle(const Vector3<T> &axis, T theta)
|
|
|
|
|
q2=q3=q4=0.0f; |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
const T st2 = sinF(theta/2.0f); |
|
|
|
|
const T st2 = sinF(0.5*theta); |
|
|
|
|
|
|
|
|
|
q1 = cosF(theta/2.0f); |
|
|
|
|
q1 = cosF(0.5*theta); |
|
|
|
|
q2 = axis.x * st2; |
|
|
|
|
q3 = axis.y * st2; |
|
|
|
|
q4 = axis.z * st2; |
|
|
|
@ -507,7 +507,7 @@ void QuaternionT<T>::to_axis_angle(Vector3<T> &v) const
@@ -507,7 +507,7 @@ void QuaternionT<T>::to_axis_angle(Vector3<T> &v) const
|
|
|
|
|
v = Vector3<T>(q2,q3,q4); |
|
|
|
|
if (!is_zero(l)) { |
|
|
|
|
v /= l; |
|
|
|
|
v *= wrap_PI(2.0f * atan2f(l,q1)); |
|
|
|
|
v *= wrap_PI(2.0f * atan2F(l,q1)); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -531,11 +531,11 @@ void QuaternionT<T>::from_axis_angle_fast(Vector3<T> v)
@@ -531,11 +531,11 @@ void QuaternionT<T>::from_axis_angle_fast(Vector3<T> v)
|
|
|
|
|
template <typename T> |
|
|
|
|
void QuaternionT<T>::from_axis_angle_fast(const Vector3<T> &axis, T theta) |
|
|
|
|
{ |
|
|
|
|
const T t2 = theta/2.0f; |
|
|
|
|
const T t2 = 0.5*theta; |
|
|
|
|
const T sqt2 = sq(t2); |
|
|
|
|
const T st2 = t2-sqt2*t2/6.0f; |
|
|
|
|
|
|
|
|
|
q1 = 1.0f-(sqt2/2.0f)+sq(sqt2)/24.0f; |
|
|
|
|
q1 = 1.0f-(0.5*sqt2)+sq(sqt2)/24.0f; |
|
|
|
|
q2 = axis.x * st2; |
|
|
|
|
q3 = axis.y * st2; |
|
|
|
|
q4 = axis.z * st2; |
|
|
|
@ -550,13 +550,13 @@ void QuaternionT<T>::rotate_fast(const Vector3<T> &v)
@@ -550,13 +550,13 @@ void QuaternionT<T>::rotate_fast(const Vector3<T> &v)
|
|
|
|
|
if (is_zero(theta)) { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
const T t2 = theta/2.0f; |
|
|
|
|
const T t2 = 0.5*theta; |
|
|
|
|
const T sqt2 = sq(t2); |
|
|
|
|
T st2 = t2-sqt2*t2/6.0f; |
|
|
|
|
st2 /= theta; |
|
|
|
|
|
|
|
|
|
//"rotation quaternion"
|
|
|
|
|
const T w2 = 1.0f-(sqt2/2.0f)+sq(sqt2)/24.0f; |
|
|
|
|
const T w2 = 1.0f-(0.5*sqt2)+sq(sqt2)/24.0f; |
|
|
|
|
const T x2 = v.x * st2; |
|
|
|
|
const T y2 = v.y * st2; |
|
|
|
|
const T z2 = v.z * st2; |
|
|
|
@ -578,7 +578,7 @@ void QuaternionT<T>::rotate_fast(const Vector3<T> &v)
@@ -578,7 +578,7 @@ void QuaternionT<T>::rotate_fast(const Vector3<T> &v)
|
|
|
|
|
template <typename T> |
|
|
|
|
T QuaternionT<T>::get_euler_roll() const |
|
|
|
|
{ |
|
|
|
|
return (atan2f(2.0f*(q1*q2 + q3*q4), 1.0f - 2.0f*(q2*q2 + q3*q3))); |
|
|
|
|
return (atan2F(2.0f*(q1*q2 + q3*q4), 1.0f - 2.0f*(q2*q2 + q3*q3))); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// get euler pitch angle
|
|
|
|
@ -592,7 +592,7 @@ T QuaternionT<T>::get_euler_pitch() const
@@ -592,7 +592,7 @@ T QuaternionT<T>::get_euler_pitch() const
|
|
|
|
|
template <typename T> |
|
|
|
|
T QuaternionT<T>::get_euler_yaw() const |
|
|
|
|
{ |
|
|
|
|
return atan2f(2.0f*(q1*q4 + q2*q3), 1.0f - 2.0f*(q3*q3 + q4*q4)); |
|
|
|
|
return atan2F(2.0f*(q1*q4 + q2*q3), 1.0f - 2.0f*(q3*q3 + q4*q4)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// create eulers from a quaternion
|
|
|
|
@ -772,7 +772,7 @@ T QuaternionT<T>::roll_pitch_difference(const QuaternionT<T> &v) const
@@ -772,7 +772,7 @@ T QuaternionT<T>::roll_pitch_difference(const QuaternionT<T> &v) const
|
|
|
|
|
const T vec_len_div2 = constrain_float(vec_diff.length() * 0.5, 0.0, 1.0); |
|
|
|
|
|
|
|
|
|
// calculate and return angular difference
|
|
|
|
|
return (2.0 * asinf(vec_len_div2)); |
|
|
|
|
return (2.0 * asinF(vec_len_div2)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// define for float and double
|
|
|
|
|