5

「ダンピング」プロパティを使用して、オブジェクトの速度を徐々に下げようとしています。その後、速度を使ってオブジェクトの位置を動かしたいと思います。これは次のようになります。

velocity.x *= velocity.damping;
velocity.y *= velocity.damping;
x += velocity.x;
y += velocity.y;

それよりもはるかに単純ではなく、正常に機能しますが、ここに私の問題があります。ゲームループの最後の更新にかかった時間(秒単位)を含むdeltaTime変数を使用しています。速度の適用は非常に簡単です。

x += velocity.x * deltaTime;
y += velocity.y * deltaTime;

しかし、ダンピングプロパティを乗算するときにdeltaTimeをどのように説明できますか?私の考えは、次のように、xまたはyの変位を見つけて、それにdeltaTimeを掛けることでした。

velocity.x += (velocity.x * velocity.damping - velocity.x) * deltaTime;
velocity.y += (velocity.y * velocity.damping - velocity.y) * deltaTime;

それは機能しないことが判明しました。理由はよくわかりませんが、テストするとさまざまな結果が得られます。単にダンピングを無視するか、1.0に設定すると、すべてが機能するため、問題は最後の2行にあるはずです。

4

1 に答える 1

10
velocity.x += (velocity.x * velocity.damping - velocity.x) * deltaTime;

つまり、減衰ではなく、一定の加速があります。

velocity.x * (1 - velocity.damping)

は、1時間単位で現在の値から速度をデクリメントする量です。これは現在の速度に比例するため、次の時間単位では、減衰係数を使用して速度を少しだけデクリメントします。ただし、を掛けるとdeltaTime、すべてのdeltaTime時間単位の開始値から計算された同じ量が減算されます。

減衰係数を0.9、とすると、各時間単位で速度を10分の1に減らします。一次方程式(を掛けるdeltaTime)を使用する場合、10時間単位の後、速度は0になり、11の後、方向が切り替わります。の初速度から始めて段階的に進むとv_0 = 1、次のようになります。

v_1 = v_0*0.9 = 0.9
v_2 = v_1*0.9 = 0.81
v_3 = v_2*0.9 = 0.729
v_4 = v_3*0.9 = 0.6561

など、速度のゆっくりとした減少。の式を展開するとv_4、次のようになります。

v_4 = v_3*0.9 = v_2*0.9*0.9 = v_1*0.9*0.9*0.9 = v_0*0.9*0.9*0.9*0.9 = v_0 * 0.9^4

したがって、一般化すると、式は次のようになります。

velocity.x *= Math.pow(velocity.damping, deltaTime);

(アクションスクリプトは、その関数が呼び出される点でECMAスクリプトと同じであると想定しています。)

もちろん同様にvelocity.y

于 2012-12-23T20:10:47.270 に答える