Bisher haben wir uns das Such-, Flucht-, Ankunfts- und Wanderungsverhalten angesehen. In diesem Tutorial werde ich das behandeln Verfolgung und das ausweichen Verhaltensweisen, durch die Ihre Charaktere dem Ziel folgen oder es vermeiden.
Hinweis: Obwohl dieses Tutorial mit AS3 und Flash geschrieben wurde, sollten Sie in der Lage sein, in fast jeder Spieleentwicklungsumgebung dieselben Techniken und Konzepte zu verwenden. Sie müssen ein grundlegendes Verständnis von mathematischen Vektoren haben.
Eine Verfolgung ist der Prozess des Verfolgens eines Ziels fang es. Es ist wichtig zu wissen, dass das Wort "catch" hier den Unterschied macht. Wenn etwas nur einem Ziel folgt, muss es nur die Bewegungen des Ziels wiederholen und als Folge wird es auf der Spur sein.
Wenn etwas verfolgt wird, muss der Verfolger dem Ziel folgen, muss jedoch auch voraussehen, wo sich das Ziel in naher Zukunft befinden wird. Wenn Sie vorhersagen können (oder schätzen), wo sich das Ziel innerhalb der nächsten Sekunden befindet, können Sie die aktuelle Flugbahn anpassen, um unnötige Routen zu vermeiden:
Wie in den ersten Tutorials beschrieben, wird die Bewegung mithilfe der Euler-Integration berechnet:
Position = Position + Geschwindigkeit
Wenn die Position und Geschwindigkeit des aktuellen Charakters bekannt sind, kann als direkte Folge vorhergesagt werden, wo er sich innerhalb des nächsten befindet T
Spiel-Updates. Angenommen, der Charakter bewegt sich in einer geraden Linie und die Position, die wir vorhersagen wollen, ist drei Aktualisierungen voraus (T = 3
), wird die zukünftige Position des Charakters sein:
Position = Position + Geschwindigkeit * T
Der Schlüssel für eine gute Vorhersage ist der richtige Wert für T
. Wenn der Wert zu hoch ist, bedeutet dies, dass der Verfolger am Ende einem Geist nachjagt. Ob T
ist zu nahe an Null, bedeutet dies, dass der Verfolger das Ziel nicht wirklich verfolgt, aber es folgt ihm nur (keine Vorhersage).
Wenn die Vorhersage für jeden Spielrahmen berechnet wird, funktioniert sie auch, wenn das Ziel ständig seine Richtung ändert. Bei jedem Update wird eine neue "zukünftige Position" basierend auf dem aktuellen Geschwindigkeitsvektor des Charakters generiert (der auch die Bewegungsrichtung leitet).
Das Verfolgungsverhalten funktioniert auf die gleiche Weise wie Suchen, der einzige Unterschied besteht darin, dass der Verfolger nicht das Ziel selbst sucht, sondern seine Position in der nahen Zukunft.
Angenommen, jeder Charakter im Spiel wird durch eine benannte Klasse dargestellt Boid
, Der folgende Pseudo-Code implementiert die Grundidee des Verfolgungsverhaltens:
öffentliche Funktionsverfolgung (t: Boid): Vector3D T: int = 3; futurePosition: Vector3D = t.position + t.velocity * T; Rückkehr suchen (futurePosition);
Nach der Verfolgungskraftberechnung muss er wie alle vorherigen Lenkkräfte zum Geschwindigkeitsvektor addiert werden:
public function update (): void Lenkung = Verfolgung (Ziel) Lenkung = verkürzt (Lenkung, max_force) Lenkung = Lenkung / Masse Geschwindigkeit = verkürzt (Geschwindigkeit + Lenkung, max_speed) Position = Position + Geschwindigkeit
Die folgende Abbildung veranschaulicht den Vorgang:
Der Verfolger (der Charakter am unteren Rand) sucht die zukünftige Position des Ziels nach einer durch die orange Kurve beschriebenen Flugbahn. Das Endergebnis wird sein:
Das Verfolgungsverhalten mit T = 30
. Klicken Sie auf die Demo, um Kraftvektoren anzuzeigen. Das Ziel sucht die Maus.
Es gibt ein Problem, wenn der Wert von T
ist konstant: Die Verfolgungsgenauigkeit ist tendenziell schlecht, wenn sich das Ziel in der Nähe befindet. Dies liegt daran, dass der Verfolger, wenn sich das Ziel in der Nähe befindet, weiterhin nach der Vorhersage der Position des Ziels sucht T
Frames "weg".
Dieses Verhalten würde bei einer echten Verfolgung niemals passieren, da der Verfolger wissen würde, dass er nahe genug am Ziel ist und aufhören sollte, seine Position vorherzusagen.
Es gibt einen einfachen Trick, der implementiert werden kann, um dies zu vermeiden und die Verfolgungsgenauigkeit drastisch zu verbessern. Die Idee ist sehr einfach. statt eines konstanten Wertes für T
, ein dynamisches wird verwendet:
T = distanceBetweenTargetAndPursuer / MAX_VELOCITY
Das neue T
wird basierend auf der Entfernung zwischen den beiden Zeichen und der maximalen Geschwindigkeit berechnet, die das Ziel erreichen kann. In einfachen Worten das Neue T
meint "Wie viele Updates benötigt das Ziel, um von seiner aktuellen Position zur Verfolgerposition zu wechseln".
Je länger der Abstand, desto höher T
wird der Verfolger einen Punkt weit vor dem Ziel suchen. Je kürzer der Abstand, desto niedriger T
wird sein, was bedeutet, dass ein Punkt sehr nahe am Ziel gesucht wird. Der neue Code für diese Implementierung lautet:
öffentliche Funktionsverfolgung (t: Boid): Vector3D var distance: Vector3D = t.position - position; var T: int = distance.length / MAX_VELOCITY; futurePosition: Vector3D = t.position + t.velocity * T; Rückkehr suchen (futurePosition);
Das Endergebnis ist:
Das Verfolgungsverhalten mit einer Dynamik T
. Klicken Sie auf die Demo, um Kraftvektoren anzuzeigen. Das Ziel sucht die Maus.
Das Ausweichverhalten ist das Gegenteil des Verfolgungsverhaltens. Anstatt die zukünftige Position des Ziels zu suchen, flieht der Charakter diese Position:
Der Code für das Ausweichen ist fast identisch, nur die letzte Zeile wird geändert:
öffentliche Funktionsumgehung (t: Boid): Vector3D var distance: Vector3D = t.position - position; var updatesAhead: int = Entfernung.Länge / MAX_VELOCITY; futurePosition: Vector3D = t.position + t.velocity * updatesAhead; Rückkehr Flucht (futurePosition);
Das Endergebnis ist folgendes:
In diesem Lernprogramm wurden die Verfolgung und das Umgehungsverhalten beschrieben, die sich hervorragend zum Simulieren einer Vielzahl von Mustern eignen, z. B. einer Gruppe von Tieren, die versuchen, einem Jäger zu entkommen.
Ich hoffe, Sie haben diese Tipps bisher genossen und können all diese Verhaltensweisen verwenden, um noch bessere Muster zu erzeugen! Bleiben Sie auf dem Laufenden, indem Sie uns auf Twitter, Facebook oder Google folgen+.