Ease-Outを実行していて、同じ時間間隔でSステップでX1座標からX2座標へのオブジェクトの動きの Ease-Inアニメーション を実行している場合、この動きのX座標を計算する式を提案できる人はいますか?
二次緩和はどこで:
t =現在の時刻
b =開始値
c =値の変更
d =期間
function (float time, float startValue, float change, float duration) {
time /= duration / 2;
if (time < 1) {
return change / 2 * time * time + startValue;
}
time--;
return -change / 2 * (time * (time - 2) - 1) + startValue;
};
実際には、[0;で時間を取得する関数を使用します。 1]および[0;で時間を出力します。 1]、結果を任意のタイプ(2Dベクトル、3Dベクトル、...)に適用できるようにします。
二次イージングのイン/アウトでは、曲線はt
に応じて2つの関数に分けられます。
t
<0.5の場合:f(t) = square(t)
t
> = 0.5の場合:f(t) = 1 - square(t - 1) + 0.5
削減後、Cでは、次のようになります。
float InOutQuadBlend(float t)
{
if(t <= 0.5f)
return 2.0f * square(t);
t -= 0.5f;
return 2.0f * t * (1.0f - t) + 0.5;
}
別の興味深いブレンドカーブは、Bezierによって与えられたもので、非常に最適化されるという利点があります(ifがありません)。 Wolfram で曲線を確認できます。次に、Cコードを示します。
float BezierBlend(float t)
{
return square(t) * (3.0f - 2.0f * t);
}
編集:
@ DannyYaroslavskiが提案するもう1つの方法は、提案された単純な式 here です。
それはパラメトリックであり、ニースのイン/アウトの加速と減速を取得します。
Alpha = 2の場合、次の関数を取得します。
これはCで次のように翻訳されます:
float ParametricBlend(float t)
{
float sqt = square(t);
return sqt / (2.0f * (sqt - t) + 1.0f);
}
同じ問題が発生しました。チャート_(Ease in-out)
_をアニメーション化したかったのです。
Brainstormには2つの方法がありました。
1)トリゴノメトリー式。まず、y=(sin(x/π*10-π/2)+1)/2
を書きました。これはsin^2((5*x)/π)
です
_float TrygoEase (float x) {
float y=(float)Math.pow(Math.sin(5*x/Math.PI),2);
return y;
}
_
2)2つの放物線。難しくありませんでした。 _y=2*x*x
_で_[0;0.5]
_を使用し、_[0.5;1]
_でy=-2(x-1)^2+1
を使用しました
_float ParabolEase(float x) {
float y=2*x*x;
if(x>0.5f){
x-=1;
y=-2*x*x+1;
}
return y;
}
_
この方法を_x=[0;1]
_に使用します。これは_y=[0;1]
_も返します。
これで、このグラフを比較できます。