Finden der richtigen Geschwindigkeit, mit der sich die KI dreht, um das Ziel zu erreichen

10

Ich habe ein Schiff, das mit maximaler Geschwindigkeit fährt maxSpeedund rotationSpeedGrad pro Sekunde drehen kann . Das Schiff bewegt sich immer in die Richtung, in die es zeigt. Je schneller das Schiff fährt, desto größer ist sein Wenderadius.

Ich kenne meine Position, Rotation und die Position des Ziels.

Was ich herausfinden möchte, ist, ob sich ein Ziel mit dieser Geschwindigkeit innerhalb meines Wenderadius befindet oder besser, mit welcher Höchstgeschwindigkeit ich mich bewegen kann, um zum Ziel zu drehen, ohne es ständig zu umkreisen.

Gibt es einen effizienten (ish) Weg, dies zu tun?

Folgendes denke ich bisher: Da ich weiß, wie weit ich pro Schritt fahre und wie viel ich pro Schritt drehe, kann ich herausfinden, wo ich in den nächsten zwei Bildern sein werde. Meine aktuelle Position ist p1, meine nächste Position ist p2, dann p3. Ich kann die senkrechten Winkelhalbierenden von (p1, p2) und (p2, p3) nehmen. Ihr Schnittpunkt gibt mir den Mittelpunkt eines Kreises. Ich kann dann testen, ob sich das Ziel in diesem Kreis befindet.

Ich bin mir nicht sicher, ob dies in 3D funktioniert (ich bin mir nicht sicher, wie ich eine Kugel mit meinen Eingaben berechnen soll). Diese Lösung hilft auch nicht allzu viel bei der Suche nach der richtigen Reisegeschwindigkeit. Ich müsste ein paar Mal mit unterschiedlichen Geschwindigkeiten versuchen, um eine vernünftige zu finden.

Kann jemand etwas Licht auf eine bessere Lösung werfen?

weichsem
quelle

Antworten:

17

Es gibt zwei Möglichkeiten, wie eine KI-gesteuerte Einheit mit einer begrenzten Drehzahl und einer einstellbaren Bewegungsgeschwindigkeit ein Ziel erreichen kann.

Betrachten wir zunächst die Herausforderung, die uns gestellt wird, damit wir sie besser verstehen können:

Geben Sie hier die Bildbeschreibung ein

Wenn sich der Spieler mit konstanter Geschwindigkeit bewegt und dreht, während er versucht, ein Ziel zu erreichen, das sich auf der rechten oder linken Seite befindet, bewegt er sich für immer im Kreis und steht niemals seinem Ziel gegenüber. Die beiden Bereiche, die der Spieler umkreist, sind oben rot markiert.

Die rot markierte Kreisfläche kann folgendermaßen berechnet werden:

radius = movementSpeed / rotationSpeedInRadians;
circlesCenterX = unitX + cos(unitAngle + / - PI) * radius;
circlesCenterY = unitY + sin(unitAngle + / - PI) * radius;

Dies ergibt die Position und den Radius der roten Kreise. Wir können dies verwenden, um festzustellen, ob ein bestimmtes Ziel außerhalb der Reichweite der KI-gesteuerten Einheit liegt, wenn es sich weiterhin in Richtung des Ziels dreht.

Um herauszufinden, ob sich ein bestimmtes Element in einem der Kreise befindet, berechnen wir einfach den Abstand vom Mittelpunkt der Kreise:

if ((circleX - goalX)^2 + (circleY - goalY)^2 < radius^2) //goal is within red circle

Hierfür gibt es zwei mögliche Lösungen:

1.

Bauen Sie etwas Abstand auf, bis sich das Ziel außerhalb des kreisförmigen roten Bereichs befindet, und drehen Sie sich dann wie eine Kehrtwende um. Dies ist einfach. Lassen Sie die Einheit in Bewegung bleiben, bis der Scheck zurückkehrt, dass das Ziel nicht innerhalb dieses Kreises liegt. Dann können Sie sich umdrehen.

Geben Sie hier die Bildbeschreibung ein

Die andere Option erfordert etwas mehr Arbeit zum Berechnen:

Wir ziehen eine imaginäre Linie zwischen der KI-Einheit und dem Ziel. Verwenden Sie den Winkel zwischen ihnen:

angle = Math.atan2(goalY - unitY, goalX - unitX);

Jetzt müssen Sie Folgendes tun, um die richtige Geschwindigkeit zu berechnen:

correctSpeed = rotationSpeedInRadians * (distance / 2) / cos(angle);

Geben Sie hier die Bildbeschreibung ein

Um es im 3D-Fall zum Laufen zu bringen:

Suchen Sie die Ebene, auf der sich die folgenden drei Punkte befinden:

  1. Der Zielpunkt.
  2. Die Position der AI-Einheit im vorherigen Frame.
  3. Die aktuelle Position der AI-Einheit.

Sie können diese Ebene verwenden, um die Geschwindigkeit auf 2D-Weise zu berechnen. Sie müssen nur die Punkte von ihren 3D-Werten in die 2D-Werte konvertieren, die in ihrer gemeinsamen Ebene eingebettet sind.

Vielleicht möchten Sie dies verwenden:

Wie konvertiere ich einen 3D-Punkt in einer Ebene in UV-Koordinaten?

AturSams
quelle
Perfekt! Genau die Antwort, auf die ich gehofft hatte! Vielen Dank für Ihre ausführlichen Erklärungen. Ich denke, ich kann dies extrapolieren und in 3D verwenden.
weichsem
@weichsem Ich habe die Antwort aktualisiert. Die Idee, die ich vorgeschlagen habe, ist, eine gemeinsame 2D-Ebene zu finden, die sie teilen, und sie zu verwenden, um die richtige Geschwindigkeit zu berechnen.
AturSams