Несколько лет я один пишу программу, которую сам называю физической лабораторией на столе. Сегодня она вышла в Steam, и я хочу рассказать, что это такое - и показать семнадцать коротких видео, записанных прямо сегодня утром.
Makarov Physics Suite - это набор из 132 интерактивных экспериментов по физике. Маятники, волны, электричество, магниты, жидкости, газы, звёзды, кристаллы, квантовые ямы. В каждом эксперименте есть панель с ручками, и когда вы крутите ручку, картинка меняется - но не потому что кто-то заранее нарисовал два варианта, а потому что программа заново решает уравнения с новыми числами.
Это главное, что отличает её от анимаций из учебника и от красивых роликов на YouTube. Там вам показывают, как оно бывает. Здесь вы сами меняете длину маятника, вязкость воды, скорость набегающего потока - и смотрите, что из этого получается. Хотите сломать - ломайте: поставьте трение в ноль, гравитацию в минус, ускорьте время в десять раз. Физика не обидится, она просто честно посчитает.
Внутри нет ни одного «готового» результата. Есть уравнения и численные методы, которые их решают шаг за шагом, кадр за кадром. У большинства экспериментов рядом живут графики, приборы (линейка, секундомер, транспортир, щуп) и цифры, которые можно сверить с учебником или с калькулятором. Я специально сделал так, чтобы у каждой модели было видно, где она честная, а где упрощает: если формула перестаёт работать при каких-то условиях, программа об этом говорит, а не рисует красивую ерунду.
Всё написано с нуля: свой движок, свой рендер, свои численные методы. Где нужна большая вычислительная мощность - жидкость, ткань, тысячи звёзд - считает видеокарта. Локализация на 23 языка, включая русский.
Первый ролик - прогулка по программе целиком. Главное меню сделано как карусель: шесть колец по 22 эксперимента, крутишь - выбираешь. Показываю, как открывается эксперимент, как устроена панель справа, как включаются приборы и графики, как выглядят сцены - почти у всех есть настоящая комната с полом, стенами и светом, у некоторых небо с облаками или звёздное небо, если эксперимент про космос. Просто чтобы было понятно, с чем имеешь дело, до того как углубляться.
Вращающийся барабан, наполненный зёрнами. Казалось бы, что тут интересного - но у сыпучих материалов четыре совершенно разных характера в зависимости от скорости вращения. Медленно - зёрна накапливаются с одной стороны и время от времени осыпаются лавинами: сначала тихо, потом сразу много. Быстрее - поверхность становится ровным ручьём, который течёт непрерывно. Ещё быстрее - зёрна начинают подлетать и падать дугами. А на определённой скорости, зависящей только от размера барабана, они прилипают к стенке и крутятся вместе с ним, как бельё в центрифуге. Зёрна подкрашены по скорости, и лавина выглядит как тёплая река, стекающая по холодному склону. Есть график, где видно, чем режим осыпаний отличается от режима качения - зубцы против ровной полки.
Поток воздуха обтекает крыло. Меняешь угол атаки - видно, как поток отрывается от крыла, как за ним закручиваются вихри и как след становится рваным и беспокойным. Можно поставить вместо крыла шар, цилиндр, пластину или кирпич и посмотреть, кто из них портит поток сильнее. Это самый тяжёлый эксперимент в программе - трёхмерная сетка, на которой уравнения движения жидкости решаются каждый кадр, - и одновременно один из самых красивых. Как раз на этой неделе я добавил сюда переключатель моделей турбулентности - то, чем пользуются в настоящих инженерных расчётах, - и одно и то же крыло теперь можно посмотреть глазами разных подходов: с честно разрешёнными вихрями или с усреднённым гладким следом.
Кирпичная башня, шар-баба и кнопка запуска. Шар качается на тросе, бьёт в стену, кирпичи разлетаются и складываются в кучу. Кирпичи подкрашиваются по скорости, поэтому удар виден как волна цвета, бегущая по кладке. Можно менять число рядов и колонн, скорость шара - и смотреть, при какой кладка устоит, а при какой сложится. Внизу график средней высоты башни: как только он обрывается, вы знаете, что произошло обрушение, даже если отвернулись.
Кусок ткани падает на шар. Складки, самопересечение, тень. Пресеты материалов - хлопок, шёлк, парусина, резина - это не «жёстче/мягче», а три отдельных числа: как ткань тянется, как сдвигается и как гнётся. Поэтому шёлк действительно струится, а парусина ложится складками по-своему. Включите ветер - и полотно начнёт полоскаться на настоящем вихревом потоке, а не по синусоиде. Ткань считает видеокарта, поэтому сетка достаточно частая, чтобы складки выглядели как складки.
Все видели в школе картинку с железными опилками на бумаге над магнитом. Здесь она не нарисована - она вырастает. Каждая опилка это маленький железный стерженёк, который намагничивается в поле катушки, чувствует соседей, поворачивается, заваливается, залезает на другие и встаёт дыбом. Включаете ток - и узор собирается из хаоса у вас на глазах. Меняете ток - узор перестраивается. Рядом легенда: какому цвету какая напряжённость поля соответствует, в миллитеслах.
Классика осциллографа: два колебания, одно по горизонтали, другое по вертикали, и точка, которая их складывает. Восьмёрки, трилистники, сложные плетёнки - всё зависит от отношения частот и сдвига фазы. Здесь можно чуть-чуть расстроить один из генераторов, и тогда замкнутая фигура начинает медленно кувыркаться, проходя через все свои формы подряд, - именно так, как это выглядит на настоящем приборе, когда частоты не идеально кратны.
Плоская песочница: стопки ящиков, домино, качели, машинка. Всё, что можно построить из твёрдых тел и суставов на плоскости. Движок написан с нуля в духе классических двумерных физических движков: трение, отскок, контакты, сон для тел, которые уже успокоились. Хорошее место, чтобы просто поиграть - толкать, ронять, строить и смотреть, как оно падает.
То же самое, но в объёме. Сферы, ящики, капсулы, разные материалы - дерево, металл, резина, стекло, камень, лёд. Материалы отличаются не только цветом: у дерева и стекла есть порог, выше которого они ломаются, и ломаются по-разному - дерево на щепки, стекло на осколки. Готовые сцены: башня, пирамида, домино, шар на верёвке против стены, бассейн с шариками, лестница с кеглями и бочкой. Тела можно хватать мышью и швырять, устраивать взрыв, отключать гравитацию, включать ветер.
Маленькая нейросеть, которая учится распознавать цифры прямо при вас - но показана она как физика. Функция потерь нарисована как горный ландшафт, обучение - это шарик, который катится вниз по этому ландшафту. Импульс в оптимизаторе - это буквально инерция шарика, а шум от случайных порций данных - это температура, которая трясёт его и не даёт застрять в первой попавшейся ямке. Поднимите температуру - и вы увидите, как шарик выскакивает из локальных минимумов. Мне кажется, это лучший способ объяснить, что такое обучение нейросети, человеку, который никогда его не видел.
Снег, песок, желе и вода в одном решателе. Главная сцена - снежная плита на горном склоне. Есть ручка трения между снегом и склоном: пока трение больше крутизны, плита держится; чуть меньше - сходит лавина. Это тот самый порог, который в горах решает всё. Метод, который здесь работает, используется в кино для снега и песка, и он честно воспроизводит, как снег сначала трескается, потом течёт, а потом снова слипается в комья внизу.
Тысячи звёзд, которые притягивают друг друга. Спиральные рукава никто не рисует - они сами закручиваются из холодного вращающегося диска, потому что так работает гравитация. Четыре сцены: одна галактика, слияние двух, лобовое столкновение, где маленький пришелец пробивает диск насквозь и гонит по нему кольцевую волну, и спутник, который приливы большой галактики растягивают в длинные звёздные потоки. Если есть подходящая видеокарта, звёзд тридцать тысяч.
Ряд маятников, у каждого длина подобрана так, чтобы за один цикл он сделал на одно качание больше соседа. Отпускаешь все разом - и они плетут бегущие волны, потом стоячие гребёнки, потом спирали, потом рассыпаются в полный хаос - и ровно в конце цикла снова встают в одну линию. Это классическая демонстрация, которую делают из шариков на нитках, только здесь можно менять число маятников и амплитуду. И если качнуть сильно, хореография начинает расстраиваться раньше конца цикла - потому что большой маятник качается чуть медленнее, чем маленький, и программа это честно учитывает.
Поверхность воды в три измерения. Капли, которые падают и расходятся кругами, круги, которые встречаются и складываются в интерференционные узоры, препятствия, вокруг которых волны огибают и отражаются. Можно бросать капли самому. Хорошо видно, как две волны проходят друг сквозь друга, не мешая, и как за столбом появляется тень.
Мыльная плёнка между двумя кольцами. Пока кольца близко, плёнка держится изящной «талией» - это самая экономная форма из всех возможных. Раздвигаете кольца - талия сужается, и в какой-то момент плёнка не выдерживает: пережимается и схлопывается в два плоских кружка. Что интересно, это расстояние не зависит ни от чего, кроме размера колец, - чистая геометрия. И обратно плёнка уже не соберётся, сколько ни сближай кольца, - точно так же, как над настоящей мыльной ванночкой.
Несколько вихрей на плоскости и миллион пассивных частиц, которые они таскают за собой. Пара вихрей кружится вокруг общего центра, пара с противоположным вращением летит прямо, как дым от сигареты, три и больше - начинают путать друг друга в клубки. Частицы рисуют всё это струями, и картина получается медитативная. Можно ставить вихри мышью и крутить силу каждого.
Настоящее магнитное поле Земли - то, у которого силовые линии сходятся у полюсов. Заряженные частицы солнечного ветра попадают в него, накручиваются на силовые линии, отражаются от полюсов как от зеркала и мечутся между ними. Те, что залетают слишком низко, врезаются в атмосферу - и именно там, где линии сгущаются, над полярными кругами, зажигаются занавесы света. Глобус крутится, сияние висит над ним. Пожалуй, самый красивый ролик из семнадцати, и в нём нет ни одного нарисованного кадра - только частицы и поле.
Всё это невероятно сложно реализовать и поддерживать в одиночку, потому я уверен - там полно ошибок и недоработок, и я буду рад любым конструктивным отзывам. А также буду рад ответить на любые вопросы. Наверняка, первое что прийдёт в голову спросить - это использовал ли я ИИ: и, конечно, да - особенно для написания кучи бойлерплейта (программа сейчас содержит порядка 180 тысяч строк кода) и перевода на множество иностранных языков, всех из которых я очевидно не знаю; однако тут полно и ручной работы и напомню, что самую первую версию этого комплекса я реализовал примерно в 2004 году - когда никакого ИИ и в помине небыло: