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