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!
Respuestas:
Esta pregunta en GameDev y esta pregunta en StackOverflow deberían proporcionarle la respuesta que está buscando. :)
fuente
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:
{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:
Salida:
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:
fuente