Estou tentando implementar a forma mais simples possível de navegação proporcional , ou seja, o míssil gira na direção em que seu rumo ao alvo está mudando e, uma vez que o rumo ao alvo é imutável, ele está em um curso de interceptação.
Então, eu tenho um míssil 2D movendo-se a uma velocidade constante na direção em que está voltado, o que pode girar a uma taxa constante, e a cada intervalo eu atualizo o míssil com algo como:
Position += VectorProduct (Direction * Speed * TimePassed)
PreviousTargetBearing = TargetBearing
TargetBearing = AngleBetween(TargetPosition, Position)
TargetBearingDelta = TargetBearing - PreviousTargetBearing
If TargetBearingDelta > 0: MissileDirection += TurnRate * TimePassed
If TargetBearingDelta < 0: MissileDirection -= TurnRate * TimePassed
O problema é que o míssil sempre oscila em sua direção de lançamento, porque assim que o míssil gira pela primeira vez, isso reverte o sinal de TargetBearingDelta, fazendo com que ele gire na direção oposta e assim por diante ...
Qual é a maneira mais simples de resolver esse problema? Tenho certeza de que estou perdendo algo simples.
Pergunta relacionada ao StackOverflow: Como criar um "míssil de interceptação" para um jogo?
Para reiterar, estou interessado especificamente na implementação do algoritmo de navegação proporcional , não nos algoritmos de retorno em geral.
Atualização: Eu acho que a resposta óbvia é não verificar o rumo e ajustar o rumo a cada turno, mas alternar entre os dois. Eu vou tentar isso.
Como diz Nailer, você pode limitar a mudança de movimento de alguma maneira.
Confira o PID , uma ótima maneira de fazer as coisas mudarem rapidamente para um certo "valor", mas sem superá-lo, isso pode lhe dar algumas idéias.
Você também pode verificar esta pergunta , um pouco abaixo é uma explicação da "curva do cão", um algoritmo de retorno muito preciso usado pelos cães.
fonte
Na minha opinião, haveria outro método envolvendo dois vetores, um para a direção de um míssil, e outro para ele mesmo ler (ou dizer, mudar sua direção para corresponder ao primeiro vetor).
Dessa forma, podemos produzir um tempo de latência, permitindo que um míssil mude sua direção suavemente de acordo com uma mudança no primeiro vetor. Eu acredito que ele removerá o problema no "sinal" da operação matemática.
PS. O ponto principal é que transferimos o vetor de um míssil para um vetor direcional (a ser atingido) em relação a algum pequeno atraso no tempo.
fonte
A navegação proporcional é simples de implementar nos jogos.
Um exemplo de implementação no jogo é:
Aceleração necessária = LOS * LOS_Rate * NC + APN_bias
LOS = Vetor3 (TargetPosition) - Vetor3 (MissilePosition)
NC = Multiplicador constante de navegação (dependendo da taxa de quadros em execução)
APN_bias = LOS_Rate / delta_T * (NC / 2)
LOS_Rate = LOS Rotation Rate é a taxa angular de mudança na linha de visão entre o míssil e o alvo. Isso é medido registrando o míssil e o vetor alvo, posicionando todos os quadros em delta_T e subtraindo cada um para obter a diferença. Delta_T é a referência de tempo (ou seja, taxa de quadros) na qual seu míssil está em execução no jogo.
Para obter o LOS_Rate, basta fazer com que seu loop de orientação de mísseis faça o seguinte em cada quadro (delta_T):
Você pode encontrar mais informações sobre como implementamos o PN para o jogo World in Conflict nos seguintes URLs abaixo. Espero que você ache isso útil.
http://www.moddb.com/mods/wicmw/features/flint-lead-pursuit-guidance-principles
http://download.wicmwmod.com/Fun_Mod/presentations/FLINT%20Jul%202012.pdf
-blahdy
fonte
Você não pode limitar a taxa de turno para que ela nunca ultrapasse o TargetBearing em um quadro?
Se um turno fizer o míssil girar além do alvo, basta definir o novo rumo igual ao rumo do alvo.
Isso faz sentido?
fonte