2

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これを(経過時間/期間)に基づいてイージング補間にする方法を知っている人はいますか?

4

1 に答える 1

2

tlerping 自体ではなく、lerping の「容易さ」を制御するのは の変化率です。Tこれはスカラー (float/double など) であると想定しています。

AFAICT、イーズイン効果を得ようとしていますが、パス自体は開始クォータニオンと終了クォータニオンの間の「まっすぐな」回転です。tしたがって、 0 から 1 まで変化する限り、t の変化率を変化させて「イージング補間」を取得するだけです。

私は通常、3*t^2-2*t^3イーズイン/イーズアウトの式を使用します。念のため、ウィキペディアのリンクをここに残しておきます。

(ここで何かが足りないような気がします。これがあなたの質問に答えたかどうか教えてください)。

于 2013-04-25T05:28:03.573 に答える