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