1

円運動の速度をスムーズに増減する方法を探しています。

円のパラメトリック方程式を使用して、時間の経過とともに円内のオブジェクトを移動できます。

x = center_x + radius * sin(time * speed)
y = center_y + radius * cos(time * speed)

このアプローチの問題は、speed = speed + 1動きがぎくしゃくするため、オブジェクトを加速するために単純に行うことができないことです。x値とy値は、オブジェクトの前の位置を基準にするのではなく、絶対値に基づいてフレームごとに再計算されるため、これは理にかなっています。

別のアプローチは、オブジェクトの速度を表すベクトルを使用し、代わりに円運動をベクトルに適用することです。

v_x = radius * sin(time * speed)
v_y = radius * cos(time * speed)
x = x + v_x
y = y + v_y

このアプローチの問題は、速度を変更すると半径が拡大または縮小することです。これは、動きが現在の位置を基準にしているため、速度を変更すると基本的に時間がスキップされるため、理にかなっています。

私が考えることができる1つの実装は、オブジェクトから円の中心を指すベクトルを使用することです。次に、垂直ベクトルを使用してオブジェクトの位置での円の接線を計算し、それを正規化し、速度でスケーリングすることができます。このような問題ではやり過ぎのように思われるため、まだ実装していません。もっと簡単な解決策があるかどうか教えてください。ありがとう!

4

7 に答える 7

6

速度は角度の変化率であり、速度の変化は最後の間隔の角度の変化にのみ影響するため、次のようになります。

delta = time - lastTime
angle = angle + delta * speed

x = center_x + radius * sin(angle)
y = center_y + radius * cos(angle)

lastTimeは最後のサイクルの時間を保持する必要があります。

于 2009-06-03T19:28:13.980 に答える
4

あなたはそれを自分で言いました:あなたは角速度を変えたいのです。現在、現実の世界では、角速度の変化はオブジェクトの角不活性化によって制限されています。これは、1のステップで「離散」することができないことを意味します。

むしろ、角速度は角加速度の積分です。角位置は角速度の積分です。

したがって、一定の角加速度の場合、次のように言うことができます

速度(t)= t * acc + vel [t=0]

angle(t)= t 2 * acc / 2 + vel [t = 0] * t + angle [t=0]

次に、角度のsinとcosを使用してカルテシアンの位置を計算できます。

角加速度は離散的に(かなり)変化する可能性があります。

于 2009-06-03T19:47:26.327 に答える
3

単に実行しているだけでは、アクセラレーションを正しく使用していませんspeed = speed + 1。より一般的には、これを実行します。

accel = 1;
speed = speed + (accel * timeDelta);

また、accel = 1は、ラジアン単位での非常に大きな角速度の変化です。たとえば、より小さな値を試してくださいPI / 16。加速度をそれほど大きくする必要があり、ぎくしゃくした動きの視認性を最小限に抑えたい場合は、モーションブラーを使用してみてください。

于 2009-06-03T19:30:28.173 に答える
3

角速度をスムーズに上げるには、角加速度を加える必要があります

x=半径*cos(シータ)
y=半径*sin(シータ)

theta(t)= theta(0)+ omega(0)* t + 0.5 * alpha * t ^ 2

ここで、tは時間、theta(0)は時間0での角位置、omega(0)は時間0での角速度(速度パラメーターに等しい)、alphaは角加速度パラメーターです。適切なもの。

于 2009-06-03T19:34:59.723 に答える
2

使用する

time * speed

円がどこまで移動したかを示すのは間違っています。速度が決して変わらない場合にのみ意味があります。

代わりに、移動距離を変数に保存してから、現在の速度と最後の描画からの時間間隔に応じた量だけ変数を増やす必要があります。

他の人が加速を使用しなければならない提案も良いです。次のようなものを試してください

v = v + a;
d = d + delta * v;

x = center_x + radius * sin(d)
y = center_y + radius * cos(d)
于 2009-06-03T19:52:21.920 に答える
0
x = center_x + radius * sin(time * speed + offset)
y = center_y + radius * cos(time * speed + offset)

def change_speed(new_speed):
    offset = time * (speed - new_speed) + offset
    speed = new_speed

offset0または実際には任意の値から開始できます...連続性を維持するために使用されます。

time * old_speed + old_offset == time * new_speed + new_offset
于 2009-06-03T19:42:29.833 に答える
0

これを角速度の観点から考える必要があります。角度、シータを時間として計算しています*速度は、速度が従来の速度の感覚、つまり距離/時間である場合は意味がありません。角速度は角度/時間(つまり、ラジアン/秒または度/秒)です。従来の速度は、角速度を適用した後の開始点と終了点の間の距離/時間になります。

于 2009-06-03T19:30:56.220 に答える