移動するターゲットに当たるショットの角度と速度を計算する方法は?


11

私は2D Androidゲームを開発しており、AIの発射物がパスをたどって、または自由に移動して敵を攻撃するための照準アルゴリズムを作成しています。現時点では、ある距離の後にターゲットがどこに位置するかを計算し、その距離でそれを満たすために発射体を発射します。もちろん、これは、目標を満たすために発射速度を変化させることを意味します。

発射体がいつ発射する必要があるか、一定速度でのみ移動できる場合はどこを狙う必要があるかを計算するためのシンプルなアルゴリズム(最適なアルゴリズム)のヒントはありますか?発射体がターゲットの2倍の速度で移動するとしますか?

私が考えることができる唯一の方法は検索を伴うもので、かなり大きいようです。



@JohnMcDonald:線形ではなく、放物線状の発射体に関するものであるため、あまり関係ありません。これは、はるかに近いです:gamedev.stackexchange.com/questions/4995/...
E100

回答:


13

私が作成したタワーディフェンスゲームでは、2次方程式を使用して交差点を予測し、それにより目標点を予測しました。次の照準コードスニペットは、敵が一定の速度と方向で移動していることを前提としています。また、発射体が既知の一定の速度で移動することも想定しています(任意の速度でかまいませんが、アルゴリズムで認識されている必要があります)。

Vector totarget =  target.position - tower.position;

float a = Vector.Dot(target.velocity, target.velocity) - (bullet.velocity * bullet.velocity);
float b = 2 * Vector.Dot(target.velocity, totarget);
float c = Vector.Dot(totarget, totarget);

float p = -b / (2 * a);
float q = (float)Math.Sqrt((b * b) - 4 * a * c) / (2 * a);

float t1 = p - q;
float t2 = p + q;
float t;

if (t1 > t2 && t2 > 0)
{
    t = t2;
}
else
{
    t = t1;
}

Vector aimSpot = target.position + target.velocity * t;
Vector bulletPath = aimSpot - tower.position;
float timeToImpact = bulletPath.Length() / bullet.speed;//speed must be in units per second

それはインパクトの時間も決定するので、その時間にターゲットの位置でインパクトグラフィックスを呼び出すために貼り付けられる時間まで待つだけでした...衝突を検出してヒットを決定する必要はありません。


「衝突を検出するために衝突を検出する必要はありません。」-ターゲットが速度と方向を維持するように制限されている場合。---ただし、アクティブなAIを持っているか、より悪いのはプレイヤーであり、射手が発砲した後に移動できる場合、衝突検出ではなく時間に基づいてヒットを基にすると、プレイヤーベースにつながりますいくつかの厄介なバグ/不具合として認識されます。
XenoRo 2015

@TheLimaうん、答えの2番目の文にあるように。;-)
スティーブH

これは私のシナリオにはほぼ完璧ですが、これら2つの追加変数をどのように考慮に入れますか?発射体の加速、タワー自体の動き?
ジャック

a0 とは何ですか?これはゼロ除算の例外を生成しますが、これは変数tの観点から何を意味しますか?「非常に大きな数」と見なす必要がありますか、それとも最良のケースは何ですか?
firelynx 2016年

この背後にある直感に入る良い本はありますか?私はあなたがこの数学を探すことをどうやって知っていたのか知​​りたいです...
davidkomer

4

ここに画像の説明を入力してください

AI、発射体が発射されている間のターゲットの位置、および死点でのターゲットの最終的な位置は三角形を形成します。

  1. 発射速度である辺の長さa
  2. 目標速度である辺の長さb
  3. ターゲットのモーションのターゲットのモーションの角度。

あなたは三角形の3つの部分、SSAケースを持っているので、このように解決してください

  1. 動きの角度とAIの場所に基づいて角度Bを見つける
  2. 正弦の法則を使用して角度Aを見つける

角度Aでは、発射体を発射する角度を決定できます。

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