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

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

15 голосов
/ 28 октября 2010

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

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

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

v = sqrt( G * M / r )

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

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

F = G M m / r^2

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

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


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

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 раз в секунду. Я знаю, что это очень быстро накапливает ошибки, но это должно, по крайней мере, заставить меня начать.

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

Ответы [ 2 ]

10 голосов
/ 28 октября 2010

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

3 голосов
/ 28 октября 2010

Да, эти уравнения справедливы в 2D-пространстве, потому что ваше 2D-пространство - это просто 2D-представление 3D-мира.(«Настоящая» 2D-вселенная имела бы другие уравнения, но здесь это не имеет значения.)

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

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

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

...