Como calcular a velocidade de queda e aceleração?

9

Estou pensando em fazer um jogo de pouso, onde você controla uma nave espacial e precisa pousá-la sem bater. Qual é uma fórmula simples para calcular a velocidade de queda ou aceleração em relação ao tempo de trabalho em relação aos motores do tempo?

Dvole
fonte

Respostas:

28

A maneira mais simples é a integração do Euler. Você deve armazenar o vetor de posição e o vetor de velocidade. Em cada quadro:

  • medir o tempo decorrido desde a última etapa de integração: dt
  • calcule o vecor de força devido aos seus motores: F
  • calcule o vetor de aceleração: A = F / m onde m é a massa da nave espacial.
  • adicione o vetor de gravidade: A = A + G, certifique-se de que G aponte para o centro do planeta
  • atualizar o vetor de velocidade V = V + A · dt
  • atualizar o vetor de posição X = X + V · dt

( x para escalares, X para vetores)

tenha certeza que dt é pequeno ...

| G | é de cerca de 9,8 m / s² para a Terra e cerca de 1,6 m / s² para a Lua

em geral, a força de atracção devida à interação gravital é:

Lei de Newton da gravitação universal

Afeta cada corpo e aponta para o outro.

O escalar G é a constante gravitacional muito famosa , é cerca de 6,67e-011 N (m / Kg) ²

Como você está interessado em aceleração:

Aceleração

Você só precisa conhecer a massa (m2) e o raio (r) do planeta para calcular sua aceleração.

Normalmente, a aceleração que move o planeta em direção à sua nave espacial é insignificante, porque geralmente m1 é insignificante em comparação com m2.

No entanto, se você estiver tentando pousar em um pequeno asteróide, provavelmente precisará usar a fórmula geral que adiciona essa força ao vetor de força total na segunda etapa.

EDITAR:

Conforme necessário, algumas dicas sobre a implementação. Você precisará de:

  • Uma biblioteca de vetores
  • Modelo de motor
  • Modelo de Física
  • Detecção de colisão
  • Interface do usuário (entrada e renderização gráfica)

Em primeiro lugar, a biblioteca de vetores: seu jogo pode ser mono / bi / árvore / quatro ... dimensionais, na medida em que você considera seu caso uma projeção de uma palavra 3D, os roules físicos são válidos.

Se n for a dimensão que você escolher (provavelmente 2 ou 3 no seu caso), a biblioteca deverá ter:

  • uma entidade de armazenamento vetorial (uma lista de n números de ponto flutuante para cada vetor)
  • um operador de soma (soma de componente por componente)
  • um operador de multiplicação escalar (cada componente multiplicado por um flutuador)
  • uma multiplicação de pontos entre vetores (multiplicar componente por componente e resumir tudo)
  • o comprimento do vetor (raiz quadrada de um vetor que é multiplicado por pontos)

Você pode usar uma biblioteca que faz isso ou implementar uma sozinha; um vetor pode ser uma estrutura ou uma classe, a escolha é sua.

Cada mecanismo deve ser descrito por:

  • um vetor indicando sua força e direção de empuxo
  • um escalar que indica o uso de combustível por segundo quando em potência máxima;

sua entrada do usuário será usada para fornecer a cada mecanismo um número que estará entre 0 (mecanismo não utilizado) e 1 (potência total): o fator do motor (uso).

Multiplique o fator de mecanismo para seu vetor de impulso para obter a confiança real do mecanismo e resumir todos os resultados de todos os mecanismos disponíveis; isso lhe dará o F do segundo passo.

O fator do seu motor pode ser usado para conhecer o uso real de combustível de cada motor: multiplique o fator do motor pelo uso de combustível e por dt para saber o uso instantâneo de combustível; você pode subtrair esse valor da variável capacidade total de combustível (isso oferece a oportunidade de atualizar sua massa total m, se a massa de combustível for considerável).

Agora você pode continuar usando a integração para calcular a nova posição, verifique a colisão com a superfície do seu planeta; se houver, use o comprimento do vetor de velocidade para dizer se o pouso foi um sucesso ou um desastre.

