Techniken zum (wörtlichen) Schneiden von Ecken auf quadratischen Gitterkarten

7

Mein Spiel beinhaltet ein Level mit verformbarem Gelände und Einheiten, die sich in jede Richtung bewegen können, aber durch unebenes Gelände verlangsamt werden. Normaler A-Stern sollte in den meisten Fällen gut funktionieren, außer auf flachem Land, wo unabhängig davon, wie der Allzweck-Pfadfinder funktioniert, keine Einheiten auf einen direkten Pfad gesendet werden. Theta-Stern würde funktionieren, wenn das gesamte Level ziemlich flach wäre, wäre aber viel langsamer, wenn es anfänglich unebenes Gelände berücksichtigen müsste.

Ich denke, ein Manhattan-Distanz-Basis-A-Stern-Algorithmus wäre schnell und würde einen ausreichend guten Hinweis geben, damit andere Wegfindungs- oder Steuerungsalgorithmen die Kontrolle übernehmen können, aber ich bin mir nicht sicher, welche Art von Algorithmus ich verwenden soll, um nach vorne zu schauen und wann zu entscheiden Um den Pfad zu verlassen, nehmen Sie einen direkteren Weg und springen Sie später auf den Pfad zurück.

(Theta-Stern scheint zu ineffizient zu sein, wenn er angepasst würde, um Dinge wie Hänge, Hindernisse oder Straßen zu berücksichtigen. Siehe die vorgeschlagene Lösung für den Kommentar zur Vermeidung von Minenfeldern unter: http://aigamedev.com/open/ Tutorials / Theta-Stern-beliebige-Winkel-Pfade / )

Bearbeiten: Ich habe nicht erwähnt, dass ich A-Star bereits in einem ähnlichen Raster implementiert und getestet habe. (Ich glaube, ich habe in dieser Frage versehentlich etwas gelöscht.) Einige der offensichtlicheren Kosten- / Heuristikfunktionen, die ich in Betracht gezogen habe, führen einfach nicht zu realistischen Pfaden in einem Raster, wenn ein Hindernis den direktesten Pfad blockiert (im Grunde genommen, wenn die Pfadfindung nützlich ist ) ( Beispielbilder ). Die vom Theta-Stern-Algorithmus verwendete Änderung der Kostenfunktion scheint eine ideale Lösung zu sein (unter Berücksichtigung der Einschränkungen bei der Verwendung eines Rasters), geht jedoch davon aus, dass Kacheln die gleichen Reisekosten haben (und dies viel länger dauert).

Meine ursprüngliche Überlegung hinter der Verwendung der Manhattan-Entfernung bestand darin, den "Eckschnitt" -Algorithmus vom Pfadfindungsalgorithmus auszulagern, da es wichtiger war, einen schnellen Pfadfindungsalgorithmus zu haben, falls sich das Hindernislayout oder das Gelände ändert. Es ist sinnvoller, den "Eckenschneid" -Algorithmus einmal beim Eintreffen der Einheit durchzuführen, als bei jeder Permutation jeder Suche nach einem Pfadfindungsalgorithmus (dessen Ergebnisse möglicherweise ohnehin verschrottet werden). Eine Suche mit vier Nachbarn mit Manhattan-Entfernung ist auch deshalb interessant, weil Sie Kästchen mit alternativen Pfaden sehen und rechtwinklige Dreiecke identifizieren können, die aus dem ursprünglichen Pfad und dem kürzesten Pfad bestehen.

Eine bessere Frage wäre gewesen: "Was ist ein schneller Weg, um Verknüpfungen in einem Pfad mit 90-Grad-Kurven zu identifizieren?"

Meh.
quelle
2
Sie können die Kosten zwischen den Kacheln je nach Neigung / usw. ändern. Warum machen Sie das nicht so einfach?
Kromster
1
Vielleicht möchten Sie sich mit der Pfadglättung befassen . Hier ist ein interessanter Artikel bei Gamasutra.
Bummzack

Antworten:

4

Hast du A * schon eine Chance gegeben? Vorausgesetzt, Sie gewichten Ihre Kosten für verschiedene Geländetypen angemessen, findet es angesichts der verfügbaren Knoten den besten Pfad. Es wird jedoch keine gerade Linie über offenen Ebenen finden, wenn Sie ihm ein quadratisches Gitter geben, was Ihr Problem damit zu sein scheint.

Wenn Sie in der Lage sein möchten, geradlinige Pfade über Ebenen zu erstellen, können Sie die Kanten Ihres Pfads in Segmente zusammenfassen, wo immer der neue Pfad gleich oder kostengünstiger ist (dh gleiche oder geringere Entfernung und nicht durch raueres Gelände). Nehmen Sie einfach jeweils zwei Knotenpaare im Pfad (AB und BC) und prüfen Sie, ob AC eine bessere Route ist. Wenn die Kosten für Wechselstrom gleich oder geringer sind, entfernen Sie B aus der Liste. Wiederholen Sie den Vorgang bis zur Iteration, bei der sich die Liste nicht mehr ändert. Dadurch wird Ihr Problem mit den Ebenen gelöst. Sie müssen eine zusätzliche Verarbeitung durchführen, um sicherzustellen, dass AC ein legaler Schritt ist, und um die Kosten über eine beliebige Entfernung zu berechnen. Sie können auch festlegen, dass Ihre Einheiten den Pfad als allgemeine Richtlinie verwenden und sich an mehreren Positionen zum Knoten bewegen, wobei gleichzeitig eine einfache Hindernisvermeidung angewendet wird.

Sie können auch die Qualität Ihres Pfads erheblich verbessern, indem Sie A * mehr Optionen zum Durchlaufen von Knoten geben. Zum Beispiel ergibt das Hinzufügen von Diagonalen mit ax√2-Kosten einen viel besseren Pfad als das einfache Durchqueren in vier Richtungen.

Ich bin mir nicht sicher, welche Art von Algorithmus ich verwenden soll, um nach vorne zu schauen und zu entscheiden, wann ich den Pfad verlassen, einen direkteren Weg einschlagen und wo ich später auf den Pfad zurückspringen soll.

A * erledigt das schon. Sobald der aktuell untersuchte Knoten nicht mehr die niedrigsten Kosten + Heuristik aufweist, wechselt er zum Knoten mit den niedrigsten Kosten + Heuristik.

Tim R.
quelle