Как сделать точное вычисление физики гравитации на javascript в canvas методом Верле?

Сделал простенькую "симуляцию" гравитации https://elleremo.github.io/. Как я понял позже, я использовал не очень точный алгоритм Эйлера - на близких расстояниях планетки адово ускоряются и улетают в закат. Вот что я не понимаю:

1. Нужно ли использовать и учитывать dt в RequestAnimationFrame?
2. Нужно ли и когда использовать dt в алгоритме Верле?
3. Я пробовал заменить физику на алгоритм Верле (из гайдов, где просто считают без скорости и без dt), но итог тот же самый
4. Короче не понимаю, как сделать точную физику без ошибок
  • Вопрос задан
  • 1444 просмотра
Пригласить эксперта
Ответы на вопрос 4
lastuniverse
@lastuniverse
Всегда вокруг да около IT тем
elleremo, ускорение которое получают планеты пролетая вблизи других планет не является ошибкой!!!

Этот эффект называется "гравитационный маневр для ускорения объекта" или же "гравитационная праща"

Swingby_acc_anim.gifГравитационный манёвр для ускорения объекта (гравитационная праща)

Не стал делать "точную имитацию" гравитации. Пошел по пути:
1. каждый объект имеет массу равную объему объекта умноженному на плотность объекта
2. каждый объект влияет на каждый динамический объект
3. влияние пошагово рассчитывается по формуле (почти) :
V = сумма(F); // суммарный вектор сил
F = k*M/D; // сила влияния (расчитывается для каждого объекта оказывающего влияние на текущий)
M - масса объекта
D - квадрат расстояния между центрами масс объектов
k - коэффициент для подгона скоростей (выполняет роль гравитационной постоянной)

Алгоритм расчета (пошагово):
1. Для каждого динамического объекта происходит расчет новых координат (сумма текущих координат и вектора скорости, рассчитанного на предыдущей итерации цикла симуляции)
2. Каждый динамический объект сверяется с каждым объектом на предмет столкновения. Если расстояние между центрами 2х сравниваемых объектов меньше суммы их радиусов то происходит слияние. Если объединяются статичный и динамический объекты, то динамический удаляется а его масса добавляется к статическому с перерасчетом плотности, радиуса и объема. Если объединяются 2 динамических объекта то к первому добавляется масса второго с перерасчетом плотности, радиуса и объема, координаты и вектора скоростей пересчитываются как взвешеная сумма координат и векторов скоростей обоих объектов. После второй объект удаляется.
3. Для каждого динамического объекта расчитывается сумма векторов силы влияния притяжения всех объектов. Затем данная сумма и вектор скорости текущего объекта суммируются
4. Переход к новой итерации цикла симуляции.

Вся реализация расчета тут (в конце скрипта). Все формулы вынесены в класс Calc.

видеодемонстрация
демонстрация (масштабируется колесиком мышки, перетаскивается с помощью ЛКМ)

Добавил слияние планет при столкновении (массы суммируются, вектора скоростей суммируются, позиция переносится в центр масс)
Добавил источники (автоматически генерируют планеты)
Добавил отдельные кнопки для пуска и остановки источников

5bbd21b57da99316097769.png
Добавил настройки:
  • параметры отображения
    • отображать сетку - вкл/выкл отображение координатной сетки
    • отображать источники - вкл/выкл отображение объектов, генерирующих планеты
    • отображать шлейф - вкл/выкл отображение траектории планет

  • Настройки физических величин - позволяют задаь минимальные и максимальные значения для размеров и плотности статических и динамических объектов
  • Управление симуляцией
    • шаг симуляции - экспериментальная величина регулирующая точность расчетов
    • скорость источников - изменяет скорость, с которой источники генерируют планеты
    • включить источники - вкл/выкл генерацию планет источниками



Доработал механизм расчета влияния гравитации, теперь у каждого объекта масса считается исходя из объема и плотности.
Ввел изменение в процесс генерации новых планет, теперь они выставляются на лист с рассчитанной первой космической скоростью относительно центрального статичного объекта.
Установил статичным объектам повышенную плотность, что существенно увеличило их массу (можно менять на панели настроек)
Установил динамическим объектам пониженную плотность, что существенно уменьшило их массу и взаимовлияние (можно менять на панели настроек)

5bbd22bc10be0483291405.png
Ответ написан
Могу ошибаться, но по-моему вы собираетесь решить задачу трёх тел ) У вас есть статичные планеты, которых в природе нет, так что реальную физику вы уже не построите. А эмуляцию… как уже советовали, подбирайте параметры. Ограничения на ускорения при гравитационном маневре, расчет гравитации не только ближайшей статической планеты, но и их ансамбля. Такое вот.
Ответ написан
profesor08
@profesor08 Куратор тега JavaScript
Ну нормально же работает, что не так то? Играйся с параметрами планет, расставляй их правильно, чтоб не улетали, задавай им правильную скорость, правильный вектор, правильную массу, правильный радиус орбиты. Для примера возьми нашу Солнечную систему в масштабе.

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

Короче говоря, физическая модель у тебя есть, тебе достаточно подобрать параметры объектов.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы