実行時に動的環境で2Dナビゲーションメッシュを生成するにはどうすればよいですか?


9

A *をパスファインディングに使用する方法を理解したので、グリッドで使用できます。しかし、私のゲームの世界は巨大で、多くの敵がプレイヤーの方に向かって動いています。これは移動するターゲットであるため、グリッドシステムはパスを見つけるには遅すぎます。ナビゲーションメッシュを使用してノードグラフを簡略化する必要があります。

メッシュの「しくみ」の概念(頂点のノードやポリゴンのエッジの中心、あるいはその両方を通るパスを見つける)の概念を理解しています。

私のゲームは、実行時に手続き的に生成される動的な障害物を使用しています。

次の図のように、複数の障害物がある平面を取り、プログラムで歩行可能領域をナビゲーションメッシュのポリゴンに分割する方法に頭を悩ませることはできません。

ナビゲーションメッシュ

どこから始めますか?アルゴリズムがマップを「ウォーク」するときに、以前に定義されたウォークアブルエリアをさらに分割する必要があると気付いたときに、ウォークアブルエリアのセグメントがすでに定義されているとき、またはさらに悪いことに、どうすればわかりますか?

必要に応じて、nodejsでJavaScriptを使用しています。


1
実装しようとしている動的パーティショニングは、マップ要素の詳細に依存します。あなたの障害物要素は、あなたの例に示すように、完全にグリッドに配置された長方形で構成されていますか?回転した長方形?不規則なポリゴン?または多くの曲線を含む非ポリゴン形状?障害物の形状のポイント/ポリゴンデータはありますか?もしそうなら、その形状データは、三角形、長方形、排他的に凸多角形、または凸多角形と凹多角形の混合の観点からですか?
マシューR

@Matthew私の世界は、凸状ポリゴンの障害物、カーブ、凹状ポリゴンで構成されていません。各障害物は、頂点がベクトルオブジェクトで表されるポリゴンオブジェクトとして格納されます。
スティーブン

1
価値があることについて、私はこのペーパーに基づくソリューションに取り組んでいます: gradworks.umi.com/3493710.pdf成功した場合、私は自分のソリューションを投稿します。
スティーブン

1
ナビゲーションメッシュが100%にない場合、どこかに行けるかどうかは
わかり

@Stephen- ロングコメントの回答を参照してください。
マシューR

回答:


3

@Stephen - ロングコメント -私はいくつかの時間を持っているときに、紙ルックス、それは価値があるかもしれないAのように読みました。基本的に私が示唆したのは、論文で言及されているHertel-Mehlhornアルゴリズムに沿ったものです(この特定のアルゴリズムのリファレンスは、ここhttp://www.personal.kent.edu/~rmuhamma/Compgeometryにあります) /MyCG/PolyPart/polyPartition.htm http://www.bringyou.to/compgeom/にありますコーナーに形成された複数の小さな三角形の発生を減らすために、マップの側面(プレイエリアの境界の外側)をいくらか細かく分割する回数。それらの小さな三角形は、パスファインディングを実行しているものよりも小さくなる可能性があるため、問題になる可能性があります。Hertel-Mehlhornは、三角分割の詳細に興味がある場合は、三角形分割によって生成されるポリゴンを削減するためのものです。

また、ホイールを再発明したくない場合は、このライブラリが実際に必要なすべてを実行すると思います。 http //code.google.com/p/polypartition/。Hertel-Mehlhornを含むさまざまなオプションの1つを使用して、三角測量と縮約を実行します。これはMITライセンスであり、問​​題がある場合はクローズドソースプロジェクトや商用プロジェクトに使用できます。

独自の実装に取り​​組み続けることを決定した場合、私はあなたが思いつくものを見たいです。


1
@Mathew、素晴らしい答えです。そして、あなたは間違いなくその論文を読むべきです!理解しやすく、優れた手法を説明します(特に、エージェントベースの検出/メッシュの生成について説明している付録A)。このアルゴリズムのバージョンをJavaScript用にコーディングしていますが、順調に進んでいます。終わったら回答として掲載します。
スティーブン

@Stephenはこの作品を見たいと思っています
kevzettler

@Stephen私もJavaScriptバージョンを探しています
Apolo

6

メッシュではなく、階層的なA *アプローチを検討するだけかもしれません。メッシュの最大の利点は、グリッドから複雑さを軽減することではなく、グリッドに整列していないゲームワールドを処理することです。

階層的なアプローチでは、世界を繰り返し(四分木のように)分割し、ノード間の接続情報を生成します。次に、世界の大きなチャンク間のパスをすばやく生成し、より大きなチャンク内のパス検索にのみ高解像度グリッドを使用します。

階層的アプローチは桁違いに優れたパフォーマンスを提供しますが、メッシュはせいぜい小さな線形改善を提供するだけです。

素朴なアプローチは、世界をX x Xの大きなグリッドに整列されたチャンクに分割し、それらの間に接続情報を生成することです(たとえば、チャンク2x1から3x1から2x2までの間にパスがあり、平均パスの距離はどれくらいか)。 。

特定の状況では、このアプローチで常に理想的なパスが得られるとは限らないことに注意してください。チャンクの可変サイズのレイヤーを生成することで問題が軽減されますが、正直なところ、問題のパスを作成することを回避し、プレーヤーが最適でないパスをとる敵に気づく可能性が非常に低いという事実に依存することは、通常、非常に簡単ですほとんどのケースの退化。


1
さらに説明する必要があります。私のゲームはグリッドに整列していません。私は800 x 600ピクセルの領域にグリッドを構築しました。各ピクセルはグリッド上の1つのスペースです(まだA *を考えていたので、これのパフォーマンスについてはまだ考えていませんでした)。上記の画像の例ほど単純ではない障害があります。問題を説明するためだけのものでした。明らかに、そのような場は修正する必要があり、いくつかの調査の結果、ナビゲーションメッシュが適切な方法だと思います。
スティーブン

3

これは複雑すぎるかもしれません。おそらく、その場でナビゲーションメッシュを生成する必要はありません。代わりに、ベースワールド用の静的ナビゲーションメッシュを用意してください。

障害物の周りの経路は、ステアリング動作を使用して解決できます(障害物回避を使用)。オフのチャンスで障害物が大きすぎて、あるナビゲーションポリから次のナビゲーションへの移動を埋めるか完全にブロックする場合は、このエッジケースを確認して、現在使用しているポリゴンとブロックされているもの。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.