遮断のベクトルを計算する方法は?


11

2次元空間と1つの友好的な宇宙船が静止していて、1人の敵が実際の位置、速度、方向がわかっている友好的な船に直接移動していません。

友好的な船は、敵と戦うために射程内にそれ自体を入れたいと思っています。

実際には、実際の位置を移動する船に直接ベクトルを設定し、フレームごとに再計算して、ある種の「丸い」飛行経路を作成しています。

私が欲しいのは、敵がそれまでのコースを変更しないと仮定して、射程距離に到達したときに敵が(おそらく)持つであろう位置に直接直線のパスを設定することです。

最初の「単純な」実装として、友人がすぐに0から最大にスピードアップできると想定すれば十分です。

優先される実装は、友人の加速機能を考慮したものであり、速度のためにインターセプトが不可能である場合を知っています。静止状態からだけでなく、あらゆる始動速度で機能するはずです。プラスは、それがブレーキングさえ考慮している場合です(光速での戦いは、与えられた宇宙では非常にエネルギー効率が悪いです)

回答:


5

あなたの質問を理解したら、あなたは船が目標に向かって操縦するのではなく、たまたま目標を迎撃する直線で飛行することを望みます。私は基本的にタワーの弾丸と同じ必要性があるタワーディフェンスゲームを作成しています。タワーは、速度/方向を変更しない限り、弾丸が移動中のターゲットを妨害するように銃を発射したいと考えています。私がそれを解決した方法は、二次方程式を使用することでした。ここにいくつかの擬似コードがあります:

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

これはうまく機能しているので、ショットの衝突検出は必要ありませんでした。これらの要素が安定している限り、ターゲットの距離/方向/速度に関係なく、ブルズアイに当たるすべてのショットを当てにすることができました。


あなたの説明から、これは私が探しているもののようです、少なくとも最高速度への瞬間的な加速を想定する簡単な方法。これについては夕方に詳しく見ていきます。Vector.Dotがtoの内積をベクトルに返すことは正しいと思いますか?
NobbZ

うーん...ルビーでやったのですが、何かおかしいようです。sqrtの式は否定的なものに評価され、範囲外であるため、私が試すたびに例外がスローされます。どうすればこれを処理できますか?質問には申し訳ありませんが、私はこれしか使用できませんが、誰かが私にアドバイスをするまで、ここの内容を理解しないでください。
NobbZ

例では、この本からだった:amazon.com/...
スティーブH

1
これが役立つかどうかはわかりませんが、同じことを実行するpythonコードを次に示します。moddb.com/mods/wicmw/tutorials/...
スティーブH

OK、私はまだ背後にある穴の数学を理解していませんが、Pythonコードのthxです、ドキュメントは私にsqrt内に負の値がある場合、私の友人は追いつくのを遅くするべきだと言っていました。テスト値を微調整した後、いくつかの結果が得られます。あなたの助けのためのThx。
NobbZ

6

ステアリングの挙動を調べることをお勧めします。特に追求。ソースコードはOpenSteerの実装にあるか、「プログラミングゲームAIの例」(ISBN 13:978-1556220784)などの本を検索できます。


追跡はターゲットについての知識を必要とし、それに向かって操縦するようですが、私はターゲットを本当に知りません。私は敵が今どこにいるか、私はその速度と方向を知っています。今、私はそれがその標的に向かう途中で敵を迎撃するためにどの方向に行かなければならないかをできるだけ早くそして速く知りたいです。前述のように、最初は加速を無視できますが、これにより実際のバージョンと比較して処理時間が大幅に節約されます...新しいモデルでは、敵が「コースチェンジ」イベントを発火したときにのみ再計算する必要があります。 hasmoved」イベントです。
NobbZ

はい、あなたが説明すること追求です。それはターゲットを知りません..「敵」の現在位置、速度、方向に基づいて予測を行います
bummzack

それから私は説明を誤解しました、私はそれを明日詳しく調べます。
NobbZ 2011

ほんの数分前に文書を読み終えたところ、追求は私が探しているものではありません。次のフレームの位置を対象とすることを除けば、実際の実装に似ていますが、フレームごとに新しいコースを再計算する必要があり、コースがいくらかのカーブを生じます。しかし、私が望んでいるのは、敵が両方とも出会うまで速度やコースを変更しないことを前提とした直接線です。これでもまだはっきりしない場合は、仕事の後に自分が欲しいものを描こうとします。とにかくリンクをありがとう。これはプロジェクトの他の場所でも使用できると思います。
NobbZ

@NobbZ私の回答が役に立たなかったのは残念です。「速度や敵のコースが変わった場合、すべての計算を繰り返さなければならないことはわかっています」というような誤解を招く可能性があるので、それに応じて質問を編集する必要があるかもしれません。 「追跡」ステアリング動作。
bummzack
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.