2D орбитальная физика
Я работаю над 2D физическим движком для игры. У меня есть гравитация и массы, работающие с использованием простого итеративного подхода (который, я знаю, мне придется обновить в конце концов); Я могу толкать массы вручную и наблюдать, как они двигаются, и все работает так, как я ожидал.
Прямо сейчас я пытаюсь настроить игровой мир заранее со спутником на простой круговой орбите вокруг планеты. Для этого мне нужно рассчитать начальный вектор скорости спутника с учетом массы планеты и желаемого расстояния; это должно быть тривиально, но я не могу на всю жизнь заставить его работать правильно.
Стандартные учебники по физике говорят мне, что орбитальная скорость объекта на круговой орбите вокруг массы M равна:
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 раз в секунду. Я знаю, что это очень быстро накапливает ошибки, но это должно, по крайней мере, заставить меня начать.
(Кстати, мне не удалось найти готовый физический движок, который обрабатывал бы орбитальную механику - большинство двумерных физических движков, таких как Бурундук и Box2D, вместо этого больше сосредоточены на жестких конструкциях. Может кто-нибудь предложить один, на который я мог бы взглянуть?)
2 ответа
Вы должны убедиться, что значение дельта-итерационного времени достаточно мало. Вам определенно придется повозиться с константами, чтобы получить ожидаемое поведение. Итеративное моделирование в вашем случае и в большинстве случаев является формой интеграции, где ошибки накапливаются быстро и непредсказуемо.
Да, эти уравнения справедливы в 2D-пространстве, потому что ваше 2D-пространство - это просто 2D-представление 3D-мира. ("Настоящая" 2D-вселенная имела бы другие уравнения, но здесь это не актуально.)
Длинный выстрел: возможно, вы используете расстояние до поверхности планеты как r?
Если это не так, попробуйте сократить ваш временной шаг вдвое; если это имеет большое значение, продолжайте уменьшать его, пока поведение не перестанет меняться.
Если это не имеет значения, попробуйте установить начальную скорость на ноль, а затем наблюдать за ее падением в течение нескольких итераций и измерять ее ускорение, чтобы увидеть, является ли она GM / r2. Если ответ все еще не ясен, опубликуйте результаты, и мы постараемся выяснить это.