Нелогичное продолжение моей старой статьи Рисуем интерференционную картину на JavaScript.
Забавы ради появилась идея сделать анимацию движения планет. Чтобы далеко не отходить от станка решено все было сделать в браузере на JavaScript.
Первая версия была про солнечную систему: планеты, Солнце, масштаб. Скучно!
Затем вспомнился научно-познавательный фильм про раннюю однородную Вселенную, в которой происходили флуктуации, вызывающие образование сгустков материи. В фильме приводилась анимация с шариками, которые висели в сетке. Решено было повторить, но "чуть" проще - с 16 шариками.
А теперь сделаем небольшую магию: рассчитаем силу тяготения между всеми шариками, вычислим результирующий вектор, силу и ускорение. В нашем примере все предсказуемо и без вычислений: шары полетят к центру.
А так как в моей модели у нас шарики не сталкиваются друг с другом, то они, набрав скорость, пролетают центр масс.
Дальше они несколько раз пролетают через центр масс и начинают набирать ошибку вычисления и улетают в "космос".
Самое забавное - наблюдать за тем, как шарики начинают вращаться вокруг общего центра масс. Еще очень крутой эффект - это гравитационная праща, думаю, вам повезет его увидеть, когда шарик пролетает между группой других шариков и разгоняется, уходя за горизонт/экран.
В конце концов получается хаотическая картинка, что была в начале статьи.
Обязательно сходите и сами поэкспериментируйте в песочнице https://jsfiddle.net/gf4wc0yq/3/. Код прост и не использует фреймворки (но проверялся только в Google Chrome под Ubuntu).
Что вы можете доработать в модели:
Учет веса;
Расчет столкновений, поглощение шариков друг другом и переход части кинетической энергии в тепловую;
Заранее определенные скорости и углы (например, для генерации простой модели трех тел);
Делитесь в комментариях своими находками.
Комментарии (9)
Sabirman
27.09.2022 13:01В dos-игрушке f19 расчет гравитации тоже делался таким способом. В результате из-за накапливаемой ошибки можно было летать совсем без топлива регулярно делая горки
VaalKIA
27.09.2022 13:41+1"Что вы можете доработать в модели: "
Раз уж речь идёт о планетах, то, конечно, скорость распространения гравитации, и тогда бы, получилась нормальная статья, а не это вот всё..
WondeRu Автор
27.09.2022 15:14Так речь как раз не про планеты, это было озвучено. Планеты гораздо интереснее и сложнее, чем просто точки с гравитацией.
ivan386
27.09.2022 21:15+2Несколько лет назат делал такую же штуку используя SVG.
Если картинку открыть частицы начнут двигаться. Формулы максимально упростил. Обнаружил что можно двигатся не только вперёд во времени но и назат.
Так можно задать положение частиц. Открутить время назат а потом пустить вперёд и они вернутся в изначальное положение.
perfect_genius
27.09.2022 21:47+1Когда-то делал игру, где есть оружие с самонаводящимися пулями. Каково было моё удивление, когда я попытался уклониться от таких пуль и они закружились вокруг меня по орбите. Если рассчитать момент, то кружатся очень долго пока не упадут или не улетят.
agat000
28.09.2022 10:50Есть еще такой сайт , посмотрите, может почерпнете что то интересное для своего. У меня он для релакса используется.
Naf2000
Еще в школе делал на turbo pascal 6 c этими вот egavga.bgi на 286 машинке. Правда без таких визуальных эффектов. На каждом такте у каждого шарика рассчитывались вектора сил тяжести к остальным (с у четом масс), на их основе приращение скорости, потом приращение координат, потом перерисовка. Поначалу надо было подобрать вектора скоростей, чтобы все не разлеталось и не упало в центр.
IvanPetrof
А у меня была потрёпанная книжка про конструирование космических аппаратов, и там была табличка с параметрами планет солнечной системы (масса, диаметр орбиты и орбитальная скорость). Тоже на турбо паскале написал подобный же движок и воочию убедился, что всё летает и не падает (включая Луну).
А ещё, в этой книжке была чб панорамная фотка венерианской поверхности, снятая камерой одного из спускаемых аппаратов. Т.к. Интернетов тогда никаких небыло, а в телевизоре было 2.5 канала, эта фотка для меня была как артефакт из параллельного мира ))