Wie man die Schwerkraft berücksichtigt, wenn man KI bewegt

9

Ich mache ein 2D-Spiel. Derzeit fliegt ein Hubschrauber herum, der vom Spieler gesteuert wird. Die Steuerung erfolgt über die Pfeiltasten: AUF, LINKS und RECHTS.

Die Geschwindigkeit entlang der y-Achse ist dyund die Geschwindigkeit entlang der x-Achse ist dx.

Die Physik ist wie folgt:

Wenn UP nicht gedrückt wird , dybeschleunigt es mit konstanter Beschleunigung auf unbestimmte Zeit nach unten. (Schwere). dxbleibt in seinem aktuellen Wert.

Wenn UP gedrückt wird , dybeschleunigt es mit konstanter Beschleunigung von dem, was es gerade ist, auf 4 (nach oben, bis es Geschwindigkeit 4 erreicht). dxbleibt in seinem aktuellen Wert.

Wenn LINKS gedrückt wird , dxwird mit konstanter Beschleunigung von -10 auf -4 beschleunigt .

Wenn RECHTS gedrückt wird , beschleunigt dx mit konstanter Beschleunigung von derzeit auf 4 .

(Wenn LINKS oder RECHTS gedrückt wird und UP nicht gleichzeitig gedrückt wird, wie gesagt: wird dyimmer kleiner, weil die Schwerkraft den Hubschrauber beeinflusst)

All dies führt dazu, dass der Hubschrauber häufig Bögen in der Luft folgt und nicht geraden Linien.

Dies schafft Physik, die ziemlich realistisch erscheint.

Meine Frage ist:

Der gegnerische Hubschrauber, eine KI, sollte sich mit demselben Physiksystem bewegen.

Nehmen wir an, die KI möchte von dort, wo sie sich gerade befindet, zu Punkt B gelangen.

Geben Sie hier die Bildbeschreibung ein

Wenn es keine Schwerkraft und keine allmähliche Beschleunigung im Spiel gäbe, wäre es einfach. Ich würde einfach einen Vektor von der Position der KI zu Punkt B zeichnen und die KI dazu bringen, ihm zu folgen.

Da es jedoch Schwerkraft und allmähliche Beschleunigung gibt, kann sich die KI niemals (fast) geradlinig bewegen . Was wäre der beste Weg, um die KI so zeiteffizient wie möglich zu Punkt B zu bringen?

Wie kann ich die Schwerkraft berücksichtigen, wenn ich die KI auf ein bestimmtes Ziel hin bewege?

(Wenn es einfacher zu erklären ist, betrachten Sie Punkt B auf der y-Achse als auf der gleichen Ebene wie die KI und nicht diagonal dazu.)

Vielen Dank

user3150201
quelle
Können Sie die Physik der KI deaktivieren, während sie sich bewegt? Wenn ja, können Sie es deaktivieren, während es sich dem Punkt nähert, und es aktivieren, wenn es es erreicht.
Zhafur
@Zhafur Dies lässt die Bewegung der KI unrealistisch erscheinen oder zumindest einen Unterschied zu der Bewegung des Spielers. Ich möchte, dass die Bewegung der KI genauso aussieht wie die Bewegung des Spielers.
user3150201

Antworten:

4

tl; dr:

TimeToStop.x = CurrentSpeed.x / Accelaration.x;

if (TimeToStop.x * CurrentSpeed.x >= 1.99 * DistanceFromTarget.x)
    slow_down_x(); // CurrentSpeed += Acc.x * direction;
else
    speed_up_towards_target_x(); // CurrentSpeed += Acc.x * direction;

Gleiches gilt für y. Denken Sie daran, die Geschwindigkeit so zu begrenzen, dass sie zwischen Null und der Höchstgeschwindigkeit liegt. Wenn der Feind irgendwann eine sehr langsame Geschwindigkeit hat und versucht anzuhalten, kann er sich in die entgegengesetzte Richtung bewegen. Lassen Sie es nicht zu. Stoppen Sie ihn, wenn er langsamer wird und seine Geschwindigkeit unter 1 * Acc liegt.

