¿Cómo calcular el ángulo de disparo y la velocidad para alcanzar un objetivo en movimiento?


11

Estoy desarrollando un juego de Android 2D y estoy haciendo un algoritmo de puntería para que los proyectiles de IA golpeen a los enemigos, ya sea siguiendo un camino o moviéndose libremente. Por el momento, solo calcula dónde estará el objetivo después de una distancia y dispara un proyectil para alcanzarlo a esa distancia. Por supuesto, esto significa variar la velocidad del proyectil para alcanzar el objetivo.

¿Alguien tiene alguna sugerencia para un algoritmo simple-ish (óptimo-ish) para calcular cuándo el proyectil necesita disparar y dónde debe apuntar si solo puede viajar a una velocidad constante? ¿Digamos que el proyectil va dos veces la velocidad del objetivo?

La única forma en que puedo pensar es en buscar y parece bastante grande.



@JohnMcDonald: no muy relacionado dado que se trata de proyectiles parabólicos, no lineales. Esto está mucho más cerca: gamedev.stackexchange.com/questions/4995/…
e100

Respuestas:


13

En un juego de torre de defensa que hice, utilicé una ecuación cuadrática para predecir la intersección y, por lo tanto, apuntar. El siguiente fragmento de código de puntería asume que el enemigo está viajando a una velocidad y dirección constantes. También supone que el proyectil viajará a una velocidad constante conocida (podría ser cualquier velocidad pero debe ser conocida por el algoritmo).

Vector totarget =  target.position - tower.position;

float a = Vector.Dot(target.velocity, target.velocity) - (bullet.velocity * bullet.velocity);
float b = 2 * Vector.Dot(target.velocity, totarget);
float c = Vector.Dot(totarget, totarget);

float p = -b / (2 * a);
float q = (float)Math.Sqrt((b * b) - 4 * a * c) / (2 * a);

float t1 = p - q;
float t2 = p + q;
float t;

if (t1 > t2 && t2 > 0)
{
    t = t2;
}
else
{
    t = t1;
}

Vector aimSpot = target.position + target.velocity * t;
Vector bulletPath = aimSpot - tower.position;
float timeToImpact = bulletPath.Length() / bullet.speed;//speed must be in units per second

Como también determina el tiempo de impacto, simplemente esperé hasta que pasó el tiempo para llamar a los gráficos de impacto en la posición del objetivo en ese momento ... sin necesidad de ninguna detección de colisión para determinar los golpes.


"no hay necesidad de ninguna detección de colisión para determinar los golpes". - Si los objetivos están limitados a mantener su velocidad y dirección. --- Sin embargo, si tienen una IA activa, o peor, son el jugador y pueden moverse después de que el tirador ha disparado, entonces basar tus golpes en el tiempo en lugar de la detección de colisión conducirá a lo que tu base de jugadores percibirá como algunos errores / problemas técnicos desagradables.
XenoRo

@TheLima sí, tal como dice en la segunda oración de la respuesta. ;-)
Steve H

Esto es casi perfecto para mi escenario, pero ¿cómo considerarías estas 2 variables adicionales: aceleración para el proyectil, el movimiento de la torre en sí?
Jack

¿Qué aes 0? Esto producirá una división por cero excepción, pero ¿qué significa esto en términos de la variable t? ¿Debería considerarse "un número muy grande" o cuál sería el mejor caso?
firelynx

¿Hay un buen libro que entra en la intuición detrás de esto? Tengo curiosidad por saber cómo buscar estas matemáticas ...
davidkomer

4

ingrese la descripción de la imagen aquí

La IA, la ubicación del objetivo durante el tiempo en que se dispara el proyectil, y la ubicación final del objetivo en el punto de la muerte forman un triángulo. Esto es lo que ya debe saber:

  1. Longitud lateral a, que es la velocidad del proyectil
  2. Longitud lateral b, que es la velocidad objetivo
  3. El ángulo de movimiento del objetivo del movimiento del objetivo.

Tienes tres partes del triángulo, un caso SSA, así que resuélvelo así

  1. Encuentre el ángulo B en función del ángulo de movimiento y la ubicación de la IA
  2. Usa la ley de los senos para encontrar el ángulo A

El ángulo A debería permitirle determinar el ángulo en el que se debe lanzar el proyectil.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.