Evitando orbitar no comportamento de direção de perseguição

9

Eu tenho um míssil que persegue o comportamento para rastrear (e tentar impactar) seu alvo (estacionário).

Funciona bem desde que você não esteja atingindo o alvo quando lança o míssil. Se você estiver atirando, o míssil tende a orbitar seu alvo.

insira a descrição da imagem aqui

Corrigi isso acelerando tangencialmente o alvo primeiro , matando o componente tangencial da velocidade primeiro e depois alinhando-o para o alvo.

insira a descrição da imagem aqui

Então eu acelero em -vT até que vT seja quase 0. Então acelero na direção de vN.

Enquanto isso funciona, estou procurando uma solução mais elegante em que o míssil possa impactar o alvo sem matar explicitamente o componente tangencial primeiro.

bobobobo
fonte
Não acho que você possa obter uma resposta satisfatória sem explicar qual é o seu algoritmo de direção. Tenho certeza de que o problema está nas suas heurísticas.
21712 #
11
Na verdade, essa foi a resposta que eu usei
bobobobo
possível duplicata Como evitar entidades homing de orbitando seus alvos
Trevor Powell

Respostas:

5

Parece que o problema é que o míssil está simplesmente apontando para o alvo sem levar em consideração a velocidade atual. Atribua ao seu míssil um ângulo máximo pelo qual o impulso pode se desviar da linha de movimento.

Em cada iteração de orientação, você calcula sua velocidade perpendicular ao alvo. Descobrir o quanto ele deve inclinar o motor para zerar esse componente de sua velocidade e, em seguida, prender ao máximo para que ele possa inclinar o motor.

Durante a primeira parte do vôo, ele se moverá um pouco para a direita da linha reta na figura # 2, mas à medida que voa, o motor zera esse componente e acaba indo direto para o alvo.

Observe que, nesse cenário, haverá apenas um quadro no qual o mecanismo tem uma deflexão de algo diferente de zero ou máximo. Se você estivesse rastreando um alvo em movimento, poderia obter desvios menores a cada ciclo à medida que o alvo se movia.

Loren Pechtel
fonte
4

Pode não ser a solução elegante que você procura, mas descobri que, se eu desacelerar o míssil, se ele errar, à medida que se aproxima do alvo, ele efetivamente rastreia e vira mais rápido e pode atingir o alvo. Você pode aumentar a taxa de turno do míssil à medida que ele se aproxima, em vez de reduzir a velocidade, mas isso pode dar aos jogadores uma surpresa desagradável.

Isso pode não parecer tão bom, mas certamente impede que os mísseis orbitam e que o inimigo circule o míssil até que o combustível acabe.

Aqui está uma demonstração que eu montei da minha implementação (o terceiro ou quarto míssil demonstra isso, e novamente às 1:05): http://www.youtube.com/watch?v=9uiGMC_nH2w

Você também pode aumentar a precisão do míssil à medida que ele se aproxima do alvo (pois ele tem uma assinatura mais próxima da qual bloquear). Isso é mostrado no vídeo em cerca de um minuto. O círculo vermelho mostra o alvo real do míssil. Isso proporciona uma trajetória caótica de vôo quando a longa distância e, em seguida, se endireita quanto mais se aproxima.

Como eu disse, pode não ser a resposta que você está procurando, mas espero que ajude um pouco.

David K
fonte
É bem legal. Eu vou para a aceleração máxima, mas ter o míssil para baixo lento é um truque (e pode ser usado se você chamá-los de "mísseis truque"?)
bobobobo
4

Intuição

Aqui está uma maneira: vamos girar seu diagrama.

uma rotação da ilustração original do problema

Agora o foguete é uma bala de canhão !

Física

Possui uma aceleração fixa "para baixo", ou seja, perpendicular ao vetor, do local de disparo até o alvo. Eu desenhei acima como uma linha verde tracejada. Vamos chamar isso de horizonte de referência . (Observe que esse horizonte de referência é constante! O foguete foi disparado de uma posição fixa com uma posição fixa como alvo.)

Sabemos (da wikipedia ) de uma bala de canhão sem resistência aérea, que d = v^2 * sin(2 * theta) / g, onde

  • d é a distância horizontal percorrida (distância entre o local de tiro e o alvo)
  • v é a velocidade com que o projétil foi disparado
  • thetaé o ângulo em relação ao horizonte em que o projétil foi disparado ( vetor da direção do ângulo de fogo do horizonte de referência )

Reorganizando a equação para gg = v^2 * sin(2 * theta) / d.

A constante na equação da bala de canhão g, é a aceleração devido à gravidade . Podemos entender isso como aceleração devido à propulsão de foguetes . Tudo bem também - ainda é uma aceleração constante em uma direção constante .

O que agora?

Execute essa equação para gquando você disparar o foguete. Ele lhe dirá quanto acelerar o foguete perpendicularmente em direção ao horizonte de referência, a fim de atingir o alvo. Como a direção dessa aceleração é constante, uma órbita não se forma.

Estrondo.

Anko
fonte
Esta é uma abordagem elegante. Eu acho que isso fará o foguete traçar um círculo , você está fornecendo a força centrípeta necessária para orbitar um círculo que afeta o alvo. Eu acredito que este pode ter sido a abordagem utilizada para conchas vermelhas em Mario Kart , porque eu sempre pensei que eles tendem a arco circular
bobobobo
A força aplicada aqui não é centrípeta. A direção da força é perpendicular ao horizonte de referência, que não muda se o alvo estiver parado. Isso significa que o comportamento em órbita não pode acontecer.
Anko
Eu editei a resposta para deixar isso mais claro.
Ank15
@ Anko: Não tenho certeza de que sua matemática aqui funcione para um alvo em movimento, como parece ser o gatilho para o caso dos OPs.
Mooing Duck
@Mooing Você está certo, isso só funcionaria para mover alvos se eles estiverem se movendo de maneira previsível e você atingir a previsão. A questão não menciona especificamente o alvo é, porém, estacionário, na primeira frase.
Anko