虽然在 3D 方向之间插值的流行slerp
公式非常酷且有用,但我突然想到这是一个线性动画。
不太复杂的动画,例如浮动之间的简单补间,很容易更改为二次缓入和缓出,但slerp
公式并非如此简单(其发明者 Shoemake 在最初发现时甚至没有公布公式的推导)。
所以我用这个:
template <typename T>
inline QuaternionT<T> QuaternionT<T>::Slerp(T t, const QuaternionT<T>& v1) const
{
const T epsilon = 0.0005f;
T dot = Dot(v1);
if (dot > 1 - epsilon) {
QuaternionT<T> result = v1 + (*this - v1).Scaled(t);
result.Normalize();
return result;
}
if (dot < 0)
dot = 0;
if (dot > 1)
dot = 1;
T theta0 = std::acos(dot);
T theta = theta0 * t;
QuaternionT<T> v2 = (v1 - Scaled(dot));
v2.Normalize();
QuaternionT<T> q = Scaled(std::cos(theta)) + v2.Scaled(std::sin(theta));
q.Normalize();
return q;
}
有谁知道如何根据t
(经过/持续时间)使其成为缓动插值?