タイルグリッドのナビゲーションメッシュを生成するにはどうすればよいですか?


18

私はまだ実際にこのプログラムのプログラミングを開始していませんが、とにかくこれをどのように実行するかを知りたかったのです。

タイルのグリッドがあり、すべて同じサイズで、一部は通過可能で、一部はそうではないとします。このグリッドからポリゴンのナビゲーションメッシュを作成するにはどうすればよいですか?

私のアイデアは、通過不可能なタイルを取り出して、そこからラインを延長してポリゴンを作成することでした...これまでのところ、これで終わりです。何かアドバイス?


2
技術的には、グリッドはナビゲーションメッシュとほぼ同等です。グリッドを最適化し、隣接する正方形を結合する方法を実際に求めているのではないでしょうか。
キロタン

@Kylotanはい、まさにそれは私が意図したものであり、隣接するポリゴンを結合する方法にすぎません。
ロス・ヘイズ

回答:


28

以下は、RTSゲームのnavmeshを実行するときに思いついた方法の1つです。自作であり、サードパーティのツールは使用されていないことに注意してください。実装とバグ修正に約3週間かかりました。

  1. マーチングスクエアアルゴリズムを使用して、障害タイルをアウトラインに変換します。マップの端もアウトラインであり、同様に含める必要があることに注意してください。
  2. Douglas-Peuckerアルゴリズムを使用して、アウトラインのポイント数を減らします(下の写真の紫色の線)
  3. すべてのポイントをドロネー三角形分割に送ります(最も均一な三角形を得るため)
  4. 空の領域とマップのエッジに沿ってポイントを追加します(より均一なnavmeshを取得するため)
  5. 障害物の輪郭に沿って確認し、ドロネーが作成したポリゴンを反転して輪郭に一致させます。-多くの場合、ドローネは三角形(灰色)をアウトライン(赤)と一致させずに配置し、それらを検出して反転させる必要があります。それらをポリゴンに戻し、アウトラインに沿って分割し、手動で三角形分割します ここに画像の説明を入力してください
  6. 障害物の内側をクリップ - 障害物内にあるポリゴンを削除します(上の写真のピンク色)
  7. 必要に応じて、残りの三角形と頂点の間の接続データを入力します -これがnavmeshです。

結果:

タイルマップnavmesh


1

メッシュは通常、グラフとして実装されます。グリッドに基づいてマップにパス検索を実装する場合は、次を実行します。

各移動可能な正方形が頂点として表されるグラフを作成します。頂点として表される隣接する移動可能な正方形の各ペアには、それらの間にエッジがあります。これで完了です。


1
これは通常、navmeshesの実装方法ではありません。navmeshの目的(そして、ここで質問者が質問をした理由も想像します)は、グラフを最適化して、必要なポリゴンの数(通常は三角形)を最小化することで、適切なパスを見つけるために必要な手順、およびメッシュを定義するために必要なメモリフットプリント。生の実装では、大量のメモリが消費され、貴重なAI処理時間が無駄になります。
グルガドゥルゲン

あなたは正しいです。もちろん、デシメーション(ポリゴンの削減)は合理的で望ましい最適化です。それは、あなたがopの質問を読んだときに、彼がグリッドをグラフに変えたいだけの感覚を得ているということです。
wolfdawn
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.