最大でターゲットへの弾丸のパスを計算するためのアルゴリズム。2リコット


21

悪いタイトルで申し訳ありませんが、私はそれを表現するより良い方法を持っていませんでした...

Wiiには任天堂による素晴らしいゲームがあります(そうです!)。9つのミニゲームがあり、私のお気に入りはタンクと呼ばれます!。自分自身を破壊することなく、COM敵の戦車を破壊することです。レベルのスクリーンショットは次のとおりです。

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

戦車を破壊する1つの方法は、弾丸を発射することです。このライムグリーンの敵の戦車は、2回跳ね返る(壁やブロックに対して)高速弾丸を発射します。プレイヤーの戦車が現在の場所に留まっていると、プレイヤーの戦車が即座に破壊される様子を見ることができます。中央の石灰戦車は、画像に描いた緑の道に沿って弾丸を発射できます。

私はアマチュアプログラマーとして、ライムタンクがプレイヤータンクを撃つためにどの方向に発火すべきかをどのように決定できるのかと思っていました。

私は自分でそれについて考えましたが、可能なアルゴリズムを思いつきませんでした。誰かに刺激を与えた場合の結論を説明します。説明を簡単にするために、は弾丸が跳ね返ることのできる表面であると想定しています。したがって、ブロックの孤立した長方形が4つの壁を形成します。

私は、弾丸のリコットが常に平行四辺形の片側にあるか、平行四辺形の反対の頂点になる2つの点を結論付けました。射撃する敵の戦車と、それが狙うプレイヤーの戦車は、必ずしも他の2つの頂点ではありませんが、平行四辺形の4つの側面のいずれかと同一線上にあることは間違いありません。以下は、平行四辺形を形成できる4つの可能な方法の説明です。

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

HOR-VERは、弾丸が最初に水平の壁に当たり、次に垂直の壁に当たります。

そして、私は立ち往生しています。敵の戦車とプレイヤーの戦車をマップ上で接続するラインを移動して、壁との2回のヒットで平行四辺形を形成するかどうかを考えましたが、敵の戦車とプレイヤーの戦車は平行四辺形の頂点と必然的に一致します。

また、アルゴリズムの一般的な流れがわかりません。アルゴリズムは次の2つの構造のいずれかを使用しますか、それとも両方とも間違っていますか?

  • 考えられるパスを常に把握し、常に1つを最良としてマークし(最短、最も不明瞭、最も避けられない、または複数の基準に基づいた組み合わせおよび重み付けの評価)、残りは忘れます。すべての計算後に残ったものが最適です。
  • 最初に弾丸で到達可能なすべての壁を決定し(これらの各壁に到達するために弾丸が他の壁に跳ね返る必要はありません)、次にこれらの各壁のすべての到達可能な範囲を決定します(遠くの点に到達できない場合があります)別の壁があなたの近くに立っている場合は跳ね返りのない壁)、再び跳ね返りで到達可能なすべての壁、およびこれらの壁に到達可能なすべての範囲を決定します。これらの4つのプロセスは、レイトレーシングと同様の方法で実行できます。各プロセス中に、プレイヤーの戦車が光線に当たった場合、その光線に従って弾丸の経路を見つけます。

私の意見では、このアルゴリズムは次の理由で把握するのが困難です。

  • 弾丸はどの方向にも発射できます。そして
  • 数学のように、線上に無限に多くの点がある壁には、無限に多くの点があります。

しかし、任天堂の人々はとにかくそれを作ったので、...アイデアを持っている人はいますか?


ただ確認するために、あなたは任天堂が実際にそれをどのように選択したかではなく、どのようにこれを行うことができるかを求めていますか?
Ixrec

@lxrecあなたは正しいです、彼らがそれをやった方法ではなくそれをする可能性のある方法に興味があります。
こんにちは、

ゲームは解決策を見つける必要はありません。ボタンを押して発射すると、ゲームはすでにあなたの位置と方向を認識しており、その情報のみを使用します。軌跡をたどり、経路内に敵の戦車が見つかった場合は、それ以外の場合はヒットしません。
マンドリル

2
「無限に」多くの角度がありますが、それらをいくつかの等価クラスに簡単に減らすことができます。Nicky CaseのSight and Lightは、ポリゴン間の影のレンダリングのクールなデモです。これはまさに光線の代わりに弾丸のパスを使用していることと、光線が2回反射されることを除けば問題です。反射はAIにとって重要ではないことに注意してください。反射は視線を延長するだけですが、これは同じオブジェクトが複数の角度から見える場合があることを意味します。
アモン

@マンドリル私はあなたが私の質問をかなり得ていなかったのではないかと心配しています。敵の戦車がプレイヤーの戦車に命中する弾丸の経路をどのように考案できるかを尋ねていました。
こんにちは、

回答:


9

直視線を考えると、問題は明らかに些細なものです。ただし、リフレクションを扱っています。レイトレーサーの一部として反射を実装する場合、シーンのどの部分が見えるかを適切に見つけることは困難です。これにより、一部の開口部が失われる可能性があるためです。2つの有望な角度間の「バイナリ検索」も実行可能ではありません。反射のため、実際に見える空間は連続的ではないため、ヒューリスティックな「Aの右側とBの左側にある場合、ターゲットが存在する必要があります」 AとBの間のソリューション」は許可されず、「創造的な」ソリューションを見逃します。私の代わりに仮想位置からトレーサー再実行することにより、反射を実装する推薦する-私たちの発射タンクが位置思わ鏡で見たときにすることを:

target |obstacle
   X   |
    \  |  X real position
     \   /
      \ /
   ----------- mirror surface
        \
         \
          X virtual position

利点は、鏡面光線が仮想位置から始まる直線になることです。私は次のスケッチでテクニックを説明しようとしました:

角を回って撮影

Xは発射位置、(X)ターゲットをマークします。色付きの領域が表示されます。

  1. 直視線:ターゲットは見えません。ただし、サーフェス(1)および(2)にヒットすることはできます。

  2. 1つの反射。障害物内には2つの仮想射撃位置があります。下の位置にはターゲットへの直接のLOSがあるため、最初の発射ソリューションがあります。弾丸の経路は、ターゲットと下の鏡面の間、および光線と鏡の衝突点と実際の発射位置の間の光線の一部です。

  3. 2つの反射:最初の反射からの上部の仮想位置は、ミラー面を通して下部の障害物の一部を見ることができます。2つの反射が許可されているため、この位置を下の障害物にミラーリングできます。位置は、(I)実際の位置、(II)最初の反射からの仮想位置、(III)2番目の反射からの仮想位置としてマークされます。

    (III)から、ターゲット(X)への直接LOSがあるため、別の発砲ソリューションが見つかりました。弾丸の経路は、X–III線に沿って2番目のミラー衝突点まで、次にミラー衝突点間のIII–II線に沿って、最後に最初のミラー衝突点から実際の位置Iに至るII–I線に沿っています。

    実際、最初の反射からの下部の仮想位置も上部の障害物に反射される可能性がありますが、これは直接的な解決策にはなりません。

障害物のどの部分が見えるのかがわかると(したがって、弾丸を反映するために使用できる)、深さ優先検索によるミラーリングの実装は簡単に思えます。適切な鏡面を見つけるために、Nicky CaseのSight&Lightで概説されている技術を使用することができます。360のベクトルを試すのではなく、開口部を見逃して無駄になります。


「光線を障害物の端にのみ発射する」ことがどのように機能するのかわかりません。壁の端に向かって、そして解決策が見つかるまで徐々に内側に向かって光線を発射し始めますか?もしそうなら、私はこのルールで解決策がより速く見つけられることを理解しています。
こんにちは、

いくつかの検討の後、これが最良の答えだと思います。明らかに、私が以前に最高とマークした数学的な答えでは、1バウンスおよびバウンスのないソリューションを直接処理できないからです。
こんにちは、

これは素晴らしいです!ゲームに過度の負荷をかけることなく、レベルのミラー化された表現を作成する方法に関するアドバイスはありますか?
レトロビウス

7

カールビーレフェルトのアイデアを2つの壁の反射に拡張するだけです。ここに画像の説明を入力してください

AとBが与えられます(タンク)。最初に、Aが見ることができるすべての壁と、Bが見ることができるすべての壁のリストをリストする必要があります。次に、最初の壁が最初のリストにあり、2番目の壁が最初の壁とは異なり、2番目のリストにあるペアを作成します。壁のすべての可能なペアに対してこのテストを行う必要があります(候補を排除する方法を見つけない限り)。指定された壁のペアのRとSを見つけたら、チェックします

1)AがRの直接ビジョンを持っている場合

2)Rがwall1に属する場合(壁は単なるセグメントであり、ライン全体ではありません)

3)RがSに直接アクセスできる場合

4)Sがwall2に属している場合(壁は単なるセグメントであり、行全体ではない)

5)SがBに直接アクセスできる場合

RとSを見つけるには:wall1を知っているので、wall1に接する直線方程式を決定できます。Rはwall 1に接する直線に属しているため、Rの2つの座標間に関係があります( R)Sと同様(この点はwall2のラインタンジェットに属するため、S座標間に関係があります)。したがって、2つの自由度があり、解を決定するために2つの追加の独立した方程式が必要です。1つの式は次のとおりです。

(AA')/(RA')=(SS')/(RS')

他の方程式は次のとおりです。

(BB')/(SB')=(RR')/(SR')

上記の式では、A、A '、B、B'は既知であるか、直接計算できることに注意してください。R 'およびS'は、RおよびSの座標と壁方程式の関数です。数学が終わっていないので、方程式がどのように見えるかわかりません。


これは素晴らしい数学的なアプローチです。しかし、アルゴリズムは連立方程式を解くために多くの計算時間を必要としますね。距離には多くの平方根とべき乗が含まれます。
こんにちは

3

跳ね返りを離れる角度は、跳ね返る角度と同じでなければならないという事実を利用できます。y座標を有する所定の水平壁のためのc座標を有する2つの固定されたタンク(a,b)(d,e)、これを満たす以下の式のみ1つの角度があります。

方程式の図

ちょうどxあなたが目指しなければならない壁に沿って距離を得るために解決します。2つの壁は同じように機能します。2つの方程式と2つの未知数があります。


1

光線の方向を示すきちんとした図があるので、反射面のペアを決定する方法についての詳細を残します。

レッツ・コール第一の表面にヒットしなければならない面Aを、そして第二に、B

Aを撮影して、Bの(見える)エッジを打つようにしてください。言い換えれば、鏡面仕上げのAを見たときにBの端の反射が見えるポイントを決定します。これは簡単にする必要があります。処理する反射点は1つだけです。

これで、Bの(可視)エッジに当たる2つの光線がわかりました。それらエッジレイと呼びましょう。Bからの反射計算します。彼らはあなたの目標を越えてどこかに行かなければなりません。ターゲットそれらの間にあるかどうか、つまり、一方の光線の左側にあるが他方の光線の右側にあるか、またはその逆であるかを判断できます。これは、直線の一般的な方程式を使用して行うのは簡単です。

ターゲットがエッジレイの間にない場合、明らかに中間レイでヒットすることはできません。サーフェスの別のペアを選択します。

ターゲット光線の間にある場合、バイナリ検索を使用して中間の衝突光線を探します。エッジレイに対応する2つの発射角度があり、ヒット角度はそれらの間にあります。発射ポイントから見たターゲットの角直径が過度に小さくなければ、衝突する光線の方向を見つけるまで、何度か繰り返す必要があります。

これが写真です:

光線

ここでは、2つのエッジ光線が赤と青で表示されています。どうやら、赤い光線よりも小さいが赤い光線よりも大きい角度で放出された光線を見つけて、その光線が緑のターゲットに当たるようにすることができます。


いいえ、必ずしもそうではありません!赤と青の弾丸のパスの間のどこかに余分な障害物がある場合は、ダイアグラムについて考えてください。赤と青の角度の間の正しい角度で弾丸を発射すると、プレイヤーの戦車に接近する可能性がありますが、弾丸がいくつかの間にあるランダムな障害物を跳ね返す可能性があるため、完全に逃すこともあります。彼がこの可能性について議論している@amonの答えを見てください。
こんにちは

@amonの答えに賛成。直線ミラーリングのアイデアが好きです。また、アルゴリズムは、この単純化された方法でヒットパスを見つけた後、ヒットパスが実際に通過可能であることをチェックする必要があると思います。さらに興味深いのは、ターゲットが部分的にしか遮られていない可能性です(2つの可視領域に分かれている場合もあります)。Amonのメソッドは、より扱いやすい方法です。
9000

-3

最初に、光の屈折について話したとき、物理学のクラスで覚えていますか?さて、これらの原則を使用して問題を解決できます。入射角は反射角と同じです。そのため、敵の戦車は、最初の跳ね返りで可能なあらゆる角度を通り抜けて、2番目の跳ね返りがプレイヤーに当たるようにしなければなりません。レイトレーシングのアイデアも続けてください。今、これはプレイヤーが動いているときに複雑になりますが、アルゴリズムを始めるには十分なアイデアになるはずです


1
私は熟考の原則を理解しています。@amonのコメントに対する私の返信を見ることができます。プレイヤーの動きを考慮しなければならないのは正しいですが、評価に基づいて複数の可能なパスから最適なものを選択するための1つの基準として残すことができると思います。ただし、これは、弾丸のパスの距離と相関関係があるため、無視できます。つまり、パスが長いほど、弾丸が目的地に到達する前にプレーヤーがより多く移動できます。
こんにちは、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.