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 é:
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:
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.
Como a outra excelente resposta parece um pouco teórica, aqui está a versão simples do código:
fonte
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.
fonte