Много пыли из ничего

Jan 03, 2021 21:52


Атомные взрывы - мой давний гештальт, страсть и желание повторить это величественное зрелище по ту сторону экрана.



Визуальные эффекты взрывов в кино и играх в основе своей делаются одинаково. Берется приличная программа, например Blender, в ней на основе системы частиц и довольно сложной и хитрой гидрогазодинамической симуляции художники получают итоговый эффект. Красивый.


Как-то так:

image Click to view


Далее, если речь идет о кино, этот эффект отрисовывается в сцену, образается и так далее. Рендер одного кадра может длиться десятки минут или даже часы, но для кино это нормально. Получается чертовски красивый настоящий объёмный эффект

В играх этот взрыв разделяется на несколько частей-слоёв, каждый из которых на компьютере художника отрисовывается в отдельный анимированный спрайт взрыва. И, когда в игре этот взрыв происходит, несколько этих анимированных слоев возникают в разных геометрических точках. При взгляде с одного ракурса создается ощущение объёмного эффекта, но при повороте камеры видно, как он "распадается" на слои. Впрочем, игровые взрывы - процессы скоротечные:

image Click to view


Ещё одним ограничением является разрешение. Анимированный эффект нужно сделать с высокой частотой кадров и в достаточном разрешении. И если этот эффект имеет большие геометрические размеры и детализацию, расход памяти и других ресурсов растёт лавинообразно.



Ну и есть эффекты, которые в игре сделать таким способом практически невозможно. К ним относится и атомный взрыв

Атомный взрыв физически огромный, а длительность эффекта очень большая, по сравению с любым другим взрывом. И если обычный взрыв можно быстро "свести на нет", то с атомным так не получится. Если след от атомного взрыва растворяется в воздухе за несколько секунд, это нихило так его обесценивает. Мы тут полкарты снесли, такое обычно не забывается.

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

Например, взрыв показывается исключительно с одного ракурса и дистанции. Когда слоеный пирог из нескольких анимированных спрайтов не демонстрирует своей природы, и не разрушает магию эффекта.

Или когда взрыв всегда показывается при виде сверху, как в стратегических играх. Так можно здорово сэкономить на сортировке частиц, вдобавок, игровой процесс в стратегиях зачастую требует, чтобы в эпицентр взрыва уже в скором времени двинулись войска. Поэтому "растворение" эффекта в воздухе выглядит адекватно предъявляемым требованиям.

А если эффект нужно и можно посмотреть со всех сторон, в реальном времени, с частотой 60 (а лучше 120) кадров в секунду, стандартные методы пасуют. "Запечь" такой эффект в анимацию невозможно - очень дорого, очень сердито, и ракурс только один. Рассчитать правильно, с законами гидрогазодинамики - нереально долго (десятки минут на кадр, при сомнительном качестве). Стандартные инструменты художников в таком случае пасуют, и за работу принимаются программисты.



Создание объёмного эффекта можно, наверно, сравнить с лепкой. Лепкой в четырёхмерном пространстве, ведь эффект не заморожен во времени, а развивается вместе с ним.

С помощью довольно простых математических функций задается функция плотности облака взрыва от координаты и времени. Поскольку атомный взрыв имеет довольно характерную топологию - тороидальная шляпка гриба, растущая ножка и плоское основание - все эти функции определяются в соответствующих системах отсчета. Точка из прямоугольной декартовой системы координат переводится в цилиндрическую или даже тороидальную. И в этом тороидальном пространстве определяется, какая будет плотность у облака, как оно вращается и какое в ней распределение температур и цветов.



Для того, чтобы создать неоднородности и неравномерности в процессе, используется перлиновский шум, который нарушает исходную осевую симметрию эффекта. Это математический трехмерный шум, который лучше всего подходит для генерации облаков, дымов и других газодинамических процессов.



Далее получившееся облако надо вписать в контекст остальной сцены. Надо учесть туман, надо понять, как это облако освещается солнцем, небом и изнутри своим собственным пламенем.

Полученные функции плотности, цвета и света численно интегрируются вдоль лучей, исходящих из камеры, получая итоговую картинку. По-нашему это называется scattering.

И, наконец, саму сцену надо перерисовать с учетом контекста атомного взрыва. Взрыв вызывает мощную световую вспышку, которая освещает и небо, и землю, отбрасывая тени и ослепляя глаза.

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

image Click to view


Все это добро рисуется 60 раз в секунду в разрешении 4к, каждый раз пересчитываясь заново практически с нуля. Несмотря на то, что я уже долгие годы занимаюсь компьютерной графикой, мне до сих пор иногда не верится, насколько много вычислений мы проводим в секунду. На сегодняшний день это десятки триллионов.

Получившийся эффект имеет максимальный размер около 4 километров, а если учитывать воздействие на облака - то все 30, при характерном размере авиационной карты в 20 километров, а танковой - 2.

Внешний вид вдохновлен взрывами Upshot-Knothole "Grable", Upshot-Knothole "Annie", Buster Jangle "Easy". А инверсия облаков лучше всего была видна на взрыве Crossroads "Baker".

Какие всё-таки потрясающие картины.

графика, программирование

Previous post Next post
Up