Estoy tratando de implementar la forma más simple posible de navegación proporcional , es decir, el misil gira en la dirección en que cambia su rumbo hacia el objetivo, y una vez que su rumbo hacia el objetivo no cambia, está en curso de intercepción.
Entonces, tengo un misil 2d moviéndose a una velocidad constante en la dirección que está mirando, que puede girar a una velocidad constante, y cada intervalo actualizo el misil con algo como:
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
El problema es que el misil siempre oscila alrededor de su dirección de lanzamiento, porque tan pronto como el misil gira por primera vez, esto invierte el signo de TargetBearingDelta, haciéndolo girar en la dirección opuesta, y así sucesivamente ...
¿Cuál es la forma más simple de resolver este problema? Estoy seguro de que me falta algo simple.
Pregunta relacionada de StackOverflow: ¿Cómo crear un "misil de intercepción" para un juego?
Para reiterar, estoy interesado específicamente en implementar el algoritmo de navegación proporcional , no en los algoritmos de referencia en general.
Actualización: supongo que la respuesta obvia es no verificar el rumbo y ajustar el rumbo cada turno, sino alternar entre los dos. Lo intentaré
Como dice Nailer, puedes limitar el cambio de movimiento de alguna manera.
Echa un vistazo a PID , una buena manera de hacer que las cosas se muevan rápidamente a un cierto "valor", pero sin excederlo, podría darte algunas ideas.
También puede consultar esta pregunta , un poco abajo es una explicación de la "curva del perro", un algoritmo de referencia muy preciso utilizado por los perros.
fuente
En mi opinión, habría otro método que involucrara dos vectores, uno para la dirección para que un misil golpee, y otro para él mismo (o digamos que la transición de su dirección coincida con el primer vector).
De esta manera, podemos producir un tiempo de retraso que permita que un misil cambie suavemente su dirección de acuerdo con un cambio en un primer vector. Creo que eliminará el problema en el "signo" de la operación matemática.
PD. El punto principal es que derivamos el propio vector de un misil a un vector direccional (para golpear) con respecto a un pequeño retraso en el tiempo.
fuente
La navegación proporcional es fácil de implementar en los juegos.
Un ejemplo de implementación en el juego es:
Aceleración requerida = LOS * LOS_Rate * NC + APN_bias
LOS = Vector3 (TargetPosition) - Vector3 (MissilePosition)
NC = multiplicador constante de navegación (dependiendo de la velocidad de fotogramas)
APN_bias = LOS_Rate / delta_T * (NC / 2)
LOS_Rate = LOS Rotation Rate es la tasa angular de cambio en la línea de visión entre el misil y el objetivo. Esto se mide registrando el misil y el vector objetivo posiciona cada cuadro en delta_T, y restando cada uno para obtener la diferencia. Delta_T es la referencia de tiempo (es decir, la velocidad de fotogramas) a la que se ejecuta su misil de referencia en el juego.
Para obtener LOS_Rate, simplemente haga que su bucle de guía de misiles haga lo siguiente en cada cuadro (delta_T):
Puede encontrar más información sobre cómo implementamos PN para el juego World in Conflict en las siguientes URL a continuación. Espero que encuentres estos útiles.
http://www.moddb.com/mods/wicmw/features/flint-lead-pursuit-guidance-principles
http://download.wicmwmod.com/Fun_Mod/presentations/FLINT%20Jul%202012.pdf
-blahdy
fuente
¿No puedes limitar la velocidad de giro para que nunca pueda pasar TargetBearing en un cuadro?
Si un giro hace que el misil gire más allá de su rumbo objetivo, simplemente establece el nuevo rumbo igual al rumbo objetivo.
¿Tiene sentido?
fuente