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.



@ 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.


"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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.