Como calcular o ângulo e a velocidade do tiro para atingir um alvo em movimento?

11

Estou desenvolvendo um jogo 2D para Android e estou criando um algoritmo de mira para projéteis de IA atingirem inimigos seguindo um caminho ou movendo-se livremente. No momento, apenas calcula onde o alvo estará depois de uma distância e dispara um projétil para encontrá-lo a essa distância. Claro que isso significa variar a velocidade do projétil para atingir a meta.

Alguém tem alguma dica para um algoritmo de ish simples (ideal-ish) para calcular quando o projétil precisa disparar e para onde precisa apontar se ele puder viajar apenas a uma velocidade constante? Digamos que o projétil atinja o dobro da velocidade do alvo?

A única maneira que consigo pensar envolve pesquisar e parece bastante grande.

Guen
fonte
Relacionados: gamedev.stackexchange.com/questions/17467/...
John McDonald
@ JohnMcDonald: não muito relacionado, dado que se trata de projéteis parabólicos, não lineares. Isso é muito mais próximo: gamedev.stackexchange.com/questions/4995/…
2/12

Respostas:

13

Em um jogo de defesa que fiz, usei uma equação quadrática para prever a interseção e, assim, apontar o ponto. O seguinte trecho de código de mira assume que o inimigo está viajando a uma velocidade e direção constantes. Também pressupõe que o projétil viajará a uma velocidade constante conhecida (pode ser qualquer velocidade, mas deve ser conhecida pelo 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 também determina o tempo do impacto, simplesmente esperei até o tempo passado para chamar os gráficos de impacto na posição do alvo naquele momento ... não há necessidade de detecção de colisão para determinar os acertos.

Steve H
fonte
"não há necessidade de detecção de colisão para determinar ocorrências." - Se o (s) alvo (s) estiver (m) restrito (s) a manter sua velocidade e direção. --- Se, no entanto, eles tiverem uma IA ativa, ou pior, for o jogador e puderem se mover após o atirador disparar, basear seus ataques no tempo e não na detecção de colisão levará ao que a sua base de jogadores perceberá como alguns erros / falhas desagradáveis.
XenoRo
@ TheLima, sim, como diz a segunda frase da resposta. ;-)
Steve H
Isso é quase perfeito para o meu cenário, mas como você consideraria essas 2 variáveis ​​adicionais: aceleração para o projétil, o movimento da própria torre?
Jack
O que aé 0? Isso produzirá uma divisão por exceção zero, mas o que isso significa em termos da variável t? deveria ser considerado 'um número muito grande' ou qual seria o melhor caso?
firelynx
Existe um bom livro que entra na intuição por trás disso? Estou curioso para saber como você sabia que procurar essa matemática ...
davidkomer
4

insira a descrição da imagem aqui

A IA, a localização do alvo durante o tempo em que o projétil é disparado, e a eventual localização do alvo no ponto da morte formam um triângulo. Aqui está o que você já deve saber:

  1. Comprimento lateral a, que é a velocidade do projétil
  2. Comprimento lateral b, que é a velocidade alvo
  3. O ângulo de movimento do alvo de movimento do alvo.

Você tem três partes do triângulo, um caso SSA, então resolva-o assim

  1. Encontre o ângulo B com base no ângulo do movimento e na localização da IA
  2. Use a lei dos senos para encontrar o ângulo A

O ângulo A deve permitir determinar o ângulo em que o projétil deve ser lançado.

tyjkenn
fonte