Я работаю над 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 раз в секунду. Я знаю, что это очень быстро накапливает ошибки, но это должно, по крайней мере, помочь мне начать.
(Кстати, мне не удалось найти готовый физический движок, который обрабатывает орбитальную механику - большую часть 2D-физики. такие движки, как Chipmunk и Box2D, больше ориентированы на жесткие структуры. Кто-нибудь может предложить одну, на которую я мог бы взглянуть?)