Ответы:
Самый простой способ - интеграция Эйлера. Вы должны сохранить вектор положения и вектор скорости. На каждом кадре:
( x для скаляров, X для векторов)
будь уверен, что дт маленький ...
| G | около 9,8 м / с² для земли и около 1,6 м / с² для луны
Вообще Сила действия за счет гравитационного взаимодействия составляет:

Это влияет на каждое тело и указывает на другое.
G скалярный является очень известным Гравитационным постоянной речь идет о 6.67e-011 N (м / кг) ²
Так как вы заинтересованы в ускорении:

Вам нужно знать только массу планеты (м2) и радиус (r), чтобы вычислить ваше ускорение.
Обычно ускорение, которое перемещает планету к вашему космическому кораблю, незначительно, потому что обычно m1 ничтожно мало по сравнению с m2.
Однако, если вы пытаетесь приземлиться на небольшой астероид, вам, вероятно, придется использовать общую формулу, добавляя эту силу к вектору полной силы на втором шаге.
РЕДАКТИРОВАТЬ:
По мере необходимости некоторые подсказки по реализации. Тебе понадобится:
Прежде всего, векторная библиотека: ваша игра может быть mono / bi / tree / four ... Dimensions, если вы считаете, что ваш случай - это проекция трехмерного слова, физические рулетки верны.
Если n - это выбранное вами измерение (возможно, 2 или 3 в вашем случае), библиотека должна иметь:
Вы можете использовать библиотеку, которая делает это, или реализовать ее самостоятельно; вектор может быть структурой или классом, выбор за вами.
Каждый двигатель должен быть описан:
Ваш пользовательский ввод будет использоваться для предоставления каждому двигателю числа, которое будет между 0 (неиспользуемый двигатель) и 1 (полная мощность): коэффициент двигателя (использования).
Умножьте коэффициент двигателя на его вектор тяги, чтобы получить реальное доверие двигателя и суммируйте все результаты всех доступных двигателей; это даст вам F второго шага.
Ваш коэффициент двигателя можно использовать для определения реального расхода топлива для каждого двигателя: умножьте коэффициент двигателя на расход топлива и на dt, чтобы узнать мгновенный расход топлива; Вы можете вычесть это значение из переменной общей емкости топлива (это дает вам возможность обновить вашу общую массу m, если масса топлива значительна).
Теперь вы можете продолжить использовать интеграцию для вычисления новой позиции, проверить на столкновение с поверхностью вашей планеты; если есть, используйте длину вектора скорости, чтобы сказать, была ли посадка успешной или катастрофой.
Очевидно, что можно / нужно проводить другие проверки столкновений, некоторые наземные объекты не могут быть разрешены в качестве точки приземления, поэтому каждое столкновение является фатальным.
Я оставляю как получить информацию и как передать вам ваш космический корабль; Вы можете использовать коэффициент двигателя, например, для отображения статуса двигателя кадр за кадром.
Поскольку другой отличный ответ кажется немного теоретическим, вот простая версия кода:
// 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!
}
}
}
К сожалению, математика здесь становится волосатой. Ответ FxIII подходит для общего случая падающего объекта, но вы говорите о ракете - и ракеты сжигают топливо.
Я видел код, который делает это, но он был полностью недокументирован, и мне так и не удалось выяснить, что за этим стоит. Если вы не ограничены каким-либо процессором, я бы не стал беспокоиться и просто перебил это - подход FxIII применялся в довольно короткие сроки и регулировал тягу (или расход топлива, если вы полагаете, что ракета дросселирует назад, когда топливо сгорает для поддержания заданное ускорение, а не заданное усилие) между каждой итерацией, когда ракета сжигает топливо.