時間の経過に伴う曲線に沿ったオブジェクトの位置の特定


8

ゲーム内に「投げられた」オブジェクトがいくつかあります。現時点では、これらのオブジェクトに放物線を描くようにして実装しようとしています。オブジェクトの始点、終点、頂点、速度を知っています。

  1. 任意の時間またはフレームで、x座標とy座標を特定するにはどうすればよいですか?
  2. 放物線は正しい曲線でもありますか?

入力があいまいです。頂点は凝視位置を意味すると思います。そして、終点は終了位置を意味します。速度とはどういう意味ですか?オブジェクトは1秒でどのくらい移動できますか?オブジェクトが最初から最後まで到達するのにかかる時間はどれくらいですか?
deft_code

不明確であることをお詫びします。私はそれを簡単にしようとします-私はボールを画面の片側(x = 0)から反対側(x = 480)に移動させたいです。 320(途中、x = 240)。2秒かけてこれを実行します。この情報から、数式から各フレームのx座標とy座標を決定できますか?
ベンウィリアムズ

回答:


4

放物線関数のパラメトリックプロットを探しているもの。パラメトリック関数に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);
}

あなたの表記は少し紛らわしいです。半分の速度としてs加速度をf_x使用していますか?あなたはそれを作る必要がありますf_yax(t) = x0 + vx0*ty(t) = y0 + vy0*t + .5*ay*t*t
トビアス・キエンツラー

オイラーモーション式は意図的に使用していません。 aそしてt、単に不十分に選ばれた名前でした。数式に速度成分がないことに注意してください。オイラー運動とパラメトリック放物線は同じものではありませんが、弾道飛行が放物線経路をトレースするので、それらは非常によく似ています。
deft_code

4

オブジェクトを動かしたい曲線の方程式を見つけることは、目的を達成するための1つの方法ですが、おそらく最良の方法ではありません。

代わりに、通常はオブジェクトのローカルプロパティ(速度、加速度)を追跡し、これらの値を使用してフレームごとにオブジェクトの位置を更新します。

放物線について説明したので、ボールを2Dで投げて、y軸に沿って落下させたいと考えています。したがって、オブジェクトのy方向の加速度は一定(これをと呼びますg)であり、x方向の加速度はありません。オブジェクトがスローされると、速度が与えられます。それをvxと呼びましょうvy

次に、アプリケーションのすべてのフレームで、オブジェクトの加速度を速度に追加し、次に速度を位置に追加します。何かのようなもの:

vy += g;
x += vx;
y += vy;

フレームごとにこれを行うと、ボールが動き始めます。これについて知っておくべきことがたくさんありますが、それは始まりです。


2Dでボールを投げていますが、ボールにはX方向の加速度があります。画面の片側から反対側に投げてもらいたい(元の質問のコメントを参照)。vxとvyに基づいて更新する方法を理解していますが、それらの値自体を更新する方法がわかりません。
ベンウィリアムズ

2
@Ben Williams最初にvxとvyを設定するだけです。フレームごとにvyに重力を追加します。また、vxとvyの両方に1未満の数を掛けることで摩擦が生じる可能性があります(.95のようなものがフレームレートによっては機能する場合があります)。グーグルで「弾むボールYourProgrammingLanguageHere」を検索すると、基本的だが役立つチュートリアルが表示されるはずです。
AttackingHobo

3
実際、オブジェクトが放物線の軌道をたどっていることがわかっている場合は、離散的な物理ステップではなく、曲線関数として実装する方がはるかに優れています。はい、最初はコーディングするのが「難しい」かもしれませんが、結果として、オブジェクトの動きがフレームレートの問題から切り離されます。
Blair Holloway、

1
私は@Blairを2番目に使用します。物理フレームレートをビデオフレームレートから分離しない限り、これはクリッピングエラーのような恐ろしい効果を引き起こす可能性があります
Tobias Kienzler


0

コンソールゲームでは、バイキュービック補間を使用してこの問題を解決することがよくあります。最初に、時間tの定期的な間隔でオブジェクトの位置をサンプリングします。発射体の場合、各間隔でその速度[dx / dt、dy / dt]に重力加速度[0、dy / dt / dt]を追加します。そのように生成されたすべての[x、y]座標を配列に記録します。

後で、特定のtに対するオブジェクトの位置[x、y]を再構築するには、記録したバッファーからそのtに最も近い4つのサンプルを読み取ります:[t-1、t、t + 1、t + 2]。リンクされたウィキペディアの記事の係数に従って4つのサンプルをブレンドし、空間でスムーズな動きを取得します。

これは、物理計算をオンザフライで実行するほど物理的に正確ではありませんが、芸術的なライセンスと規模の経済がシミュレーションを支援することを可能にします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.