Obviamente, outras verificações de colisão podem / devem ser feitas, algumas entidades de superfície não podem ser permitidas como ponto de aterrissagem, de modo que toda colisão é fatal.

Deixo como obter informações e como tornar sua nave espacial para você; você pode usar o fator do mecanismo para renderizar o status do mecanismo quadro a quadro, por exemplo.

FxIII
fonte
Isso é ótimo, mas algumas idéias de como impulsioná-lo no código seriam ótimas.
Dvole
11
onde eu aprendi física shiffman.net/teaching/nature
Ming-Tang
Esse cara conhece sua física!
MGZero
7

Como a outra excelente resposta parece um pouco teórica, aqui está a versão simples do código:

// Position of the lander:
var positionX =  100.0;
var positionY = 100.0;

// Velocity of lander
var velocityX = 0.0;
var velocityY = 0.0;

// Acceleration due to gravity
var gravity = 1.0;

// If the player is pressing the thrust buttons
var isThrusting = false;
var isThrustingLeft = false;
var isThrustingRight = false;

// Thrust acceleration
var thrust = -2.0;

// Vertical position of the ground
var groundY = 200.0;

// Maximum landing velocity
var maxLandingVelocity = 3.00;    

onUpdate()
{
    velocityY += gravity;

    positionX += velocityX;
    positionY += velocityY;

    if (isThrusting)
    {
        velocityY += thrust;
    }

    if (isThrustingLeft)
    {
        velocityX += thrust;
    }
    else if (isThrustingRight)
    {
        velocityX -= thrust;
    }

    if (positionY >= floorY)
    {
        if (velocityY > maxLandingVelocity)
        {
            // crashed!
        }
        else
        {
            // landed successfully!
        }
    }
}
Iain
fonte
2
Mantendo as coisas simples. Eu espero que isso seja na linha do que ele estava procurando.
Beska
2

Infelizmente, a matemática aqui fica peluda. A resposta de FxIII é boa para o caso geral de um objeto em queda, mas você está falando de um foguete - e os foguetes queimam combustível.

Eu vi o código que faz isso, mas era completamente indocumentado e nunca consegui descobrir a matemática por trás dele. A menos que você seja limitado pela CPU, de alguma maneira eu não incomodaria e simplesmente a forçaria a brutamontes - a abordagem FxIIIs é aplicada em uma escala de tempo bastante curta e ajusta o empuxo (ou uso de combustível se você perceber que o foguete acelera de volta enquanto o combustível queima para manter). a aceleração especificada em vez do impulso especificado) entre cada iteração, à medida que o foguete queima combustível.

Loren Pechtel
fonte
Ficar sem combustível representa apenas um parâmetro em queda. É simplesmente uma força vetorial com valor decrescente. Estou errado? Em um caso simples, você tem G contra F, onde F é o motor do foguete e G a gravidade da Terra: nesse caso, basta medir um contra o outro, por isso, se não houver combustível, F cai para 0; deve aplicar G como força vetorial ao seu objeto. Obras para cada valor de F. Enquanto F> = G o objeto "deve" mover-se em direção de F.
daemonfire300
2
@ daemonfire300: Você não entende - não estou falando do efeito de ficar sem combustível, mas do efeito de queimar combustível. Uma configuração constante do acelerador no seu motor produz uma aceleração constante, uma aceleração constante produz uma taxa de queima de combustível em declínio contínuo. Isso significa que os cálculos simples fornecidos pelo FxIII produzirão números incorretos de uso de combustível.
Loren Pechtel
A quantidade de ganho de aceleração de A = F / M quando o combustível é queimado será um valor desprezível, a menos que a proporção de massa de combustível em veículo seja absurdamente alta ou a taxa de queima de combustível seja igualmente alta. Afinal, este é um jogo.
Patrick Hughes
@ Patrick Hughes: A quantidade de combustível transportada por qualquer verdadeiro foguete (não estou contando os casos híbridos de aerobrake / foguete de Marte) é uma parte substancial do seu peso total. Assumir que a taxa de combustível: aceleração a ser fixada produzirá uma resposta muito errada.
Loren Pechtel
11
Esta não é uma resposta para a pergunta, apenas um comentário sobre a resposta da @ FxIII.
22611 Jonathan Connell