Самый простой способ - интеграция Эйлера. Вы должны сохранить вектор положения и вектор скорости. На каждом кадре:
- измерить время, прошедшее с последнего шага интеграции: dt
- вычислите силу vecor для ваших двигателей: F
- рассчитать вектор ускорения: A = F / m, где m - масса космического корабля.
- добавьте вектор гравитации: A = A + G убедитесь, что G указывает на центр планеты
- обновить вектор скорости V = V + A · dt
- обновить вектор положения X = X + V · dt
( x для скаляров, X для векторов)
будь уверен, что дт маленький ...
| G | около 9,8 м / с² для земли и около 1,6 м / с² для луны
Вообще Сила действия за счет гравитационного взаимодействия составляет:
Это влияет на каждое тело и указывает на другое.
G скалярный является очень известным Гравитационным постоянной речь идет о 6.67e-011 N (м / кг) ²
Так как вы заинтересованы в ускорении:
Вам нужно знать только массу планеты (м2) и радиус (r), чтобы вычислить ваше ускорение.
Обычно ускорение, которое перемещает планету к вашему космическому кораблю, незначительно, потому что обычно m1 ничтожно мало по сравнению с m2.
Однако, если вы пытаетесь приземлиться на небольшой астероид, вам, вероятно, придется использовать общую формулу, добавляя эту силу к вектору полной силы на втором шаге.
РЕДАКТИРОВАТЬ:
По мере необходимости некоторые подсказки по реализации. Тебе понадобится:
- Векторная библиотека
- Модель двигателя
- Физика Модель
- Обнаружение столкновений
- Пользовательский интерфейс (ввод и графический рендеринг)
Прежде всего, векторная библиотека: ваша игра может быть mono / bi / tree / four ... Dimensions, если вы считаете, что ваш случай - это проекция трехмерного слова, физические рулетки верны.
Если n - это выбранное вами измерение (возможно, 2 или 3 в вашем случае), библиотека должна иметь:
- объект хранения векторов (список из n чисел с плавающей запятой для каждого вектора)
- оператор суммы (компонент суммы компонентом)
- оператор скалярного умножения (каждый компонент умножается на число с плавающей точкой)
- умножение точек между векторами (умножение компонента на компонент и суммирование всех)
- длина вектора (квадратный корень вектора, умноженного на точку)
Вы можете использовать библиотеку, которая делает это, или реализовать ее самостоятельно; вектор может быть структурой или классом, выбор за вами.
Каждый двигатель должен быть описан:
- вектор, указывающий его силу тяги и направление
- скаляр, который показывает расход топлива в секунду при полной мощности;
Ваш пользовательский ввод будет использоваться для предоставления каждому двигателю числа, которое будет между 0 (неиспользуемый двигатель) и 1 (полная мощность): коэффициент двигателя (использования).
Умножьте коэффициент двигателя на его вектор тяги, чтобы получить реальное доверие двигателя и суммируйте все результаты всех доступных двигателей; это даст вам F второго шага.
Ваш коэффициент двигателя можно использовать для определения реального расхода топлива для каждого двигателя: умножьте коэффициент двигателя на расход топлива и на dt, чтобы узнать мгновенный расход топлива; Вы можете вычесть это значение из переменной общей емкости топлива (это дает вам возможность обновить вашу общую массу m, если масса топлива значительна).
Теперь вы можете продолжить использовать интеграцию для вычисления новой позиции, проверить на столкновение с поверхностью вашей планеты; если есть, используйте длину вектора скорости, чтобы сказать, была ли посадка успешной или катастрофой.
Очевидно, что можно / нужно проводить другие проверки столкновений, некоторые наземные объекты не могут быть разрешены в качестве точки приземления, поэтому каждое столкновение является фатальным.
Я оставляю как получить информацию и как передать вам ваш космический корабль; Вы можете использовать коэффициент двигателя, например, для отображения статуса двигателя кадр за кадром.
Поскольку другой отличный ответ кажется немного теоретическим, вот простая версия кода:
источник
К сожалению, математика здесь становится волосатой. Ответ FxIII подходит для общего случая падающего объекта, но вы говорите о ракете - и ракеты сжигают топливо.
Я видел код, который делает это, но он был полностью недокументирован, и мне так и не удалось выяснить, что за этим стоит. Если вы не ограничены каким-либо процессором, я бы не стал беспокоиться и просто перебил это - подход FxIII применялся в довольно короткие сроки и регулировал тягу (или расход топлива, если вы полагаете, что ракета дросселирует назад, когда топливо сгорает для поддержания заданное ускорение, а не заданное усилие) между каждой итерацией, когда ракета сжигает топливо.
источник