Ich schreibe eine Simulation, in der ein Kreaturobjekt in der Lage sein sollte, sich auf ein beliebiges anderes Objekt in der Umgebung zu bewegen, um Hindernisse zu gleiten, anstatt irgendeine intelligente Pfadsuche durchzuführen. Ich versuche nicht, einen Pfad zu haben - nur um in eine allgemeine Richtung zu gehen und um Hindernisse herum zu springen.
Es ist eine 2D-Umgebung (Draufsicht), und jedes Objekt hat ein begrenzendes Rechteck für die Kollisionserkennung. Es gibt kein Gitter und ich suche keine A * Lösung.
Ich konnte keine Tutorials zu dieser Art von "dummer" kollisionsgestützter Wegfindung finden, daher beschreibe ich das vielleicht nicht mit den gebräuchlichsten Begriffen.
Gibt es Empfehlungen zur Implementierung (oder Links zu Tutorials)?
Was Guillaume über die Vermeidung von Hindernissen gesagt hat, ist eine anti- Schwerkraftbewegung . Sie behandeln lokale Hindernisse als Punktquellen der Antigravitation, das Ziel als Schwerkraft, und Ihr computergesteuerter Charakter rutscht (wie Seife!) Um die Hindernisse herum, um zum Ziel zu gelangen.
Sie können zwei Steueralgorithmen kombinieren:
seek : Sie wenden eine Lenkkraft in der Richtung an, die die Differenz zwischen der aktuellen Geschwindigkeit und der gewünschten Geschwindigkeit zum Ziel darstellt
Hindernisvermeidung : Sie antizipieren die Zukunft des Fahrzeugs mit einer Box, deren Länge eine konstante Zeit multipliziert mit der aktuellen Geschwindigkeit des Fahrzeugs ist. Jedes Hindernis, das diese Box schneidet, ist eine potenzielle Kollisionsgefahr. Die nächste solche Bedrohung wird zur Vermeidung ausgewählt. Um ein Hindernis zu vermeiden, wird eine seitliche Lenkkraft entgegen der Mitte des Hindernisses aufgebracht. Zusätzlich wird eine Brems- (Verzögerungs-) Kraft aufgebracht. Diese Kräfte variieren mit der Dringlichkeit (der Abstand von der Spitze der Box bis zum Punkt der möglichen Kollision). Lenkung variiert linear, Bremsung variiert quadratisch.
Weitere Informationen finden Sie auf der Website " Lenkverhalten für autonome Charaktere "
Grüße
Guillaume
PS: Angenommen, Sie verwenden eine Punkt / Geschwindigkeit / Beschleunigung-Methode für die Bewegung des Objekts.
Immer wenn deine Kreatur, die in Vektorrichtung v
reist, mit einer Mauer kollidiert, deren Richtung durch den Vektor w
repräsentiert wird, wird die Richtung, die du "gleiten" musst, durch den Vektor von% co_de gegeben % auf v
. Dies kann mit
Dabei ist w
das Vektor-Dot-Produkt und .
ist die Größe des Vektors |w|
(= %Code%). Wenn w
ein Einheitsvektor ist, wird dies einfach
Wenn du den sich ergebenden Vektor als Geschwindigkeit deiner Kreatur verwendest, wird deine Kreatur schnell reisen, wenn sie nur die Wand "streift", und langsam, wenn sie fast gegen die Wand schlägt. (Dies ist, wie die meisten First-Person-Shooter-Spiele Kollisionen für den menschlichen Spieler verwalten.)
Wenn deine Kreatur stattdessen immer mit voller Geschwindigkeit fahren soll, brauchst du nur das Zeichen sqrt(w . w)
- du wirst immer entweder in Richtung der Wand ( w
) oder in die entgegengesetzte Richtung ( v . w
).
Das Problem, das du haben wirst, ist, wenn deine Kreatur direkt gegen die Wand schlägt. In diesem Fall ist Ihr projizierter Vektor (0, 0), und Sie benötigen eine andere Technik, um zu entscheiden, auf welche Weise ( w
oder -w
) gehen soll. Der übliche Ansatz ist hier A *, obwohl dies unnötig sein kann, wenn Ihre Umgebung genügend Struktur besitzt.
Ich habe vor einiger Zeit in C # einen Pathfinding-Algorithmus gepostet
Sie können versuchen, es als Ausgangspunkt zu verwenden, dh Sie könnten die Funktion ändern, die die nächste Zelle überprüft, um zu sehen, ob es möglich ist, nach Hindernissen zu suchen, und Sie könnten kleine Intervalle anstelle von Anfang und Ende eingeben Punkte, ähnlich wie mehrere Mini-Pahfinding-Routen.
(Der Text ist in Spanisch, aber Sie können die Anwendung über den Link oben herunterladen)
Tags und Links collision-detection xna path-finding 2d