Wie bringe ich KI-Agenten dazu, sich entlang einer Kurve zu bewegen?

12

Momentan hat mein sehr einfaches KI-Framework Agenten, die sich auf einem gezackten Pfad bewegen, der aus einer Reihe von Punkten besteht.

Navigationspfad

Dazu verschieben sie einfach ihre Position von einem Punkt zum nächsten. Wenn sie den nächsten Punkt erreichen, bewegen sie sich zum nächsten und so weiter. Wie kann ich dies ändern, damit sie sich gleichmäßig entlang einer gekrümmten Version des Pfads bewegen, und wie kann ich die Kurve generieren?

SirYakalot
quelle
Wie wählen sie den nächsten Punkt aus?
FxIII
@FxIII Entschuldigung, ich habe diesen Kommentar vorher nicht gesehen. Meinst du, wie haben sie ein neues Suchziel ausgewählt oder wie haben sie den nächsten Punkt in der Suche ausgewählt?
SirYakalot

Antworten:

4

Du bist nach einer Art Wegeglättung. Natürlich möchten Sie, wie Bummzack betont hat, auch sicherstellen, dass jede von Ihnen durchgeführte Pfadglättung zu rechtlichen Bewegungen für Ihre Agenten führt.

Dieser Artikel von Gamasutra erklärt so ziemlich alles, was Sie wissen müssen, einschließlich Wegeglättung, legaler Abbiegungen und realistischer, reibungsloser Abbiegealgorithmen.

Eine andere, etwas einfachere Alternative besteht darin, ein Suchverhalten mit einem kleinen Begrenzungskreis / einer kleinen Begrenzungskugel zu verwenden, um zu überprüfen, ob sich der Agent am nächsten Punkt auf dem Pfad oder in dessen Nähe befindet.

Ray Dey
quelle
7

Da Sie Ihre Kontrollpunkte bereits kennen, müssen Sie nur Ihren Interpolationscode aktualisieren, um einen Algorithmus für die Krümmung zu verwenden (z. B. Hermite oder Cosine).

Diese Sites bieten eine großartige Erklärung und Beispielcode, die Ihnen den Einstieg erleichtern sollen:

Paul Bourke Interpolationsmethoden

Sol :: Tutorials - Interpolationstricks

Doug.McFarlane
quelle
Was ist, wenn die erzeugte Kurve plötzlich auf ein Hindernis trifft?
Bummzack
Dies gilt nur für die Bewegung der Agenten pro Frame. Das gleiche Kollisionserkennungsverfahren würde immer noch gelten. Wenn eine Kollision erkannt wird, ändern Sie entweder die Kontrollpunkte, um dem Objekt auszuweichen (schwierig), oder verwenden Sie vorübergehend einen anderen Bewegungsalgorithmus.
Doug.McFarlane
@bummzack, das ist ein guter Punkt, und die Antwort ist, ein Navigationsnetz zu verwenden und Ihre Kurven entsprechend zu glätten. Im Moment arbeite ich jedoch nur mit einem einfachen Navigationsdiagramm und werde dies nur durch Glätten lösen die wege ein bisschen.
SirYakalot
@bummzack: Hinzufügen einiger Lenkverhalten zur Vermeidung von Hindernissen über den Algorithmus zur Erzeugung gekrümmter Pfade.
imre
0

Ich gehe hier gegen den Strich und schlage vor, dass Sie Ihre Kurven nicht vorab generieren, sondern nur Frame für Frame behandeln, indem Sie (zum Beispiel) dieselbe Logik verwenden, die Sie zum Erstellen einer Referenzierung verwenden würden Rakete .

Dies wird viel einfacher und wahrscheinlich realistischer, da Sie keine Sonderfälle benötigen, wenn sich Wände zwischen zwei Punkten befinden. Sie führen die Kollisionserkennung einfach wie gewohnt aus.

Der Nachteil ist, dass die Bewegung nicht optimal aussieht. Das Objekt nimmt immer den direktesten Weg von einem Wegpunkt zum nächsten, was bedeutet, dass es sich im Gegensatz zu einem Spline erst dann in Richtung Wegpunkt 3 dreht, wenn es bereits Wegpunkt 2 passiert hat. Abhängig von Ihrer Situation kann dies sein oder nicht Beheben Sie das Problem, indem Sie Ihre Wegpunkte anpassen (falls es überhaupt ein Problem gibt).

BlueRaja - Danny Pflughoeft
quelle
1
Dies wäre im Wesentlichen ein Suchverhalten, das ich vorgeschlagen habe.
Ray Dey
0

Der Pfadfinder sollte Ihnen den Pfad anzeigen und Sie sollten ihn nicht ändern. Ich glaube, dass es möglich ist, Ihren Pfadfinder-Algorithmus so zu ändern, dass er berücksichtigt, dass Pfade mit scharfen Kurven geschrieben werden als solche mit glatten Kurven, wie dies bereits bei langen und kurzen Pfaden der Fall ist.

Ich werde hier eine Lösung veröffentlichen, wenn ich einen Moment finde, um tief darüber nachzudenken, aber ich denke, das ist der richtige Weg.

FxIII
quelle