Как рассчитать скорость падения и ускорения?

9

Я подумываю о том, чтобы сделать игру с посадочным аппаратом, в которой вы управляете космическим кораблем и должны приземлиться, не разбившись. Какова простая формула для расчета скорости падения или ускорения в зависимости от рабочего времени двигателей времени?

Dvole
источник

Ответы:

28

Самый простой способ - интеграция Эйлера. Вы должны сохранить вектор положения и вектор скорости. На каждом кадре:

  • измерить время, прошедшее с последнего шага интеграции: 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
источник
Это здорово, но некоторые идеи, как реализовать его в коде, были бы великолепны.
Дволе
1
где я изучал физику shiffman.net/teaching/nature
Мин-Тан
Этот парень знает свою физику!
MGZero
7

Поскольку другой отличный ответ кажется немного теоретическим, вот простая версия кода:

// 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
источник
2
Сохраняя это простым. Я ожидаю, что это соответствует тому, что он искал.
Беска
2

К сожалению, математика здесь становится волосатой. Ответ FxIII подходит для общего случая падающего объекта, но вы говорите о ракете - и ракеты сжигают топливо.

Я видел код, который делает это, но он был полностью недокументирован, и мне так и не удалось выяснить, что за этим стоит. Если вы не ограничены каким-либо процессором, я бы не стал беспокоиться и просто перебил это - подход FxIII применялся в довольно короткие сроки и регулировал тягу (или расход топлива, если вы полагаете, что ракета дросселирует назад, когда топливо сгорает для поддержания заданное ускорение, а не заданное усилие) между каждой итерацией, когда ракета сжигает топливо.

Лорен Печтель
источник
Выход из топлива просто представляет собой падающий параметр. Это просто векторная сила с уменьшающимся значением. Я ошибаюсь? В простом случае у вас есть G против F, где F - двигатель ракеты, а G - сила тяжести Земли: в этом случае вам просто нужно измерить оба относительно друг друга, поэтому, если топлива не осталось, F падает до 0, так что вы только должны применить G в качестве векторной силы для вашего объекта. Работает для каждого значения F. Пока F> = G, объект «должен» двигаться в направлении F.
daemonfire300
2
@ daemonfire300: Вы неправильно поняли - я говорю не о влиянии нехватки топлива, а о влиянии сжигания топлива. Постоянная настройка дроссельной заслонки на вашем двигателе приводит к увеличению числа оборотов, а постоянное ускорение - к непрерывно уменьшающейся скорости сгорания топлива. Это означает, что простые вычисления, которые дает FxIII, приведут к неправильным числам использования топлива.
Лорен Печтел
Величина усиления ускорения от A = F / M при сгорании топлива будет незначительной величиной, если либо отношение массы топлива к транспортному средству не является абсурдно высоким, либо скорость сгорания топлива аналогично высока. В конце концов, это игра.
Патрик Хьюз
@ Патрик Хьюз: Количество топлива, перевозимого любым истинным ракетным спускным аппаратом (я не считаю случаи аэробрейка / гибрида Марса), составляет значительную часть его общего веса. Предполагая, что соотношение топливо: ускорение будет зафиксировано, вы получите очень неправильный ответ.
Лорен Печтел
1
Это не ответ на вопрос, просто комментарий к ответу @ FxIII.
Джонатан Коннелл