|
|
@@ -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
|
|
|
(
|