Ich weiß, dass dies eine veraltete Frage ist, aber ich denke, dass in den bisher gegebenen Antworten etwas verpasst wurde. In der ursprünglichen Frage wurde der Rakete (oder was auch immer) befohlen, auf die Position des Ziels zu beschleunigen. In mehreren Antworten wurde darauf hingewiesen, dass dies falsch war, und Sie sollten beschleunigen, bis Sie das Ziel zu einem späteren Zeitpunkt erreicht haben. Das ist besser aber immer noch falsch.
Was Sie wirklich tun möchten, ist nicht auf das Ziel zu beschleunigen, sondern sich auf das Ziel zu bewegen . Die Art und Weise, wie Sie darüber nachdenken, besteht darin, Ihre gewünschte Geschwindigkeit auf das Ziel zu richten (oder eine Projektion des Zielorts) und dann herauszufinden, welche Beschleunigung Sie am besten anwenden können (ungeachtet der Einschränkungen, die Sie haben, dh eine Rakete kann wahrscheinlich nicht beschleunigen direkt in umgekehrter Richtung), um die gewünschte Geschwindigkeit zu erreichen (wobei zu beachten ist, dass die Geschwindigkeit ein Vektor ist).
Hier ist ein Beispiel, das ich heute Morgen umgesetzt habe, in meinem Fall für eine Spieler-KI in einem Sportsimulationsspiel, in dem der Spieler versucht, seinen Gegner zu jagen. Die Bewegung wird von einem Standardmodell für "Kick-Drift" gesteuert, bei dem zu Beginn eines Zeitschritts Beschleunigungen angewendet werden, um die Geschwindigkeiten zu aktualisieren, und Objekte dann für die Dauer des Zeitschritts mit dieser Geschwindigkeit driften.
Ich würde die Ableitung hiervon posten, aber ich habe festgestellt, dass auf dieser Site kein mathematisches Markup unterstützt wird. Boo! Sie müssen nur darauf vertrauen, dass dies die optimale Lösung ist, da ich keine Einschränkungen in Bezug auf die Beschleunigungsrichtung habe, was für ein Objekt vom Typ Rakete nicht der Fall ist und daher einige zusätzliche Einschränkungen erfordern würde.
Code ist in Python, sollte aber mit jedem Sprachhintergrund lesbar sein. Der Einfachheit halber gehe ich davon aus, dass jeder Schritt eine Länge von 1 hat, und drücke die Geschwindigkeit und Beschleunigung in geeigneten Einheiten aus, um dies widerzuspiegeln.
self.x = # current x co-ordinate
self.y = # current y co-ordinate
self.angle = # current angle of motion
self.current_speed = # current magnitude of the velocity
self.acc # Maximum acceleration player can exert on themselves
target_x = # x co-ordinate of target position or projection of it
target_y = # y co-ordinate of target position or projection of it
vx = self.current_speed * math.cos(self.angle) # current velocity x component
vy = self.current_speed * math.sin(self.angle) # current velocity y component
# Find best direction to accelerate
acc_angle = math.atan2(self.x + vx - target_x,self.y + vy - target_y)
Beachten Sie, dass die Funktion atan2 (a, b) die Inverse tan von a / b berechnet, jedoch sicherstellt, dass die Winkel im richtigen Quadranten eines Kreises liegen, wofür das Vorzeichen von a und b bekannt sein muss.
In meinem Fall, sobald ich die Beschleunigung habe, wende ich das an, um die Geschwindigkeit durch zu aktualisieren
vx_new = vx + self.acc * math.cos(acc_angle)
vy_new = vy + self.acc * math.sin(acc_angle)
self.current_speed = math.sqrt( vx_new**2 + vy_new**2)
self.angle = math.atan2(vy_new,vx_new)
Ich überprüfe auch die neue Geschwindigkeit gegen eine spielerabhängige Höchstgeschwindigkeit und beschränke sie dabei. Bei einer Rakete, einem Auto oder etwas anderem mit einer maximalen Wendegeschwindigkeit (in Grad pro Tick) können Sie einfach den aktuellen Bewegungswinkel gegenüber dem berechneten Ideal betrachten. Wenn diese Änderung größer als zulässig ist, ändern Sie den Winkel einfach um as viel wie möglich in Richtung des Ideals.
Für jeden, der daran interessiert ist, habe ich die Entfernung zwischen Spieler und Ziel nach dem Timstep in Bezug auf die Ausgangsposition, die Geschwindigkeit, die Beschleunigungsrate und den Beschleunigungswinkel notiert und dann die Ableitung in Bezug auf den Beschleunigungswinkel vorgenommen. Wenn Sie diesen Wert auf Null setzen, wird das Minimum der Zielentfernung nach dem Zeitschritt als Funktion des Beschleunigungswinkels ermittelt. Genau das möchten wir wissen. Obwohl die Beschleunigungsrate ursprünglich in den Gleichungen enthalten war, hebt sie interessanterweise die Ermittlung der optimalen Richtung auf, unabhängig davon, wie viel Sie tatsächlich beschleunigen können.