Como criar um “míssil de interceptação” para um jogo?
-
05-07-2019 - |
Pergunta
Eu tenho um jogo que eu estou trabalhando em que mísseis teleguiados na mesma. No momento, eles simplesmente virar-se para o seu alvo, o que produz um resultado olhando um pouco mudo, com todos os mísseis seguir o alvo ao redor.
Eu quero criar um sabor mais mortal de míssil que visará a onde o alvo "será" no momento em que ele fica lá e eu estou ficando um pouco preso e confuso sobre como fazê-lo.
Eu estou supondo que vai precisar de trabalhar para fora onde o meu objectivo será em algum momento no futuro (um palpite de qualquer maneira), mas eu não posso colocar minha cabeça em torno de como muito à frente para olhar. Ele precisa ser baseada em quão longe o míssil está longe do alvo, mas o alvo é também movimento.
As minhas mísseis têm um impulso constante, combinado com uma fraca capacidade de transformar. A esperança é que eles vão ser rápido e emocionante, mas boi como uma vaca (ou seja, mal, para os fãs não carona lá fora).
De qualquer forma, parecia um tipo de problema divertido para Stack Overflow para me ajudar a resolver, por isso quaisquer ideias ou sugestões sobre melhores mísseis ou "mais divertido" todos seriam recebidas com gratidão.
Em seguida será AI para esquivando-los ...
Solução
O que você está sugerindo é chamado de "Orientação de Comando", mas há uma maneira mais fácil e melhor.
A maneira que os mísseis reais geralmente fazê-lo (Nem todos são iguais) está usando um sistema chamado proporcional navegação. Isto significa que os mísseis "voltas" no mesmo sentido que o line-of-sight (LOS) entre o míssil e o alvo está se transformando, a uma taxa de turn "proporcional" à taxa LOS ... Isso vai fazer o que você é pedindo como quando a taxa LOS é zero, você está em rota de colisão.
Você pode calcular a taxa LOS por apenas comparando as encostas da linha entre misile e alvo de um segundo para o outro. Se essa inclinação não está mudando, você está em rota de colisão. se ele está mudando, calcule a mudança e transformar o míssil por uma taxa angular proporcional ... você pode usar qualquer métricas que representam posição de mísseis e de destino.
Por exemplo, se você usar uma constante de proporcionalidade de 2, eo LOS está se movendo para a direita a 2 graus / seg, gire o míssil para o direito a 4 graus / seg. LOS à esquerda na 6 graus / seg, de mísseis para a esquerda em 12 graus / seg ...
Em 3-d problema é idêntico, exceto a "Mudança em LOS Rate", (e taxa de turn míssil resultante) é em si um vetor, ou seja, tem não só uma magnitude, mas uma direção (Do I virar a esquerda míssil , direita ou para cima ou para baixo ou 30 graus acima da horizontal para a direita, etc ?? ... imagine que, como piloto de mísseis, onde você vai "definir as asas" para aplicar o elevador ...
Radar mísseis guiados, que "conhece" a taxa de fechamento. ajustar a constante de proporcionalidade com base no fechamento (quanto maior o fechamento mais rápido as tentativas de mísseis para ligar), para que o míssil vai virar mais agressivamente em cenários de alta de fechamento, (quando o tempo de voo é menor), e menos agressiva em baixa fechamento (perseguições da cauda) quando ele precisa para conservar energia. Outros mísseis (como Sidewinders), que não sabem o fechamento, use um valor constante de proporcionalidade pré-determinado). FWIW, era do Vietnã AIM-9 Sidewinder usou uma constante de proporcionalidade, de 4.
Outras dicas
Eu usei este artigo CodeProject antes -. Ele tem alguns realmente agradáveis ??animações para explicar a matemática
"A Matemática do Segmentação e Simulação de Mísseis: De Cálculo à Fórmula Quartic": http://www.codeproject.com/KB/recipes/Missile_Guidance_System.aspx
(também, escondido nos comentários na parte inferior do mesmo artigo é uma referência a algum código C ++ que realiza a mesma tarefa do wiki Unreal)
Dê uma olhada OpenSteer . Tem código para resolver problemas como este. Olhada 'steerForSeek' ou 'steerForPursuit'.
Você já considerou feedback negativo sobre a recente mudança de rolamento sobre a mudança de tempo?
Detalhes deixado como um exercício.
As sugestões é completamente sério: se o alvo não manobrar este deve obter uma quase ideal de interceptação. E deve convergir mesmo se o alvo está esquivando-se ativamente.
Precisa de mais detalhes?
Resolver em um espaço bidimensional para a facilidade de notação. Tome \vec{m}
para ser o local do míssil e vector \vec{t}
Para ser a localização do alvo.
O título corrente no sentido de movimento ao longo da última unidade de tempo: \vec{h} = \bar{\vec{m}_i - \vec{m}_i-1}}
. Seja r o vector normlized entre o míssil e o alvo: \vec{r} = \bar{\vec{t} - \vec{m}}
. O rolamento é b = \vec{r} \dot \vec{h}
Calcular o rolamento em cada instante de tempo, e a mudança dos mesmos, e mudança de proa para minimizar essa quantidade.
A matemática é Harrier em 3d por causa da necessidade de encontrar o plano de ação em cada etapa, mas o processo é o mesmo.
Você vai querer interpolar a trajetória de ambos o alvo eo míssil como uma função do tempo. Em seguida, olhar para os tempos em que as coordenadas dos objetos estão dentro de algum erro aceitável.