Como posso fatorar o momento no meu simulador espacial?

8

Estou tentando criar um mecanismo de física 2D simples agora e estou com alguns problemas para descobrir como incorporar o impulso ao movimento de uma nave espacial.

Se estou me movendo em uma determinada direção a uma certa velocidade, atualmente posso atualizar facilmente a posição da minha nave (Posição + = Direção * Velocidade). No entanto, se o navio girar e eu recalcular a direção (com base no novo ângulo que o navio está enfrentando) e acelerar nessa direção, como posso levar o momento em consideração para alterar a "linha" que o navio viaja? Atualmente, o navio muda de direção instantaneamente e continua na velocidade atual nessa nova direção quando pressiono o botão de pressão. Quero que seja um movimento de rotação mais gradual, para dar a impressão de que o próprio navio tem alguma massa.

Se já existe um bom post sobre este tópico, peço desculpas, mas nada apareceu nas minhas pesquisas. Deixe-me saber se mais alguma informação é necessária, mas espero que alguém possa me dizer com facilidade como posso lançar velocidade de massa * na atualização do loop do jogo.

Josh Petite
fonte
Se você está procurando mais como programar o movimento, pode querer assistir ao jogo gratuito Transcendence, outro jogo de tiro em 2D que usa isso. Talvez você possa olhar para os scripts ou perguntar aos desenvolvedores como eles fizeram isso.
Mastersteviekun

Respostas:

7

Parece que você tem Posição e Direção como vetores e Velocidade como escalar?

Nesse caso, apenas altere o Velocity para um vetor e faça algo assim:

Force = Direction * Power
Acceleration = Force / Mass
Velocity += Acceleration * ElapsedTime
Position += Velocity * ElapsedTime

A direção é um vetor de comprimento unitário que indica a direção do seu navio. Poder é a quantidade de impulso que você deseja adicionar (zero quando nenhuma aceleração é necessária) Tempo decorrido é o tempo entre o jogo e as chamadas de atualização para manter o movimento suave, mesmo quando a taxa de quadros está mudando

Se você quiser saber mais sobre isso, consulte Euler Integration

Mr Bell
fonte
11
Sim, e o próximo passo é modelar a Lei de Newtons F = m * a. Então, em vez de usar uma constante "Potência" para obter aceleração, você usa Aceleração = Força / massa. Portanto, quando você aplica o empuxo, aplica-o como um vetor de força. Isso permitirá que você aplique outras forças à sua nave espacial facilmente, adicionando todos os vetores de força e calculando a aceleração correspondente. Também significa que você pode jogar com Mass como uma variável separada.
TerryB
Terry está correto, eu esqueci de incorporar isso no meu post original.
Mr Bell
Obrigado Sr. Bell / Terry. Ambas as equações listadas acima me ajudaram a fazer isso programaticamente. Eu estava tendo muitos problemas para entender como isso funcionaria tentando usar carros alegóricos por todo o lugar. Depois de mudar tudo, exceto a massa, para vetores (graças ao leftium acima), finalmente consegui fazer as coisas funcionarem.
Josh Petite
8

Em vez de manipular a velocidade diretamente, adicione outra variável: aceleração , que gradualmente altera suavemente a velocidade :

Da física clássica ( leis do movimento de Newton ):

a =  F/m  // a Force will result in a smaller acceleration on objects with more mass
v += a    // acceleration is the rate of change in velocity
p += v    // velocity is the rate of change in position    

Onde:

a = acceleration, v = velocity, p = position
F = force, m = mass

(Nota m é o único valor escalar; F, a, ve ep são todos vetores 2D ou 3D)

Além disso, existem duas direções:

  1. A direção que o navio está enfrentando. A força dos motores é aplicada nesse vetor.
  2. A direção em que o navio está realmente se movendo (devido ao momento). Este é o vetor de velocidade v.

Respondi a uma pergunta relacionada no StackOverflow: matemática do movimento da nave espacial 2D . Há algum código de amostra nessa resposta.

Leftium
fonte
Observe que em uma simulação baseada em ticks, esse método fornecerá resultados incorretos. As fórmulas básicas estão corretas no mundo contínuo da física, mas você precisará fazer a integração numérica para obter resultados precisos. Mais detalhes aqui: gafferongames.com/game-physics/integration-basics
Tetrad
Finalmente consegui isso funcionando. Muito obrigado a todos. Demorou um tempo para descobrir como analisar esse evento de entrada juntamente com minha atualização (além de incorporar o uso do tempo).
Josh Petite