Pfad „Sichtlinie“ über das Navigationsnetz

9

Ich möchte die Sichtlinie in einem Navigationsnetz berechnen.

Betrachten Sie das Bild unten, die gelbe Linie ist das Ergebnis von nur A * und die rote Linie ist das Ergebnis eines Sichtlinienalgorithmus, der die gelbe Linie als Eingabe verwendet. Jetzt kann sich das Gerät direkt ohne „Zick-Zack“ bewegen.

Was ist ein Algorithmus zur Berechnung dieser "Sichtlinie"?

Geben Sie hier die Bildbeschreibung ein

Yannick Lange
quelle

Antworten:

6

Sie suchen nach einem Trichteralgorithmus.

Hier bist du einfach

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

Grundsätzlich identifiziert der Algorithmus Kanten als Portale und erstellt einen Trichter, der gegen den Scheitelpunkt der Kanten getestet wird, um zu überprüfen, ob sie sich im Trichter befinden oder nicht.

In Schritt A wird der Trichter mit der Startposition gebaut und das Portal durch eine gelbe Linie gekreuzt.

In Schritt B wird das nächste Portal überprüft, der obere Scheitelpunkt befindet sich im Trichter, sodass die obere Trichterlinie nun durch diesen verläuft. Der untere Scheitelpunkt befindet sich jedoch außerhalb des Trichters, da die rote Linie unter der grünen Linie liegt, sodass die untere Linie nicht durch sie verläuft, sondern weiterhin durch den unteren Scheitelpunkt des vorherigen Portals verläuft.

Wie Sie überprüfen können, wird der Trichter immer kleiner, bis Schritt F, in dem der Trichter nicht gebaut werden kann, da die rote Linie einen schlechten Trichter ergibt, sodass der obere Scheitelpunkt als neuer Startpunkt und ein neuer Trichter ausgewählt wird erstellt werden, wenn der Endpunkt nicht in diesem Netz liegt.

Geben Sie hier die Bildbeschreibung ein

Beachten Sie, dass diese Art von Algorithmus auch eine einfache Lösung für das Problem der Modellgröße ermöglicht, da Sie berücksichtigen können, dass die Portale um den 2-fachen Radius Ihres Modells kleiner sind.

Geben Sie hier die Bildbeschreibung ein

Blau
quelle
6

Es gibt eine einfache Technik, die mit generierten Pfaden unter Verwendung dieser Sichtlinienidee verwendet werden kann. Grundsätzlich möchten Sie den Pfad gehen und an jedem Knoten zwei Knoten vor dem letzten "zurückblicken", um zu sehen, ob er sichtbar ist. Wenn der vorletzte Knoten sichtbar ist, können Sie den letzten Knoten entfernen (da Sie eine Sichtlinie zwischen Ihrem aktuellen Knoten und dem vorletzten Knoten haben, ist der letzte Knoten als Zwischenknoten nicht erforderlich).

Geben Sie hier die Bildbeschreibung ein

Ein Gamasutra-Artikel enthält das folgende Pseudocode-Beispiel:

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

Dieser Algorithmus macht, was Sie wollen, wobei die WalkableFunktion im Wesentlichen eine Sichtlinienfunktion ist, aber leicht verbessert wurde, um auch Situationen einzuschließen, in denen der Pfad sichtbar, aber nicht begehbar ist (dh Gruben, Fallen, eingeschränkte Zonen).

MichaelHouse
quelle
Ich verstehe, was Sie sagen, aber ich weiß immer noch nicht, wie ich die Sichtlinie berechnen soll. Können Sie mit einem Dreiecksnavigationsnetz beschreiben, was in der Walkable-Funktion enthalten ist?
Yannick Lange
Diese Antwort handelt von gitterbasiertem Pathing und ist in einem Navigationsnetz-Szenario
Blau