2D орбитальная физика

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

Сейчас я пытаюсь заранее настроить игровой мир со спутника на простой круговой орбите вокруг планеты. Для этого мне нужно рассчитать начальный вектор скорости спутника, учитывая массу планеты и желаемое расстояние; это должно быть тривиально, но я не могу для жизни меня заставить его работать правильно.

Стандартные учебники по физике говорят мне, что орбитальная скорость объекта по круговой орбите вокруг массы М равна:

v = sqrt( G * M / r )

Однако, после применения соответствующего вектора, спутник не собирается ничего подобного достаточно быстро и попадает на резко эллиптическую орбиту. Случайное возирование показывает, что в одном случае это примерно в 3 раза.

Мой симуляционный симулятор использует традиционный метод:

F = G M m / r^2

G установлено в 1 в моей юниверсе.

Может ли кто-нибудь подтвердить мне, что эти уравнения все еще сохраняются в 2D-пространстве? Я не вижу причин, почему нет, но на данный момент я действительно хочу знать, является ли проблема в моем коде или моих предположениях...


Обновление: Мой физический движок работает следующим образом:

for each time step of length t:
  reset cumulative forces on each object to 0.
  for each unique pair of objects:
    calculate force between them due to gravity.
    accumulate force to the two objects.
  for each object:
    calculate velocity change dV for this timestep using Ft / m.
    v = v + dV.
    calculate position change dS using v * t.
    s = s + dS.

(При необходимости, используя векторы).

Сейчас я делаю по одному физике каждый кадр, который происходит примерно 500-700 раз в секунду. Я знаю, что это скопирует ошибки очень быстро, но это должно по крайней мере начать меня.

(BTW, мне не удалось найти готовый физический движок, который обрабатывает орбитальную механику). Большинство 2D-физических движков, таких как Chipmunk и Box2D, больше ориентированы на жесткие структуры. Может кто-нибудь предложить один, на который я мог бы смотреть?)

Ответы

Ответ 1

Вам нужно убедиться, что значение времени итеративного времени в Delta t достаточно мало. Вам определенно придется возиться с константами, чтобы получить ожидаемое поведение. Итеративная симуляция в вашем случае и в большинстве случаев - это форма интеграции, где ошибки накапливаются быстро и непредсказуемо.

Ответ 2

Да, эти уравнения сохраняются в 2D-пространстве, потому что ваше 2D-пространство является просто двумерным представлением 3D-мира. ( "Реальная" двумерная вселенная имела бы разные уравнения, но это не имеет значения здесь.)

Длинный выстрел: возможно, вы используете расстояние до поверхности планеты как r?

Если это не так, попробуйте сократить свой временной шаг пополам; если это имеет большое значение, продолжайте уменьшать его до тех пор, пока поведение не перестанет меняться.

Если это не имеет значения, попробуйте установить начальную скорость на ноль, а затем наблюдайте, как она падает на несколько итераций и измеряет ее ускорение, чтобы увидеть, является ли это GM/r 2. Если ответ по-прежнему не ясен, опубликуйте результаты, и мы попытаемся понять это.