ナビゲーションメッシュ全体の「見通し線」の経路


9

ナビゲーションメッシュの視線を計算したい。

下の画像を見てください。黄色の線はA *のみの結果であり、赤い線は黄色の線を入力として使用する見通し線アルゴリズムの結果です。これで、ユニットは「ジグザグ」することなく直接移動できます。

その「視線」を計算するアルゴリズムは何ですか?

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

回答:


6

ファンネルアルゴリズムを探しています。

ここにあなたは簡単な人です

http://digestingduck.blogspot.com.es/2010/03/simple-stupid-funnel-algorithm.html

基本的に、アルゴリズムはエッジをポータルとして識別し、エッジの頂点に対してテストされるファンネルを作成して、ファンネル内にあるかどうかを確認します。

ステップAでは、じょうごは開始位置とポータルが黄色の線で交差した状態で作成されます。

ステップBでは、次のポータルがチェックされ、上部の頂点がじょうごの内側にあるため、じょうごの上の線が通過します。しかし、下の頂点は漏斗の外にあります。これは、赤の線が緑の線の下にあるため、下の線は通過せず、前のポータルの下の頂点を通過し続けるためです。

確認できるように、ステップFまでファンネルは小さくなり、小さくなります。この場合、ファンネルを作成することはできません。赤い線はファンネルが悪いため、上部の頂点が新しい開始点として選択され、新しいファンネルは終点がそのメッシュ内にない場合は作成します。

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

ポータルはモデルの2倍の半径だけ小さいと見なすことができるため、この種のアルゴリズムはモデルサイズの問題の簡単な解決策にもなります。

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


6

この見通し線のアイデアを使用して生成されたパスで使用できる簡単なテクニックがあります。基本的には、パスをたどって、各ノードで、前のノードの 2つ前のノードを「振り返って」、表示されているかどうかを確認します。最後の前のノードが表示されている場合は、最後のノードを削除できます(現在のノードと最後の前のノードの間に見通し線があるため、中間ノードである最後のノードは必要ありません)。

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

ガマストラの記事には、次の擬似コードの例があります。

checkPoint = starting point of path
currentPoint = next point in path
while (currentPoint->next != NULL)
if Walkable(checkPoint, currentPoint->next)
// Make a straight path between those points:
temp = currentPoint
currentPoint = currentPoint->next
delete temp from the path
else
checkPoint = currentPoint
currentPoint = currentPoint->next

このアルゴリズムは望みどおりにWalkable機能します。関数は基本的に見通し内関数ですが、パスが表示されているが歩行できない状況(ピット、トラップ、制限区域)も含まれるように少し改善されています。


あなたの言っていることは理解できますが、それでも視線の計算方法がわかりません。三角形のナビゲーションメッシュを使用して、Walkable関数の内容を説明してください。
Yannick Lange

この回答はグリッドベースのパスについてであり、ナビゲーションメッシュシナリオ
Blau
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.