Pregunta

Tengo un juego en el que estoy trabajando que tiene misiles guiados. En este momento, solo se vuelven hacia su objetivo, lo que produce un resultado bastante tonto, con todos los misiles siguiendo al objetivo alrededor.

Quiero crear un sabor más letal de misil que apuntará a donde el objetivo " " en el momento en que llegue y me estoy quedando un poco atascado y confundido sobre cómo hacerlo.

Supongo que tendré que averiguar dónde estará mi objetivo en algún momento en el futuro (una conjetura de todos modos), pero no puedo entender qué tan lejos debo ver. Debe basarse en la distancia que el misil está lejos del objetivo, pero el objetivo también se mueve.

Mis misiles tienen un empuje constante, combinado con una habilidad débil para girar. La esperanza es que sean rápidos y emocionantes, pero se dirijan como una vaca (es decir, mal, para los fanáticos que no son HitchHiker).

De todos modos, me pareció un tipo de problema divertido para el Desbordamiento de pila para ayudarme a resolver, por lo que cualquier idea o sugerencia mejor o "más divertido" todos los misiles serían recibidos con gratitud.

El siguiente será AI para esquivarlos ...

¿Fue útil?

Solución

Lo que estás sugiriendo se llama " Guía de comandos " pero hay una manera más fácil y mejor.

La forma en que generalmente lo hacen los misiles reales (no todos son iguales) es mediante un sistema llamado Navegación proporcional. Esto significa que el misil " gira " en la misma dirección que la línea de visión (LOS) entre el misil y el objetivo está girando, a una velocidad de giro " proporcional " a la tasa de LOS ... Esto hará lo que está solicitando, ya que cuando la tasa de LOS sea cero, está en curso de colisión.

Puedes calcular la tasa de LOS simplemente comparando las pendientes de la línea entre el misil y el objetivo de un segundo a otro. Si esa pendiente no está cambiando, estás en curso de colisión. si está cambiando, calcule el cambio y gire el misil en una velocidad angular proporcional ... puede usar cualquier métrica que represente la posición del misil y del objetivo.

Por ejemplo, si usa una constante de proporcionalidad de 2, y el LOS se está moviendo hacia la derecha a 2 grados por segundo, gire el misil a la derecha a 4 grados por segundo. LOS a la izquierda a 6 grados / seg, misil a la izquierda a 12 grados / seg ...

En 3-d el problema es idéntico, excepto que el " Cambio en la Velocidad de LOS " ;, (y la velocidad de giro del misil resultante) es en sí mismo un vector, es decir, no solo tiene una magnitud, sino una dirección (¿Doy vuelta al misil? izquierda, derecha o arriba o abajo o 30 grados por encima de la horizontal a la derecha, etc ... Imagínese, como un piloto de misiles, donde "establecería las alas" para aplicar el levantamiento ...

Misiles guiados por radar, que " saben " La tasa de cierre. ajuste la constante de proporcionalidad basada en el cierre (cuanto mayor sea el cierre, más rápido intentará girar el misil), de modo que el misil girará de manera más agresiva en escenarios de cierre alto (cuando el tiempo de vuelo sea menor) y menos agresivamente en cierre bajo (persigue la cola) cuando se necesita conservar energía. Otros misiles (como Sidewinders), que no conocen el cierre, utilizan un valor de proporcionalidad predeterminado y constante). FWIW, los vientos laterales AIM-9 de la era de Vietnam utilizaron una constante de proporcionalidad de 4.

Otros consejos

He usado este artículo de CodeProject antes, tiene algunas animaciones realmente agradables para explicar las matemáticas.

" Las matemáticas de apuntar y simular un misil: del cálculo a la fórmula quártica " ;: http://www.codeproject.com/KB/recipes/Missile_Guidance_System.aspx

(también, oculto en los comentarios al final de ese artículo hay una referencia a algunos códigos C ++ que cumplen la misma tarea de la wiki Unreal)

Echa un vistazo a OpenSteer . Tiene código para resolver problemas como este. Mire 'steerForSeek' o 'steerForPursuit'.

¿Ha considerado comentarios negativos sobre el cambio reciente de la relación sobre el cambio de tiempo?

Los detalles se dejan como ejercicio.

Las sugerencias son completamente serias: si el objetivo no maniobra, debería obtener una intercepción casi óptima. Y debería converger incluso si el objetivo se está esquivando activamente.

¿Necesitas más detalles?

Resolver en un espacio bidimensional para facilitar la notación. Tome \ vec {m} como la ubicación del misil y el vector \ vec {t} para ser la ubicación del objetivo. El rumbo actual en la dirección del movimiento en la última unidad de tiempo: \ vec {h} = \ bar {\ vec {m} _i - \ vec {m} _i-1}} . Sea r el vector normalizado entre el misil y el objetivo: \ vec {r} = \ bar {\ vec {t} - \ vec {m}} . La marcación es b = \ vec {r} \ dot \ vec {h} Calcule la marcación en cada marca de tiempo y el cambio de la misma, y ??cambie el rumbo para minimizar esa cantidad.

La matemática es más complicada en 3d debido a la necesidad de encontrar el plano de acción en cada paso, pero el proceso es el mismo.

Querrá interpolar la trayectoria tanto del objetivo como del misil en función del tiempo. Luego busque los tiempos en que las coordenadas de los objetos se encuentren dentro de algún error aceptable.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top