ゲーム内に「投げられた」オブジェクトがいくつかあります。現時点では、これらのオブジェクトに放物線を描くようにして実装しようとしています。オブジェクトの始点、終点、頂点、速度を知っています。
- 任意の時間またはフレームで、x座標とy座標を特定するにはどうすればよいですか?
- 放物線は正しい曲線でもありますか?
ゲーム内に「投げられた」オブジェクトがいくつかあります。現時点では、これらのオブジェクトに放物線を描くようにして実装しようとしています。オブジェクトの始点、終点、頂点、速度を知っています。
回答:
放物線関数のパラメトリックプロットを探しているもの。パラメトリック関数にp∈[0,1]の範囲を使用させるのが最も簡単です。
パラメトリック放物線の標準形は次のとおりです。
k:=ある定数
f_x(p)= 2kp
f_y(p)=kp²
この数式と関数モーフィングにいくつかの基本代数を使用すると、
p∈[0,1]→x、y∈[0,1]
つまり、pを0と1の間に保ち、x、yも0と1の間にあります。
x = p
y = 4p-4p²
したがって、これらの関数を取得すると、探している数値が生成されます。
float total_time = 2;
float x_min = 0;
float x_max = 480;
float y_min = 0;
float y_max = 320;
float f_x( float time )
{
float p = time/total_time;
return x_min + (x_max-x_min)*p;
}
float f_y( float time )
{
float p = time/total_time;
return y_min + (y_max-y_min)*(4*p-4*p*p);
}
f_x
使用していますか?あなたはそれを作る必要がありますf_y
a
x(t) = x0 + vx0*t
y(t) = y0 + vy0*t + .5*ay*t*t
a
そしてt
、単に不十分に選ばれた名前でした。数式に速度成分がないことに注意してください。オイラー運動とパラメトリック放物線は同じものではありませんが、弾道飛行が放物線経路をトレースするので、それらは非常によく似ています。
オブジェクトを動かしたい曲線の方程式を見つけることは、目的を達成するための1つの方法ですが、おそらく最良の方法ではありません。
代わりに、通常はオブジェクトのローカルプロパティ(速度、加速度)を追跡し、これらの値を使用してフレームごとにオブジェクトの位置を更新します。
放物線について説明したので、ボールを2Dで投げて、y軸に沿って落下させたいと考えています。したがって、オブジェクトのy方向の加速度は一定(これをと呼びますg
)であり、x方向の加速度はありません。オブジェクトがスローされると、速度が与えられます。それをvx
と呼びましょうvy
。
次に、アプリケーションのすべてのフレームで、オブジェクトの加速度を速度に追加し、次に速度を位置に追加します。何かのようなもの:
vy += g;
x += vx;
y += vy;
フレームごとにこれを行うと、ボールが動き始めます。これについて知っておくべきことがたくさんありますが、それは始まりです。
ブランドンの答えはかなり良いですが、より高度なものを探している場合は、線形補間をチェックすることをお勧めします:http : //en.wikipedia.org/wiki/Linear_interpolation
また、曲線が関数である場合、特定の時間におけるx座標とy座標(およびz座標)を知ることができます。これも役立つかもしれません:http : //www.ucl.ac.uk/Mathematics/geomath/level2/fvec/fv8.html#l1
コンソールゲームでは、バイキュービック補間を使用してこの問題を解決することがよくあります。最初に、時間tの定期的な間隔でオブジェクトの位置をサンプリングします。発射体の場合、各間隔でその速度[dx / dt、dy / dt]に重力加速度[0、dy / dt / dt]を追加します。そのように生成されたすべての[x、y]座標を配列に記録します。
後で、特定のtに対するオブジェクトの位置[x、y]を再構築するには、記録したバッファーからそのtに最も近い4つのサンプルを読み取ります:[t-1、t、t + 1、t + 2]。リンクされたウィキペディアの記事の係数に従って4つのサンプルをブレンドし、空間でスムーズな動きを取得します。
これは、物理計算をオンザフライで実行するほど物理的に正確ではありませんが、芸術的なライセンスと規模の経済がシミュレーションを支援することを可能にします。