2

オブジェクトが 2D 世界でターゲット位置に向かって移動し、 vector として保存されるシミュレーションを書いていますtarget(x,y)。オブジェクトの位置も位置ベクトルpos(x,y)として保存されます。dv(x,y)オブジェクトには、目的の移動速度と現在の移動速度 の2 つのベクトルが含まれていcv(x,y)ます。シミュレーションの開始時には、これらの速度ベクトルは両方とも初期値、つまり に設定されてい(0,0)ます。

オブジェクトがターゲット位置に向かって移動する必要がある場合は、目的の速度ベクトルを計算し、dvそれを正規化し、移動速度の値でスケーリングします。

dv.set(target).sub(pos).normalize()
dv.scale(speed)

動きをよりリアルに見せたいので、2 つの速度ベクトルを使用します。dvオブジェクトを動かしたい最高速度を伝え、cvオブジェクトが現在動いている実際の速度を保持します。

次に、各フレーム (更新ステップ) で、現在の速度が目的の速度と加速度値cvに基づいて設定されます。これは、 と の差を単純に計算して、この差を にクランプすることによって行われます。このようにして、オブジェクトはゆっくりと動き始め、徐々に加速して最終的に全速力に達します。dvacccvdvacc

これまでのところ、これはうまく機能しています。acc今度は減速にも活用したいです。posとの間の距離がtarget特定の値にあるとき、目標の位置で完全に停止するまでオブジェクトが徐々に減速するように、目的の速度dvを に設定する必要があります。(0,0)

私の質問は、どの距離に設定dvする必要があるか(0,0)(つまり、システムに動きを停止するように指示する) をどのように計算して、オブジェクトが正しく減速して目標位置で正確に停止するかです。

4

2 に答える 2

1

モーションの離散時間シミュレーションを行っています。物事を単純にする 1 つの方法は、加速と減速が対称になるように計算を実行することです。つまり、加速中の移動距離と減速中の移動距離は同じでなければなりません。例として、

  • 加速は5
  • 最高速は13
  • オブジェクトは最高速度に達するとすぐに減速を開始します

離散時間シミュレーションがどのように進行するかを次に示します。

first tick
  old speed = 0
  new speed = 5
  distance  = 5

second tick
  old speed = 5
  new speed = 10
  distance  = 15

third tick
  old speed = 10
  new speed = 13
  distance  = 28  <-- total distance while accelerating

fourth tick
  old speed = 13
  distance  = 41
  new speed = 10  <-- not 8!!!

fifth tick
  old speed = 10
  distance  = 51
  new speed =  5

sixth tick
  old speed =  5
  distance  = 56  <-- Yay, twice the distance, we have symmetry
  new speed =  0

ここで重要なポイントが 2 つあります

  • 加速中は速度が最初に更新され、次に距離が更新されます。減速中は順序が逆になり、距離が更新されてから速度が更新されます。
  • 減速するときは、調整された速度を加速度の倍数として維持することが重要です

C プログラミング言語では、次のコードを使用して、減速中に速度を更新できます。

if ( old_speed % acceleration != 0 )                   // if speed is not a multiple of acceleration
   new_speed = old_speed - old_speed % acceleration;   //   reduce speed to a multiple of acceleration
else                                                   // otherwise
   new_speed = old_speed - acceleration;               //   reduce speed by acceleration

加速と減速が対称である場合、減速距離の計算は加速距離の計算と同じです。

distance = acceleration * (1+2+3+ ... +N) + fudge_factor

どこ

  • Ntop_speed / acceleration整数に切り捨てられます。13/5 ==> 2
  • fudge_factor0最高速度が加速度の倍数である場合、または そうtop_speedでない場合

計算は、次のことに注意することで単純化できます。

1+2+3+ ... +N = N * (N+1) / 2

C では、減速中に移動した合計距離は次のように計算できます。

int top_speed = 13;
int acceleration = 5;

int N = top_speed / acceleration;     // Note: in C, integer division truncates

int fudge = 0;
if ( top_speed % acceleration != 0 )
    fudge = top_speed;

int distance = acceleration * (N * (N+1)) / 2 + fudge;
于 2015-01-06T03:34:25.187 に答える