Como calcular o rumo da curva para um míssil?


14

Eu tenho um míssil que é disparado de um navio em um ângulo, o míssil então vira em direção ao alvo em um arco com um raio de giro determinado. Como determino o ponto do arco quando preciso começar a girar para que o míssil esteja indo direto para o alvo?

EDITAR

O que preciso fazer antes de lançar os mísseis é calcular e traçar as rotas de vôo. Assim, no exemplo em anexo, o veículo de lançamento tem uma posição de 90 graus e os alvos estão por trás dela. Ambos os mísseis são lançados em uma posição relativa de -45 graus ou + 45 graus em relação à posição do veículo lançador. Os mísseis inicialmente se voltam para o alvo com um raio de viragem conhecido. Eu tenho que calcular o ponto em que a curva leva o míssil para a direção em que ele se volta para atacar diretamente o alvo. Obviamente, se o alvo estiver a 45 graus ou próximo a ele, então não haverá uma curva inicial, o míssil apenas irá direto para o alvo.

Após o lançamento do míssil, o mapa também mostrará o rastreamento de mísseis nesta linha como indicação de sua trajetória de voo.

O que estou fazendo é trabalhar em um simulador que imita o software operacional. Por isso, preciso traçar a trajetória de voo calculada antes de permitir o lançamento do míssil.

Dois mísseis destinados a dois alvos

Neste exemplo, os alvos estão atrás do veículo de lançamento, mas os caminhos pré-calculados são traçados.


1
O cabeçalho é pré-calculado ou muda durante a trajetória? (como um míssil homing?)
Jonathan Connell

1
Não seria apenas quando (x2-x1) ^ 2 + (y2-y1) ^ 2 = r ^ 2, onde (x1, y1) é a posição atual do míssil e (x2, y2) é o alvo?
The Duck Comunista

Talvez você deva desenhar o que deseja.
Aaaaaaaaaaa

3
Este é um problema de 2D ou 3D?
Steve H

Se você está procurando algo como um míssil, pode fazê-lo sem usar nenhuma trigonometria. Veja esta pergunta
BlueRaja - Danny Pflughoeft

Respostas:


9

Minha matemática pode estar um pouco errada, então eu wikied a resposta.

Suponho que você queira fazer o cenário de retorno contínuo - onde o míssil P1 viajando a uma velocidade V1 constantemente tenta se virar em direção ao jogador P2; mas a uma taxa de rotação limitada.

  1. Determine o vetor entre o jogador e o míssil.

    V2 = P2 - P1
  2. Transforme-os em vetores unitários.

    V3 = UNIT(V1)
    V4 = UNIT(V2)
  3. Determine o ângulo entre os vetores.

    a = ARCCOS(V3 * V4) (* indicating dot product)
  4. Limite o valor do ângulo entre eles (lembre-se de que suas funções trigonométricas provavelmente funcionam com radianos, portanto tente 0,1 como a taxa de rotação).

    a = SIGN(a) * MINIMUM(ABS(a), MaximumTurningRate)
  5. Crie o novo vetor de movimento.

    V1 = UNIT(V3.x + SIN(a), V4.y + COS(a)) * MissileSpeed

EDIT: Este não tem um 'ponto de partida', pois é mais robusto (e é uma implementação mais fácil) para o cenário de retorno contínuo. Você não precisa encontrar um ponto de partida para um círculo - basta limitar a taxa na qual o míssil pode mudar de direção e o resto acontece por causa do fantasma na máquina.


1
Mmm ... se a memória serve, acho que você precisa fazer um produto cruzado para obter a direção do ângulo. Se você acabou de criar um produto de ponto, você saberá a magnitude do ângulo, mas não a direção (como os produtos de ponto podem ter V3 * V4 = V4 * V3, parece que não há como notar a diferença de orientação). Então, faça o produto escalar e, em seguida, faça um produto cruzado - verificando o sinal da coordenada Z - para encontrar a orientação.
ChrisE

@ChrisE O exemplo está em 2D (olhando para 5.), portanto a orientação original e a magnitude do ângulo devem ser suficientes.
Keeblebrox

O cálculo do ângulo entre está correto, mas não tenho certeza de qual é a sua intenção declarada na etapa 5 OU o que ela produz. É a etapa 5, suponha que você adicione o ângulo a à v3 porque não entendo a matemática.
dlots

O @dlots step 5 deve adicionar o novo 'ângulo de rotação limitado' ao vetor de movimento atual - basicamente ele muda a direção do míssil.
Jonathan Dickinson

O que está SIGNna etapa 4?
Daniel Kaplan

2

Eu suponho que você queira mudar a direção, alterando o cabeçalho de lançamento para o alvo, e depois continue direto para o alvo (um problema mais divertido deve ser acertar o alvo ao virar!).

Devo assumir que você é capaz de girar com o mesmo raio de curva em todas as direções (é uma simplificação difícil de ver em mísseis reais).

A solução mais simples é usar o flexão de 90 ° : os arquivos de mísseis até sua trajetória formarem um ângulo reto com o alvo. se você girar exatamente no ponto de 90 °, errará o alvo exatamente pelo raio da curva, porque é necessário levar em consideração a própria curva. A solução é começar a girar exatamente os medidores com "raio de virada" (?) Antes de atingir o ponto de 90 ° e depois formar um arco de (tentar adivinhar) 90 ° para ir direto ao seu alvo.

