2Dゲームには、敵に向かって自動的に発砲することでプレイヤーを支援するAIタレットがあります。敵の現在位置をターゲットにするのではなく、インテリジェントに発砲させてターゲットをリードさせたいと思います。したがって、敵と砲塔の発射体の両方の(常に一定の)速度と位置ベクトルが与えられた場合、発射体が敵と交差(およびヒット)するために砲台が目標とする実際の位置を表すベクトルを見つけるにはどうすればよいですか?
数学、アルゴリズムなどを説明する記事へのリンクはありがたいです!
2Dゲームには、敵に向かって自動的に発砲することでプレイヤーを支援するAIタレットがあります。敵の現在位置をターゲットにするのではなく、インテリジェントに発砲させてターゲットをリードさせたいと思います。したがって、敵と砲塔の発射体の両方の(常に一定の)速度と位置ベクトルが与えられた場合、発射体が敵と交差(およびヒット)するために砲台が目標とする実際の位置を表すベクトルを見つけるにはどうすればよいですか?
数学、アルゴリズムなどを説明する記事へのリンクはありがたいです!
回答:
GameDevでこの質問、およびStackOverflowの上でこの質問はあなたが探している答えを提供しなければなりません。:)
私はあなたに答えを与えるつもりはありませんが、私は役に立つと確信していますが、ここにそれがあります:
数学でもう少し遊んだ後(ノートブック/発行済みノートブックの答えの最後を確認してください)、このソリューションは正しいように見えます。
あなたの問題に対応する数学でこれを書きました。基本的に、方程式/不等式を解決して、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
(これは公開されたバージョンであり、数学プレーヤーが必要です-これは無料です-数学を持っていない場合、これが方法です)
スクリーンショット: