不均一な惑星表面での経路探索


16

私の質問は、不均一な惑星表面での経路探索への最良のアプローチは何でしょうか?


背景情報

私は、6つの球体投影面の変位マッピングから惑星を作成しました。平面は、球形に投影される前に最初に立方体を形成しました。

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

各「球体投影立方体面」をグリッドとして使用し、簡単なA *アルゴリズムを使用して最適なルートを見つけることができるかどうか疑問に思っています。また、パスが登らないように変位の高さを考慮したいです。山など(これはA *アルゴリズム内の単なるヒューリスティックだと思います)別の考慮事項は、Unity3dの物理エンジンを活用して惑星の動きを実現し、重力を惑星の中心に向けることです。私の提案するソリューションでは、重力物理学とは独立してエージェントの動きを制御する必要がありますか?

私の質問をより明確にするために、これは私の現在の惑星体です。

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


2
Planetary Annihilationのこのビデオに興味があるかもしれません。キューブから世界を包み込み、その周りにパスを見つけるのと同じように見えます。それは実際には答えではありませんが、球体の周りの経路探索を最適化するための他の戦略とともにA *を使用していることがわかります。パス発見ビットは24:30から始まります。
マイケルハウス

@ Byte56このリンクのコスト計算に対する本当に興味深いアプローチに感謝します。ゲームが終了すると、そのゲームが待ち遠しいです。
カイウスユージン

回答:


12

あなたはすでにあなた自身の質問に答えているようです。A *が最善のアプローチです。もちろん、山を避けるために高さ情報を使用するなど、あなたが説明する方法で使用できます。自分の世界の表面にあるグリッドに関する情報にアクセスできる限り、A *ヒューリスティックで使用できない理由はありません。

最後に、質問の最後のパス検索とパス追跡を混同しています。パスファインディングは、ヒューリスティックとして追加しない限り、重力を気にしません。惑星の表面上にいるので、重力は表面全体で本質的に同じになります。多くのゲームには動きと重力があります。できない理由はありません。

基本的に、赤から青へのマッピングを行い、球体でも立方体でも同じになるようにします。

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

A *は現在のノードに頻繁に隣接ノードを取得しているため、隣接ノードを取得するための一連の関数を簡単に作成できます。たとえば、getXPlus()getXMinus()getZPlus()とのようにします。これらの関数は現在のノードを取得し、関数名で指定された方向にノードを返します。

ほとんどの場合、これらの関数は値をインクリメントするだけで実行できますが、エッジでは変更されます。

キューブの表面を2D座標系にマップする必要があります。ただし、各グリッド空間に一意のX、Y座標を指定するだけで、これらを並べる必要はありません。

エッジ上で、隣接するグリッドスペースを取得するとき、必ずしも座標をインクリメントするだけではありません。どの面に移動しているかを見つけ、その面の座標に切り替える必要があります。

たとえば、ここでXPlus座標を取得すると、X座標とY座標の両方が変更されます。これは、新しいフェースの新しいグリッドスペースに移動しているためです。緑の線は、2つの面の間のエッジを表します。

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

現在、これらは単なるグローバル座標であるため、現在の立方体の面を表す3次元の内部ローカル座標系を使用する方が簡単かもしれません。

いずれにしても、立方体の面の各グリッド空間に一意の座標が必要です。それらの間の移動は、座標系の実装方法によって異なります。その座標が球体の表面にどこにマッピングされるかを知る必要があります。

このすべては最終的には抽象化され、あなたもそれを知らないはずです。


応答に乾杯。私が苦労しているのは、各飛行機が孤立したグリッドであると思います。継ぎ目を処理する方法について何か提案(またはさらに読む)がありますか、私は数学的に私の「キューブ」を展開し、すべてのグリッドを結合し、そのデータセットを使用してパスを計算することになると思いますか?
カイウスユージン

本当にそれは、あなたが心配する必要がある端だけです。これは、ラッパー関数(キューブをラッパー関数でラップし、ワールドをラップする...)によって簡単に解決できます。キューブをラップして平らな表面に抽象化できます。隣接するグリッド空間を取得するための関数を作成します。getXPlus()はXPlus方向のグリッドを取得します。面間の境界に関係なく、関数は面を切り替えて適切なグリッド情報を返します。
マイケルハウス

折り畳まれたキューブでのパス検出の唯一の不正確さは、頂点が歪んでいるため、エッジの長さが異なることです。結果のパスに顕著な違いが生じない可能性があります。そうでない場合は、単に長さを考慮することができます。
ダニジャー

1
ここで理解しておくべき重要なことは、A *は必ずしも平面上で動作するとは限らないということです。グラフ上で動作します。各キューブの面内では、ノードはグリッドに配置されて接続されていますが、キューブの端を横切るノード接続もあります。
-jmegaffin

1
@ Byte56すばらしい回答をありがとう、私は解決策をほのめかし始めましたが、少しの障害にぶつかりました。たぶん私は誤解しました。数学/プログラミングの問題の多くを感じたので、stackoverflowに質問を投稿しました。stackoverflow.com/questions/ 16089074
Caius Eugene
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.