Predecir la posición del enemigo para que un objeto guíe a su objetivo

13

En mi juego 2D tengo torretas de IA que deberían ayudar al jugador disparando automáticamente hacia los enemigos. Me gustaría hacer que disparen de manera inteligente y lideren su objetivo en lugar de solo apuntar a la posición actual de un enemigo. Entonces, dado el vector de velocidad y posición (siempre constante) tanto del enemigo como del proyectil de la torreta, ¿cómo puedo encontrar un vector que represente la posición real que debe apuntar la torreta para que el proyectil cruce (y golpee) al enemigo?

¡Cualquier enlace a artículos que describan las matemáticas, algoritmos, etc. sería apreciado!

Críptico
fuente
Gracias por los enlaces! Sin embargo, creo que las soluciones son un poco difíciles de leer, tal vez pueda reunir una respuesta visual clara a esta pregunta utilizando los enlaces que proporcionó, para ayudar a cualquier otra persona que tenga el mismo problema.
Larolaro
@Larolaro He agregado una demostración gráfica a mi respuesta para que pueda entenderla un poco mejor.
jmacedo
Describo
jhocking

Respuestas:

3

No voy a darle una respuesta, estoy seguro de que es útil o incluso correcta, pero aquí va:
Después de jugar con Mathica un poco más (verifique el final de la respuesta para los cuadernos / cuadernos publicados), esta solución parece ser correcta, incluso aunque podría no ser la mejor en términos de eficiencia.

Escribí esto en matemática que corresponde a su problema. Básicamente, resuelve las ecuaciones / desigualdades para la variable OA, que es lo que necesitamos descubrir. El resultado nos dará las posibles soluciones que puede tener OA y las condiciones que deben verificarse para que cada solución sea válida:

Reduce[{BPx, BPy} + t*{BVx, BVy} == {OPx, OPy} + t*OV*{Cos[OA], Sin[OA]} && t != 0 && OV != 0, {OA}]
  • {BPx, BPy} es la posición actual de blue

  • {BVx, BVy} es el vector de velocidad del azul

  • {OPx, OPy} es la posición de viñeta naranja

  • OV es la norma del vector de velocidad de bala de naranja (velocidad total)

  • OA es el ángulo de bala naranja (ángulo del vector de velocidad)

  • t es el tiempo necesario para que la bala llegue al azul

Traté de poner t> 0 && OV> 0 en las condiciones, pero Mathica tomaría una eternidad, así que solo usé t! = 0 && OV! = 0. Entonces, las soluciones que voy a dar aquí solo funcionan cuando el azul no está exactamente misma posición que la naranja y cuando la bala de la naranja realmente se mueve (en lugar de quedarse quieto)

La salida es gigantesca: http://freetexthost.com/xzhhpr5e2w

Sin embargo, si extraemos las partes OA == _, obtenemos esto:

http://freetexthost.com/iyrhqoymfo

Esos son los valores que OA puede tener (cada uno requiere condiciones diferentes para ser válido).

Con un análisis más detallado de las soluciones que requieren que OV sea negativo, lo que no queremos, obtuve esto:

http://freetexthost.com/iy4wxepeb6

Estas son las posibles soluciones al problema, cada una de las cuales requiere condiciones diferentes para ser válidas. Para que cierto ángulo OA sea una solución válida, se deben cumplir las siguientes condiciones:

Reduce[{BPx, BPy} + t*{BVx, BVy} == {OPx, OPy} + t*OV*{Cos[OA], Sin[OA]} && t != 0 && OV != 0, {t}]

Salida:

(BVy - OV Sin[OA] != 0 && BPx == (BPy BVx + BVy OPx - BVx OPy - BPy OV Cos[OA] + OPy OV Cos[OA] - OPx OV Sin[OA])/(BVy - OV Sin[OA]) && t == (-BPy + OPy)/(BVy - OV Sin[OA]) &&  BPy OV - OPy OV != 0) || 
(BVy == OV Sin[OA] && BPy == OPy && BVx - OV Cos[OA] != 0 && t == (-BPx + OPx)/(BVx - OV Cos[OA]) && BPx OV - OPx OV != 0) || 
(BVy == OV Sin[OA] && BVx == OV Cos[OA] && BPy == OPy && BPx == OPx && OV t != 0)

Considere solo las soluciones donde eso verifica (no necesita verificar las partes t == _. Son las que le dan el tiempo necesario para que la bala llegue al vehículo si las otras condiciones son válidas. Tenga en cuenta que si t da como resultado un valor negativo, no puede considerar un OA dado como una solución válida, incluso si verifica las otras condiciones (esto se debe a que usamos t! = 0 en lugar de t> 0 en reducción).

También podría ser una buena idea preguntar en /math// acerca de esto.

Editar

Crecí un poco de interés por esta pregunta, así que creé un cuaderno comentado con una demostración gráfica de todo lo que expliqué. Descarguelo aqui:

http://www.2shared.com/file/pXhYyhN1/towerBullets.html
O aquí: http://www.2shared.com/file/W01g4sST/towerBullets.html

(esta es la versión publicada, y solo necesita el reproductor de Mathica, que es gratuito, para verla. Si no tiene Mathica, este es el camino a seguir)

Captura de pantalla:

jmacedo
fuente
Puedo proporcionar las condiciones y soluciones con el signo de multiplicación (*) para que le resulte más fácil portarlas a su lenguaje de programación (Entonces solo necesitaría reemplazar ArcTan [...], Sin [...], Cos [...], Sqrt [...] y eventualmente el signo de poder (^).
jmacedo
Ja, olvídate de esta solución. Ahora que esta pregunta se ha fusionado, los enlaces de la primera respuesta parecen contener mejores respuestas.
jmacedo