オブジェクトがターゲットを導くために敵の位置を予測する


13

2Dゲームには、敵に向かって自動的に発砲することでプレイヤーを支援するAIタレットがあります。敵の現在位置をターゲットにするのではなく、インテリジェントに発砲させてターゲットをリードさせたいと思います。したがって、敵と砲塔の発射体の両方の(常に一定の)速度と位置ベクトルが与えられた場合、発射体が敵と交差(およびヒット)するために砲台が目標とする実際の位置を表すベクトルを見つけるにはどうすればよいですか?

数学、アルゴリズムなどを説明する記事へのリンクはありがたいです!



リンクをありがとう!しかし、私は解決策を読むのが少し難しいと感じています。おそらく、あなたが提供したリンクを使用してこの質問に対する明確な視覚的な答えを集め、同じ問題に悩まされている他の人を助けることができます。
ラロラロ

@Larolaro回答にグラフィカルなデモンストレーションを追加したので、少し理解を深めることができます。
jmacedo

私はこの答えで取るアプローチについて説明しますgamedev.stackexchange.com/a/28582/6588
jhocking

回答:



3

私はあなたに答えを与えるつもりはありませんが、私は役に立つと確信していますが、ここにそれがあります:
数学でもう少し遊んだ後(ノートブック/発行済みノートブックの答えの最後を確認してください)、このソリューションは正しいように見えます。

あなたの問題に対応する数学でこれを書きました。基本的に、方程式/不等式を解決して、OA変数を見つける必要があります。出力は、OAが持つ可能性のあるソリューションと、各ソリューションが有効であるために検証する必要がある条件を提供します。

Reduce[{BPx, BPy} + t*{BVx, BVy} == {OPx, OPy} + t*OV*{Cos[OA], Sin[OA]} && t != 0 && OV != 0, {OA}]
  • {BPx、BPy}は青の現在位置です

  • {BVx、BVy}は青の速度ベクトルです

  • {OPx、OPy}はオレンジの弾丸の位置です

  • OVは、オレンジの弾丸速度ベクトル(合計速度)のノルムです。

  • OAはオレンジの弾丸の角度(速度ベクトルの角度)

  • tは、弾丸が青に当たるのに必要な時間です

私はt> 0 && OV> 0を条件に入れようとしましたが、数学は永遠にかかりますので、t!= 0 && OV!= 0を使用しました。オレンジと同じ位置で、オレンジの弾丸が実際に移動するとき(静止したままではなく)

出力は巨大です: http //freetexthost.com/xzhhpr5e2w

ただし、OA == _部分を抽出すると、次のようになります。

http://freetexthost.com/iyrhqoymfo

これらは、OAが持つことができる値です(それぞれが有効であるためには異なる条件が必要です)。

OVが負であることを必要とするソリューションを取り出して、さらに分析を行い、これは望ましくありません。

http://freetexthost.com/iy4wxepeb6

そのため、これらは問題の可能な解決策であり、それぞれが有効であるために異なる条件を必要とします。特定の角度OAが有効なソリューションであるためには、次の条件が満たされている必要があります。

Reduce[{BPx, BPy} + t*{BVx, BVy} == {OPx, OPy} + t*OV*{Cos[OA], Sin[OA]} && t != 0 && OV != 0, {t}]

出力:

(BVy - OV Sin[OA] != 0 && BPx == (BPy BVx + BVy OPx - BVx OPy - BPy OV Cos[OA] + OPy OV Cos[OA] - OPx OV Sin[OA])/(BVy - OV Sin[OA]) && t == (-BPy + OPy)/(BVy - OV Sin[OA]) &&  BPy OV - OPy OV != 0) || 
(BVy == OV Sin[OA] && BPy == OPy && BVx - OV Cos[OA] != 0 && t == (-BPx + OPx)/(BVx - OV Cos[OA]) && BPx OV - OPx OV != 0) || 
(BVy == OV Sin[OA] && BVx == OV Cos[OA] && BPy == OPy && BPx == OPx && OV t != 0)

そのため、それを検証するソリューションのみを検討してください(t == _パーツを検証する必要はありません。他の条件が有効な場合、弾丸がビークルに命中するのに必要な時間を提供するものです。 tは負の値になります。他の条件を検証しても、特定のOAを有効なソリューションと見なすことはできません(reduceでt> 0の代わりにt!= 0を使用したためです)。

また、これについて/math//で質問することもお勧めします。

編集

私はこの質問に興味を持ち始めたので、説明したすべてのグラフィカルなデモンストレーションを備えたコメント付きのノートブックを作成しました。ここからダウンロードしてください:

http://www.2shared.com/file/pXhYyhN1/towerBullets.html
またはここ:http : //www.2shared.com/file/W01g4sST/towerBullets.html

(これは公開されたバージョンであり、数学プレーヤーが必要です-これは無料です-数学を持っていない場合、これが方法です)

スクリーンショット:


乗算記号(*)を使用して条件とソリューションを提供できるため、プログラミング言語に簡単に移植できます(その後、ArcTan [...]、Sin [...]を置き換えるだけで済みます。 Cos [...]、Sqrt [...]そして最終的には電源記号(^)。
jmacedo

ああ、この解決策は忘れてください。この質問が統合されたので、最初の回答のリンクはより良い回答を含むようになります。
jmacedo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.