Wie folgt man einem KI-Pfad in einer 2D-Physik-Engine wie farseer / box2d?


12

Ich bin dabei, ein 2D-Top-Down-Spiel, an dem ich gearbeitet habe, in eine richtige Starrkörper-Physik-Engine wie Farseer umzuwandeln. Bis jetzt hatte ich nur meinen eigenen Physikcode gehackt, wo es nötig war.

Ich versuche zu lernen, wie man hier richtig vorgeht.

Was ist die richtige Methode, um Ihre KI einem festgelegten Pfad zu folgen, nachdem Sie sie in der Physik-Engine zu starren Körpern gemacht haben?

Wenn ich auf meiner Karte einen Pfad mit Navigationsknoten habe, dem die KI folgen muss, würde ich sie zuvor einfach manuell auf dem Pfad verschieben, indem ich die nächste Position errechne, an der sie sich für den nächsten Zeitschritt befinden sollten, und sie manuell auf diese Position setzen .

Aber jetzt sind sie starre Körper und unterliegen Kollisionen und allen Kräften, die sie treffen und vom Weg abwerfen können.

Also, um die KI in Bewegung zu bringen, sollte ich jetzt Impulse / Kräfte auf sie ausüben? Ich sollte nicht länger die Position jedes Frames manuell einstellen.

Ich denke also, ich muss von einer deterministischen Welt weg, in der ich die KI zwinge, einem strengen Pfad zu folgen, zu einer nicht deterministischen Welt, in der sie bei einem Treffer in eine beliebige Richtung geschleudert werden können, und ich schiebe sie einfach zum nächsten Knoten im Pfad um sie in Bewegung zu bringen.

Ist das richtig? Tun es andere Leute so?

Dies wirft einige Fragen auf, wie Sie verhindern können, dass Ihre KI in den Kulissen hängen bleibt, da sie keinen präzisen Weg gehen. Wie geht ihr mit solchen Dingen um?

Oder ist es besser, die beiden zu mischen und Ihre KI dennoch einem festen Pfad zu folgen, indem Sie ihre Position manuell festlegen und nur unter bestimmten Umständen auf andere Kräfte reagieren, die Sie leicht kontrollieren können?

Danke für jeden Rat Jungs.


1
+1 Ich bin auch sehr daran interessiert, etwas darüber zu lernen.
David Gouveia

Antworten:


7

Lenkverhalten funktioniert sehr gut in Kombination mit einer Physik-Engine, da sie normalerweise so implementiert werden, dass sie eine "Lenkkraft" zurückgeben, die dann auf Ihren Physik-Körper angewendet werden kann.

Um eine Einheit dazu zu bringen, einem Pfad zu folgen, können Sie mit Seek von Pfadknoten zu Pfadknoten wechseln (achten Sie darauf, Überschwingen zu vermeiden) und dann Arrival verwenden am letzten Knoten in Ihrem Pfad verwenden.

Was Ihre Bedenken betrifft, nicht weiterkommen zu wollen: Die Modellierung der Pfadverfolgung mithilfe von Kräften sollte eigentlich ziemlich genau sein. Sie haben Recht, dass ein Objekt aus dem Weg geworfen wird, wenn es mit einem anderen Objekt kollidiert. Da Sie jedoch bei jedem Update eine Lenkkraft berechnen, sollte das Objekt in kürzester Zeit wieder auf Kurs sein. Wenn die Abweichung vom Pfad nach einer Kollision möglicherweise sehr groß sein kann, sollten Sie sich bei jeder Kollision an Ihre letzte Position erinnern und das Objekt dann an diese letzte Position zurücklenken, bevor Sie die normale Route fortsetzen.


Erstaunlicher Artikel, danke fürs Teilen. Ich habe meinen Tag gerettet.
Ricardo Sanchez-Saez

0

Ich würde sagen, Sie sind auf dem richtigen Weg. Vielleicht möchten Sie sich diesen Artikel ansehen:

http://www.policyalmanac.org/games/aStarTutorial.htm

Es werden einige grundlegende Methoden zur Vermeidung von Kollisionen und zur Pfadfindung unter Verwendung des A * -Algorithmus erläutert.

Bearbeiten:

Wenn Sie wirklich nur brauchen, was der beste Weg ist, um Ihre Objekte in die richtige Richtung zu treiben, sollten Sie eine Kraft (z. B. MovementForce oder so) einsetzen, die mit dem Pfadfindungsalgorithmus Ihres Computers in Richtung des besten Pfades zeigt Wahl


Ich denke nicht, dass dieser Artikel für diese Frage relevant ist. Das OP fragt nicht, wie man den optimalen Weg zwischen zwei Orten findet, sondern wie man einen Schauspieler im Rahmen einer Physiksimulation dazu bringt, einem bereits berechneten Weg zu folgen.
David Gouveia

Nun,