Essa solução nem sempre é viável, por exemplo, quando você não tem visibilidade no caminho de 90 ° (edifícios ou outros obstáculos).

A boa notícia é que a solução funciona para todos os ângulos (e não apenas para os míticos 90 °). O truque é levar em consideração o espaço necessário para iniciar a rotação antes.

Quanto antes? É por isso que o material a 90 ° é a solução mais simples ...

Digamos que você alcance a visibilidade ou o melhor rumo do alvo quando o caminho de tiro formar um ângulo de θ °, então você deve antecipar a curva:

(sec(90° - θ°) + tan(90° - θ°)) * turning_radius

... onde secante é o recíproco do cosseno. A prova é trivial e é deixada ao leitor.

Sério, a fórmula vem de uma construção geométrica simples.

Gráfico de ponto de viragem

Linha preta é o caminho de tiro, enquanto a fina linha preta é o mesmo caminho movido em direção ao alvo, transformando unidades de raio; o mesmo para os vermelhos que são o caminho de destino.

Os segmentos verdes estão virando_radius de comprimento, então você deve ver que:

AB é a tangente de 90 ° - θ °

BC é o secante.

As duas linhas verdes que vêm do ponto de virada têm o raio de viragem de comprimento e são perpendiculares aos dois caminhos; significando que o raio de virada está correto e o arco é tangente aos dois caminhos (como deveria ser se você fizer uma curva sob restrições físicas).

Deixe-me saber se você encontrar algum erro.

EDITAR:

O desenho que você postou mostra que existem várias opções de caminho, mesmo com atirador e alvo fixos, como você pode ver aqui:

insira a descrição da imagem aqui

Depois que o alvo for escolhido, você poderá aplicar o que eu disse acima com os ângulos adequados.


Observe que este não é um sistema de atualização contínua. Como o homing requer mais CPU (muito), isso deve ser considerado a abordagem correta para alvos fixos ou se alguém deseja implementar um míssil "semi-burro", é claro. A trajetória pode ser simplesmente parametrizada sobre t dividindo o caminho em 3 subcaminhos e o arco pode ser aproximado por uma curva de Bezier.
FxIII 17/06/11

1

Eu implementaria um "comportamento de direção" para o míssil. O míssil possui: Uma velocidade (um número), uma posição (um vetor) e uma rotação (atual). A cada atualização do seu jogo / a cada quadro, a rotação do míssil é alterada um pouco (em direção ao alvo). Em seguida, o míssil é movido para frente de acordo com sua rotação atual e velocidade atual.

Funciona para 2D e 3D obviamente, já que a única diferença é uma dimensão adicional.

Outra possibilidade seria calcular o caminho do míssil antes de destruí-lo. Procure curvas bezier ou spline .


O problema com o uso de um spline aqui é que você precisaria atualizar continuamente os pontos de controle se o destino se mover. Um simples direcionamento aqui pode ser computacionalmente mais barato.
ChrisE

Na verdade, estou tentando pré-calcular o caminho para o alvo. O que estou trabalhando é um simulador para alguns equipamentos reais e estou tentando imitar o comportamento do equipamento real.
Tony

0

Sinto que você está resolvendo o problema errado aqui. Um míssil do mundo real não vai se preocupar com para onde se virar, simplesmente vai virar até apontar para o alvo. O único cálculo para onde envolvido é quando começar a trazer os controles de volta ao ponto morto, pois um míssil do mundo real não pode mudar instantaneamente sua taxa de turno. Esse cálculo levará apenas a velocidade do ar indicada como um valor de entrada e eu acho que seria pré-calculado.


2
Um míssil do mundo real, especialmente as armas posteriores, possuem sistemas de orientação inercial ou GPS ou ambos, para que sejam programados para ir a uma área de pesquisa e começar a procurar um alvo. Ai se um amigo estiver por perto. A programação deve permitir que você envie o míssil em um caminho que evite amistosos e outros obstáculos, como massas terrestres e espectadores inocentes.
Tony

0

Eu acho que o algoritmo mais simples seguiria apenas duas regras:

  1. Se o alvo atual estiver mais próximo do míssil do que o diâmetro de giro, continue em frente. Isso evita que o míssil orbite alvos próximos em vez de realmente atingi-los.

  2. Caso contrário, vire em direção ao alvo até que você esteja apontando para ele.

Para calcular o ponto em que a curva termina em 2D:

  1. No ponto em que você deseja iniciar o giro, o centro do círculo de giro está localizado em uma direção perpendicular ao rumo atual, a uma distância do raio de giro. Observe que existem dois desses pontos - você provavelmente quer o mais próximo do seu alvo. Calcule essa posição e chame-a de P.

  2. Agora você pode construir um triângulo retângulo com o ângulo reto na tangente e dois pontos conhecidos - P e seu destino. Isso permite calcular a distância da tangente ao seu ponto alvo com Pitágoras. Chame de D.

  3. Agora você precisa calcular a interseção de um círculo de raio D no seu destino com o seu círculo giratório. Você obterá duas soluções, que são os dois pontos tangentes naquele círculo em que o míssil parava de girar (um para cada direção de deslocamento ao redor do círculo). Escolha o ponto que está na frente do míssil - essa é a sua resposta.

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.