3D の向きを補間するための一般的なslerp
式は非常にクールで便利ですが、これは線形アニメーションであることに気づきました。
フロート間の単純なトゥイーンなどのそれほど複雑でないアニメーションは、2 次イーズインおよびイーズアウトに簡単に変更できますが、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
これを(経過時間/期間)に基づいてイージング補間にする方法を知っている人はいますか?