:) Ich habe auch den Titel geändert, um die Dinge zu klären. Bestimmt daran interessiert, dem Pfad zu folgen, anstatt ihn zu finden.
TerryB

0

Gemessen an dem, was @davidluzgouveia zu dem Beitrag von annonymously kommentiert hat, werde ich mein Projekt ansprechen. Pfadverfolgung und Pfadfindung sind jedoch sehr unterschiedlich. Die Pfadsuche ist eher das, worüber anonym gepostet wurde, und für die Pfadsuche würde ich den Algorithmus von Dijkstra untersuchen. Für die Pfadverfolgung verwende ich ausschließlich die von mir gewählte Physik-Engine. Ich habe es so eingerichtet, dass jede Position, zu der eine Einheitenklasse geht, in ihrer Pfadunterklasse über 2D-Offsets eingerichtet wird. Ja, sie sind 2D und nicht 3D. Dies liegt an der Art und Weise, wie ich meine Physik in meinem Spiel eingerichtet habe .

3D-Erklärung: Jede Einheit verfügt nur über einen Hauptkollider, der ausschließlich für die Kollision mit dem Gelände und den Weltobjekten eingerichtet ist. Es ist eine Kapselform und hat einen Radius und programmatisch eine Höhe. Es befindet sich in der Mitte des Modells und sollte sich über die Vorder- und Oberseite des Modells erstrecken. Ich habe aber auch einen Oberflächenversatz, der angibt, wie weit es zu jeder Zeit vom Boden entfernt ist, und einen Wert, der angibt, wie weit es nach unten rutschen darf, bevor es zu einem bestimmten Zeitpunkt leicht nach oben springt. Das hört sich so an, als würde ich eine Art Fehlerbehebung für ein Problem mit Geländekollisionen anwenden, aber ich habe meine Gründe.

Üben Sie auf jeden Fall Kraft auf dieses Kapselobjekt aus und es sollte immer über dem Boden schweben. Das heißt nicht, dass es nicht höher gehen kann, nur dass es nicht tiefer gehen kann. Der Grund, warum es (in meinem Fall) schweben muss, ist, dass in einer Starrkörper- und Ragdoll-Physik-Engine die Beine meiner Einheiten prozedural animiert sind. Wenn Sie also eine einfache Kraft auf die Kapsel ausüben, positionieren sich die Beine meines Wesens von selbst neu. Sie werden auch ihre separaten Schwerkraftanwendungen haben! Wenn sich mein Charakter auf einer Schräge befindet, kann sich ein Fuß auf einer niedrigeren Höhe als der andere befinden.

Genau so solltest du es machen. Nach dem zu urteilen, was du fragst, ist das. Wenn Sie auf einige Funktionen verzichten möchten, ist dies offensichtlich in Ordnung, insbesondere wenn es sich um eine Echtzeit- oder FPS-Funktion handelt und niemand jemals Geräte sehen wird, die sich um Füße oder Gegenstände kümmern. Im Allgemeinen sollte die Einheit jedoch ein Hauptkollisionsobjekt haben, das fast ausschließlich mit der Bewegung des Charakters arbeitet.

Speziell 2D: Sie sollten immer noch einen Hauptpunkt oder nur eine Art Referenz haben, damit der Motor herumschiebt, das ist für die Bewegung einer Einheit. Sie können jeder Einheit eine Pfad-Unterklasse zuweisen, die einige Orte enthält, zu denen sie gehen muss. Sie können sie im Ebenencode angeben (z. B. Ort1 (x, y) Ort2 (x, y) usw.) Sie wissen nicht, an welcher Art von Spiel Sie arbeiten.) Es wäre wahrscheinlich, Orte in der Ebene anzugeben und zu veranlassen, dass jede Einheit sie in der von der Ebene festgelegten Reihenfolge verarbeitet. Wenn sie jeden Ort erreicht hat, muss sie den gewünschten Ort durch ersetzen das nächste muss es erreichen.

Es gibt unzählige Möglichkeiten, die Sie ändern können, z. B. eine Liste der Standorte für jede Einheit, da dies bedeuten würde, dass nicht alle Einheiten an denselben Standorten arbeiten müssen. Auf die gleiche Weise können Sie dies jedoch auch im Level-Code tun (unit1.location1 (x, y) unit1.location2 (x, y) grunt.l1 (x, y) knight.loc3 (x, y) was auch immer)

Nur ein paar Ideen! Ich schlage vor, Sie lesen die 3D-Version, obwohl sie weit weniger relevant ist.

BEARBEITEN: Ich habe mich entschlossen, beide nur für diejenigen bereitzustellen, die dies lesen könnten (Ja, das stimmt). (Ich habe ursprünglich nur Ihre Frage überflogen und nicht bemerkt, dass sie ziemlich 2D-spezifisch ist, bis ich sie erneut las>.>)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.