0

オブジェクトの動きを決定する 3 つの値があります: velocityacceleration、およびmaxVelocity。またdistance、ターゲット (基本的には X) にどれだけ近いかを決定する値もあります。このコードは各フレームを実行して、3 つの値に基づいて実際の動きを判断します。

var velocityDelta = (Math.max(Math.min(velocity + (acceleration * 0.016), maxVelocity), -maxVelocity) - velocity) / 2;
velocity += velocityDelta;
var delta = velocity*0.016;
velocity += velocityDelta;
distance -= delta;

それvelocityDeltaが少し混乱している場合、基本的には次のとおりです。

velocityDelta = velocity + (acceleration * 0.016);
if (velocityDelta > maxVelocity) velocityDelta = maxVelocity;
else if (velocityDelta < -maxVelocity) velocityDelta = -maxVelocity;
velocityDelta = (velocityDelta - velocity) / 2;

ここで、 の値のみを変更できると仮定すると、正確に 0 になるaccelerationようにするために必要な加速度を計算する方法はありますか? distance上記のコードが実行されるフレームの 1 つの間に意味がありますdistance - delta == 0。したがって、コードが次のようになっているとします。

var distance = 300.5;
var velocity = 125.86;
var maxVelocity = 300;
while (distance != 0) {
    acceleration = ?
    var velocityDelta = (Math.max(Math.min(velocity + (acceleration * 0.016), maxVelocity), -maxVelocity) - velocity) / 2;
    velocity += velocityDelta;
    var delta = velocity*0.016;
    velocity += velocityDelta;
    distance -= delta;
}

accelerationループが永久に実行されないようにするには、どのような値を設定しますか? 距離/速度/最大は、変更できない任意の数値であると仮定します。

4

1 に答える 1

0

あなたの問題はかなり制約されていません。最善の解決策は、減速すること (つまり、速度とは反対の方向に加速すること)maxVelocityであり、問​​題にはならないと思います。

まず、オブジェクトがターゲットに到達するまでの時間間隔を調べます (加速がない場合)。

var dt = 0.016;
var jumps = distance/(dt * velocity);   <-- round DOWN

distance次に、その時間内に移動するためにいくつかの基本的な物理法則を適用します。

x = vt + at^2/2
a = 2(x-vt)/t^2
acceleration = 2*(distance - velocity*jumps*dt)/(jumps*dt*jumps*dt); 

これはかなりうまくいきます。少し気になるところがありますが、今のところ追跡する気はありません-おそらくコード内のクラッジをキャンセルします。

于 2013-03-22T05:08:42.840 に答える