Ich versuche, die einfachste Form der proportionalen Navigation zu implementieren , dh die Rakete dreht sich in die Richtung, in die sich ihre Peilung zum Ziel ändert, und sobald sich ihre Peilung zum Ziel nicht mehr ändert, befindet sie sich auf einem Abfangkurs.
Ich habe also eine 2D-Rakete, die sich mit einer konstanten Geschwindigkeit in die Richtung bewegt, in die sie zeigt, die sich mit einer konstanten Geschwindigkeit drehen kann, und in jedem Intervall aktualisiere ich die Rakete mit etwas wie:
Position += VectorProduct (Direction * Speed * TimePassed)
PreviousTargetBearing = TargetBearing
TargetBearing = AngleBetween(TargetPosition, Position)
TargetBearingDelta = TargetBearing - PreviousTargetBearing
If TargetBearingDelta > 0: MissileDirection += TurnRate * TimePassed
If TargetBearingDelta < 0: MissileDirection -= TurnRate * TimePassed
Das Problem ist, dass die Rakete immer um ihre Startrichtung schwingt, denn sobald sich die Rakete das erste Mal dreht, kehrt dies das Vorzeichen von TargetBearingDelta um und dreht sich dann in die entgegengesetzte Richtung und so weiter ...
Wie kann ich dieses Problem am einfachsten lösen? Ich bin sicher, ich vermisse etwas Einfaches.
Verwandte StackOverflow-Frage: Wie erstelle ich eine "Intercept Missile" für ein Spiel?
Um es noch einmal zu wiederholen, ich bin speziell an der Implementierung des proportionalen Navigationsalgorithmus interessiert , nicht an Referenzierungsalgorithmen im Allgemeinen.
Update: Ich denke, die offensichtliche Antwort ist, nicht in jeder Umdrehung die Peilung zu überprüfen und den Kurs anzupassen, sondern zwischen den beiden zu wechseln. Ich werde das versuchen.
Wie Nailer sagt, können Sie die Bewegungsänderung auf irgendeine Weise begrenzen.
Schauen Sie sich PID an , eine gute Möglichkeit, die Dinge schnell auf einen bestimmten „Wert“ zu bringen, aber ohne sie zu überschreiten, gibt es Ihnen möglicherweise einige Ideen.
Sie können sich auch diese Frage ansehen . Ein bisschen weiter unten finden Sie eine Erklärung der 'Hundekurve', einem sehr genauen Referenzierungsalgorithmus, der von Hunden verwendet wird.
quelle
Meiner Meinung nach würde es eine andere Methode geben, die zwei Vektoren umfasst, einen für die Richtung, in die eine Rakete treffen soll, und einen anderen für sich selbst (oder sagen wir, dass sie ihre Richtung ändert, um mit dem ersten Vektor übereinzustimmen).
Auf diese Weise können wir eine Verzögerungszeit erzeugen, die es einem Flugkörper ermöglicht, seine Richtung entsprechend einer Änderung in einem ersten Vektor reibungslos zu ändern. Ich glaube, es wird das Problem im "Zeichen" der mathematischen Operation beseitigen.
PS. Der Hauptpunkt ist, dass wir den eigenen Vektor einer Rakete in Bezug auf eine kleine Zeitverzögerung in einen Richtungsvektor (zu treffen) umwandeln.
quelle
Die proportionale Navigation ist in Spielen einfach zu implementieren.
Ein Beispiel für die Implementierung im Spiel ist:
Erforderliche Beschleunigung = LOS * LOS_Rate * NC + APN_bias
LOS = Vector3 (TargetPosition) - Vector3 (MissilePosition)
NC = Navigationskonstantenmultiplikator (abhängig vom Bildratenlauf)
APN_bias = LOS_Rate / delta_T * (NC / 2)
LOS_Rate = LOS-Rotationsrate ist die Winkeländerungsrate der Sichtlinie zwischen Rakete und Ziel. Dies wird gemessen, indem sowohl die Raketen- als auch die Zielvektorpositionen in jedem Frame bei delta_T aufgezeichnet und jeweils subtrahiert werden, um die Differenz zu erhalten. Delta_T ist die Zeitreferenz (dh die Bildrate), mit der Ihre Zielsuchrakete im Spiel läuft.
Um LOS_Rate zu erhalten, lassen Sie einfach Ihre Raketenführungsschleife an jedem Frame (delta_T) Folgendes tun:
Weitere Informationen darüber, wie wir PN für World in Conflict implementiert haben, finden Sie unter den folgenden URLs. Ich hoffe, Sie finden diese hilfreich.
http://www.moddb.com/mods/wicmw/features/flint-lead-pursuit-guidance-principles
http://download.wicmwmod.com/Fun_Mod/presentations/FLINT%20Jul%202012.pdf
-blahdy
quelle
Kannst du die Turn Rate nicht einfach so begrenzen, dass sie niemals in einem Frame an TargetBearing vorbeizieht?
Wenn eine Drehung die Rakete an ihrer Zielpeilung vorbeiziehen lassen würde, setzen Sie einfach die neue Peilung gleich der Zielpeilung.
Ist das sinnvoll?
quelle