3Dワールドのナビゲーショングリッドをどのように生成しますか?


11

この問題の解決策を見つけようとしています。3Dスペースの正方形の形をしたx、yのフロア座標にロックされた頂点のグリッドの形式でナビゲーションメッシュを構築しようとしています。しかし、私はそれを回避する方法を理解しようとして問題を抱えています。

リキャストライブラリを調べてみました。これはかなり堅牢な方法ですが、大きなマップとオープンスペースでは明らかに速度が低下します。また、高さマップを使用してワールドスペースの頂点とエッジを生成する方法もわかりません。

次に考えたのは、Unreal Engine 3が以前行っていた方法を実行することでした。

https://udn.epicgames.com/Three/NavigationMeshReference.html

レイキャストを使用してメッシュを生成することでした。レイキャストを停止する方法がわかりませんでした。

だから...私の次のオプションはボックスで、おそらくボックスキャストでした。2の累乗のサイズで細分割されたボリュームを作成します。ボックスをグリッドに合わせ、直角プリズムを下向きに光線として発射します。地面の一部であるジオメトリに着地し、長方形が交差していない場合は、正方形をそのままにします。そして、ボリュームの境界に達するまで下に進みます。エッジをリンクする必要があるかどうかを確認するには、頂点の2つのペアの間の勾配がウォーク可能な勾配内にあるかどうかを確認し、これがtrueの場合はそれらをマージします。

私の主な問題は...これは非常に最適ではないようです。それを考えずに、推定では、プロセスは多層レベルのO(N ^ 3)です。かなり厄介なことができます。

そして最後のビットは、これらの正方形の長方形のグループを自動的に作成するためのものです。これを行う方法は完全にはわかりません。Unrealの実装は、それらをスロープで分離します。ただし、グリッド形式を維持しようとしています。したがって、それは完全に必要なわけではありません。大きな長方形のタイルを作成してパス検索プロセスをタイルごとに分割することに問題は残っています。タイルは大きすぎても小さすぎてもいけません。

だから質問は...

このガードされたnavmeshを生成する効率的な方法は何でしょうか?そして、タイルを作成する良い方法は何でしょうか?


いつメッシュを生成する予定ですか?コンパイル時、ロード時、またはリアルタイム?私たちはこの同じ問題に取り組み、シナリオ(オーバーラップパスのないトップダウンシューターでの読み込み時間の生成)には過剰であると判断し、四分木ベースのアプローチを採用することにしました。これは私たちにとっては十分に機能しました。だから私が何を求めているのか、本当にこれが必要なのか、またはこれは時間のシンクになる可能性があるため、最初の要件を満たす最も簡単なソリューションは何ですか?優れたソリューションを管理している場合は、それをどのように修正したか聞いてみたいと思います。
Niels

@Niels事前にビルドして、ゲームにロードすることを計画しています。
moonshineTheleocat 2016年

そうすれば、プレイヤーがそれを待つことはないので、時間の消費は初期の欠点になりすぎないはずです。何かが機能した後はいつでも最適化できます。
Niels

あなたのレベルはどのくらいですか?私たちは、大規模なゲームに使用さリキャストをしましたし、何の問題もなかった-あなたは、単にチューニングするtiie値などを必要とする
スティーブン

「グリッド化された」ビットが欠けていると思います。これは、リキャストが使用するタイルとまったく同じではありません。私はそのようなことをするためにリキャストを再利用する方法を理解しようとしています。しかし、それはほとんど悪夢でした。
moonshineTheleocat

回答:


1

基本的な3Dの世界は、ほとんどのゲームエンジンで便利に構築できるナビゲーションメッシュで表すことができます。アクターはポリゴンのエッジに沿って移動できます。

それは簡単な解決策でしょう。パスを見つけてnavmeshを生成するための多くのアルゴリズムがあります。

少し前に読んだことを共有したいと思います。

Example01

これは、ゲームの世界を正方形のタイルに分割できる可能なソリューションを示しています。正方形のタイルがゲームに追加されるたびに(プレイヤーがエリア/手続き上の地形に近づくと)、正方形のタイルが追加されます。ただし、navmesh全体を計算する必要はもうありません。そのタイルについて計算し、既存のグラフに追加するだけです。そこに大幅なパフォーマンスの向上。

Example02

次に取り組む問題は、前の例のギザギザの動きです。将来のターンを考慮して方向を一般化することで、ジグザグの動きが大幅に減少し、動きが滑らかになることが理解できます。詳細なアニメーションを備えたゲームはそれを与えるものではありませんが、ナビゲーションがほとんどベークされていると想定するいくつかのオープンワールドゲームでこれに気付くでしょう。

質問については、navmesh生成アルゴリズムのリストでKromster の回答を確認することをお勧めします。

また、サンプルが含まれている左4デッドのAIシステムも確認してください。カバーするより多くの興味深いトピック

幸運を。


0

多くの方法があります。プレーヤーにローカルにするだけでなく、プレーヤーに沿って小さなグリッドを作成し、各交差点の下でその横断可能かどうかをチェックします。次の側の壁/建物。


良いアイデアですが、最終目標として実行可能なものではありません。私は広い世界をサポートし、AIが大陸の一方の側から別の側に移動できるようにする必要があります。これで十分ですが、上位のノードを生成するには、固定ナビゲーショングリッドを配置する必要があります。
moonshineTheleocat 2016年

0

これは私がどこでも見た問題です。秘訣は「懸念の分離」です。「なんて言ったの?」と思ったそうです 画面に表示されるのは「データ構造」ではありません。ビジュアルを構築するために、ビジュアルをデータから分離しておくことは重要です。そうすることで、基盤となるソフトウェアの新しいバージョンがリリースされたときに、常にゲームの「将来の保証」が得られます。

ゲームの世界を表すデータ構造(別名:モデル)を構築します。次に、データ構造モデルの「ビュー」を作成します。チェッカーボードグリッドから六角形グリッドにワールドを変更する場合、データ構造(モデル)は同じままですが、表示は別のビューを "ペイント"(レンダリング)します。


4
懸念事項を分離することは確かに一般的には良い習慣ですが、この回答は現在、質問への回答に固有の詳細(つまり、特定のワールドジオメトリのセットから適切なグリッドベースのパスファインディングモデルを生成する方法)を軽視しています。このモデルが何であれ、レベルを描画するために使用されるデータとはおそらく異なるはずですが、質問に答えるために、このパスファインディングモデルを生成するメソッドが必要です。
DMGregory

-2

二重配列を作成します。オブジェクトが渡せない場合は、位置を渡せないことを配列に伝えるメソッドを用意します。AIが移動しようとすると、彼らは二重配列を見て、それが通過可能かどうかを確認します。


4
この配列を作成する方法は難しい部分です。;)
DMGregory
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.