Added alternative implementation of SLERP

This commit is contained in:
Christophe Riccio 2011-02-08 11:59:00 +00:00
parent b8190d15d9
commit 75af4af789
2 changed files with 38 additions and 1 deletions

View File

@ -148,7 +148,7 @@ namespace glm
detail::tquat<T> const & q1,
detail::tquat<T> const & q2);
//! Returns a LERP interpolated quaternion of x and y according a.
//! Returns a SLERP interpolated quaternion of x and y according a.
//! From GLM_GTC_quaternion extension.
template <typename T>
detail::tquat<T> mix(

View File

@ -369,6 +369,43 @@ namespace quaternion{
k0 * x.z + k1 * y2.z);
}
template <typename T>
inline detail::tquat<T> mix2
(
detail::tquat<T> const & x,
detail::tquat<T> const & y,
T const & a
)
{
bool flip = false;
if(a <= T(0)) return x;
if(a >= T(1)) return y;
T cos_t = dot(x, y);
if(cos_t < T(0))
{
cos_t = -cos_t;
flip = true;
}
T alpha(0), beta(0);
if(T(1) - cos_t < 1e-7)
beta = T(1) - alpha;
else
{
T theta = acos(cos_t);
T sin_t = sin(theta);
beta = sin(theta * (T(1) - alpha)) / sin_t;
alpha = sin(alpha * theta) / sin_t;
}
if(flip)
alpha = -alpha;
return normalize(beta * x + alpha * y2);
}
template <typename T>
inline detail::tquat<T> conjugate
(