Imagine um "drone" e um ponto de destino em um avião 2D. Existem oito parâmetros:
P = my position
Q = target position
V = my velocity
I = my moment of inertia
w = my angular velocity
s = my angular position
T = max thrust
U = max torque
(diremos apenas que o alvo está parado)
O trabalho do drone é chegar ao alvo o mais rápido possível, obedecendo ao torque máximo e ao empuxo máximo. Existem apenas duas maneiras de aplicar o torque, uma vez que este é apenas em um plano 2D. O impulso é restrito a seguir apenas uma direção em relação à orientação da nave e não pode ser apontado sem a rotação do drone. Negligencie qualquer resistência, você pode apenas fingir que está flutuando no espaço 2d. Digamos que o drone verifique uma equação no intervalo de tempo t
(talvez algo como 0,01 segundos), conecte os parâmetros e ajuste seu torque e pressão de acordo. Quais devem ser as equações de empuxo e torque?
Respostas:
À luz do contexto da sua pergunta, http://nodewar.com/ , existem algumas considerações específicas para sua solução:
Esses métodos são os que eu decidi trabalhar para alcançar a aceleração desejada.
Aceleração, não velocidade
Como você já tem uma velocidade determinada e seu alvo está se movendo, não precisa ser empurrado em direção a um ponto. Você precisa se esforçar para mudar sua velocidade para o que deveria ser. Isso significa que sua nave precisa apontar não para onde está indo, mas na direção em que deve acelerar.
Dirigindo na direção certa
Você tem um vetor de aceleração, agora deseja aplicá-lo. Determine a distância que você precisa girar. Provavelmente usei mais etapas do que o necessário aqui, mas as coordenadas de rotação me confundem e, de qualquer maneira, acho que o valor de rotação de navio sem limite é um bug na API.
Uma fórmula simples. Não há mal em girar o tempo todo, portanto, não se preocupe em aplicar valores de torque parciais. Se você precisar de uma pequena correção na velocidade angular, faça essa determinação muitas vezes por segundo, de qualquer maneira.
Uma fórmula menos simples. Chegará um ponto em que você não deseja continuar girando, porque eventualmente quer parar. Felizmente, esse limite de velocidade angular significa que você pode diminuir rapidamente a velocidade angular máxima para zero. Você só precisa calcular quando fazer isso.
Depois de ajustar o código acima para atender às suas necessidades, seu navio deve girar rápida e precisamente para qualquer ângulo que você der ao alvo.
Velocidade de percussão
Então, quando empurrar? Novamente, a mudança rápida do alvo e outros fatores criam grande dificuldade na resolução de uma solução exata. Não tente.
Nos casos em que você precisa de impulso parcial, pode confiar novamente no fato de poder escolher entre 0 e 1 impulso várias vezes por segundo. Isso fornece um impulso parcial efetivo sem variar o valor real.
Boa sorte!
fonte
Uma pergunta semelhante, com algumas boas respostas, incluindo o nome aparente de todo esse assunto, "planejamento de movimento":
/programming/2560817/2d-trajectory-planning-of-a-spaceship-with-physics
Como programador, gosto da praticidade da sugestão de user470365. No entanto, vou tentar uma abordagem mais rigorosa. Minha sugestão aqui calcula um plano completo no início, mas suponho que você possa reavaliar quantas vezes desejar, se os parâmetros estiverem mudando.
O plano
Detalhes
Sugiro métodos iterativos para encontrar d e t :
Sem pressões, percorra a trajetória futura do drone usando um loop e um pequeno passo no tempo:
Agora encontramos d e t .
Girando
Quando digo "vire para d ", quero dizer realmente, "faça uma sequência de torques de tal forma que giremos para d o mais rápido possível, além de levar a velocidade angular a zero". Provavelmente existe uma equação para isso envolvendo a direção atual, a velocidade angular da corrente e a aceleração angular máxima, mas é complicado pelo comportamento de quebra dos ângulos.
fonte