Lange Version: Wenn keine Hindernisse vorhanden sind, ist die Bewegung auf der y-Achse für die Bewegung auf der x-Achse völlig irrelevant (und hat keinen Einfluss darauf). Die von Ihnen beschriebene Frage kann also in zwei separate Fragen unterteilt werden.

  1. Bewegen Sie sich dort auf x-Achse
  2. Und dort auf y-Achse bewegen.

CS.x& CS.ysind unsere aktuelle Geschwindigkeit auf der x- und y-Achse.

TS.x& TS.yIst die Zeit, die Sie benötigen würden, um nur vertikal oder horizontal anzuhalten, unter Berücksichtigung Ihrer aktuellen Geschwindigkeit in der entsprechenden Achse.

D.x& D.ysind der Abstand auf jeder Achse.

tl; dr: Sie beschleunigen weiter (wenn möglich [sofern Sie nicht die Höchstgeschwindigkeit erreicht haben]) auf der x-Achse, bis Sie eine Stelle erreichen, an der die folgende Bedingung erfüllt ist:

if (TS.x * CS.x >= 1.99 * D.x) hit_the_breaks_on_x();

Das gleiche gilt für y.

AturSams
quelle
2

Ein Ansatz, den ich für ein ähnliches Problem verwendet habe, bestand darin, zuerst einen Vektor zum Ziel zu zeichnen und diesen dann mit der aktuellen Geschwindigkeitsrichtung zu vergleichen.

Nehmen Sie also den vorzeichenbehafteten Winkel zwischen dem Geschwindigkeitsvektor und dem Zielvektor und wenden Sie einen Schub relativ zur Größe des Vektors an.

Wenn also der Winkel a zwischen dem roten Geschwindigkeitsvektor und dem grünen Zielvektor negativ ist, wenden Sie einen positiven Schub an, andernfalls wenden Sie keinen Schub an und lassen Sie die Schwerkraft ihn aussortieren.Geben Sie hier die Bildbeschreibung ein

Beachten Sie, dass Sie die vier Quadranten behandeln müssen, in denen sich das Ziel möglicherweise anders befindet (als ob sich das Ziel in der oberen linken Ecke befunden hätte, hätte ein positiver Winkel das Anwenden von Schub erforderlich gemacht).

Stellen Sie außerdem sicher, dass der Schub relativ zur Abweichung von der Zielgeschwindigkeit angewendet wird.

Technisch gesehen berücksichtigt dies nicht die Schwerkraft, sondern gleicht den aktuellen Zustand aus und bedeutet, dass der KI-Hubschrauber möglicherweise nicht in einer geraden Linie zum Ziel fliegt, sondern ein wenig wackelt. Dies kann für Ihr Spiel funktionieren oder nicht.

Bornander
quelle
1
Vielen Dank. Einige Fragen dazu: 1- "... einen Schub relativ zur Größe des Vektors anwenden " . Meinten Sie "Größe des Winkels " ? 2- Mit "vorzeichenbehafteter Winkel" meinen Sie positiv oder negativ - richtig? Wenn ja, ist ein Winkel positiv, wenn er über der braunen Linie liegt, und negativ, wenn er unter der braunen Linie liegt. Richtig? 3- Wenn ich richtig verstehe, meinen Sie: In jedem Bild erhalten Sie den Winkel zwischen dem aktuellen Geschwindigkeitsvektor und dem aktuellen Vektor zum Ziel. Dann addiere / subtrahiere von dx und dy entsprechend. Ist das richtig?
user3150201
@ user3150201 Ja zur Winkelfrage. Ja, bei der vorzeichenbehafteten / vorzeichenlosen Frage kann atan2 den vorzeichenbehafteten Winkel zwischen zwei Vektoren angeben. Es sieht so aus, als hätten Sie meinen Standpunkt verstanden. Entschuldigen Sie, wenn ich unklar war.
Bornander
1

Sie können einfach die Bewegung jedes X-Frames neu berechnen. Vorausgesetzt, Sie setzen nicht zu viele Frames dazwischen, aber genug, um die Leistung nicht zu beeinträchtigen, sollte die Schwerkraft eines Hubschraubers nicht stark genug sein, um wirklich zu sehen, wie sich die Flugbahn ändert. Außerdem denke ich, dass sich ein Spieler möglicherweise auf die gleiche Weise bewegen könnte, indem er sich während der Bewegung an die Schwerkraft anpasst und diese nicht geplant hat.

Alexandre Dansereau
quelle