Ich habe eine Liste mit Koordinaten - die vom A * -Algorithmus ausgegeben werden - und ich möchte, dass meine Zeichen diesem Pfad reibungslos mit Rotationen folgen.
Also habe ich so etwas wie A und ich möchte C bekommen
Wie kann ich das machen ?
BEARBEITEN
Um es mir etwas klarer zu machen:
Ich interessiere mich mehr für sanftes Drehen, da ich bereits weiß, wie man von einem Knoten zum anderen geht.
BEARBEITEN
Wie viele Menschen finden , das nützlich (ich auch) Ich bin Entsendung Link zu Daniel Shiffman der „Nature of Code“ , wo er eine Menge Spiel diskutiert AI (und Physik) Probleme zB Lenkverhalten http://natureofcode.com/book/chapter- 6-autonome-agenten / # chapter06_section8
c#
unity
path-finding
Patryk
quelle
quelle
Antworten:
Wenn Sie Pfade in einer kachelbasierten Umgebung glätten möchten, können Sie auf keinen Fall eine Pfadglättung für Ihre A * -Wegpunkte anwenden . In seinem Buch über das Programmierspiel AI beschreibt Matt Buckland einen einfachen und schnellen Algorithmus zum Glätten eines Pfades (im Grunde genommen entfernen Sie alle Kanten, die entfernt werden können, ohne eine Kreuzung mit Ihren Hindernissen zu verursachen).
Sobald Sie unnötige Kanten wie diese entfernt haben, ist Ihr erster Fall ( A -> B ) gelöst. Das Glätten der Kanten in Ihrem Diagramm kann auf verschiedene Arten erfolgen. Höchstwahrscheinlich würden Hermite-Splines funktionieren (abhängig von Ihrer Hindernisdichte und Fliesengröße). Eine andere Möglichkeit ist das Steuern von Verhaltensweisen, bei denen Sie zum nächsten Wegpunkt steuern, sobald Sie eine halbe Kachel vom aktuellen Ziel entfernt sind (dies hängt wirklich davon ab, wie schnell sich Ihr "Agent" bewegt / dreht).
quelle
Wie andere bereits erwähnt haben, müssen Sie für den zweiten Fall eine Art Spline implementieren oder (besser für Ihr Beispiel geeignet) dem Gerät eine Art Lenkverhalten verleihen.
Für den ersten Fall gibt es jedoch eine Lösung, die sowohl einfacher ist als auch bessere Ergebnisse liefert als die Pfadglättung. Es heißt Theta * und ist eine einfache (und relativ neue) Erweiterung von A * in Gittern, die es Einheiten ermöglicht, sich in jede Richtung zwischen Gitterpunkten zu bewegen.
Es gibt einen schönen Artikel erklärt Theta * (von dem stahl ich das Bild oben) hier
quelle
Um eine menschlichere, realistischere Bewegung zu erreichen, sollten Sie versuchen, Lenkverhalten zu integrieren. (C # -Version des klassischen OpenSteer http://sharpsteer.codeplex.com/ ) Sie erhalten die Ausgabe von AStar und lassen das Lenkverhalten auf die Bewegung achten.
quelle
Bei der Navigation von Punkt zu Punkt habe ich die Winkeldifferenz (Richtung des aktuellen Spielers gegenüber der Richtung vom aktuellen Punkt zum nächsten Punkt) verwendet und dann den Winkel schrittweise in den Endwinkel geändert, während die Bewegung erfolgt. Überprüfen Sie dieses Spiel hier, wo sich die Flugzeuge von einem Punkt zu einem anderen bewegen, aber die Wende nicht abrupt ist, sondern wenn Sie genau hinschauen, können Sie die Punkte des Pfades identifizieren. (Das Spiel funktioniert nur auf dem Handy, vorzugsweise iPhone / iPad).
quelle
Ich hatte viel Glück mit Catmull-Rom-Splines (eine Art kubischer Spline, wie auch von @bummzack empfohlen). Das Gute daran ist, dass der Spline immer die Kontrollpunkte durchläuft, viele andere nicht. Implementiere so etwas:
* time ist ein Wert [0,1] zwischen den Kontrollpunkten 1 und 2.
quelle
A-> B kann mithilfe von Navigationsnetzen anstelle eines Gitters gelöst werden. Dies impliziert eine große Änderung bei der Generierung von Pfadfindungsdaten.
Fälle wie C und D sind nur Eckschnitte: Wenn sich ein Zeichen auf einem Pfad und in einer "Ecke" (Zelle, in der sich vorherige, aktuelle und nächste Zellen nicht auf einer geraden Linie befinden) bewegt, schieben Sie es in Richtung der vorherigen und nächsten Zelle . Das einzige Problem besteht darin, die Entfernung von der realen Position (die Schubdistanz) zu bestimmen. Das würde wahrscheinlich die Entfernung von der aktuellen Zelle als Eingabe erfordern. Etwas wie das:
quelle