Тревор разливает бензиновую дорожку от дома. Подпаливает её и огонь красиво по ней отправляется до самого дома. Взрыв кажется настолько реальным, будто вы видите настоящий огонь.
Уверен что все, кто проходил GTA5 помнят и любят этот момент. Но как в играх реализуют огонь? Мы знаем как в играх создаются трёхмерные объекты. Но, например модель машины, легко предсказать, ведь мы знаем где у неё бампер, стёкла и колёса. Однако предсказать поведения огня, дыма, снега или дождя не так легко и очень ресурсозатратно! Кто не знаком с моими статьями про отрисовку трёхмерных объектов в играх, в конце для вас я оставлю ссылку. А всех остальных я приглашаю узнать как в играх работают Particle System. Вытаскивайте пельмешки с кастрюли на тарелку, на связи разработчик игр с восьмилетним опытом работы и мы начинаем!
Частицы в реальной жизни
Что представляет из себя дождь? Это не философский вопрос, а вполне реальный. Дождь по своей структуре - это отдельные капли воды, которые падают сверху вниз. Снег ведёт себя индентично но не с такой скоростью. С дымом и огнём ситуация сложнее, ведь там поведение частиц намного хаотичнее.
Понятие частиц и дождь в играх
Из первой статьи мы с вами узнали о понятии "Точка". В той статье мы с вами рассматривали её для создания объёмной или плоской модели. Но у точек есть ещё одно применение. Как помним у нашей точки было всего три параметра (высота,ширина, длина). Теперь же мы можем добавить ещё один параметр - объект. Теперь наша точка имеет четыре параметра. Всё из той же статьи мы узнали о конструкции любых моделей. Они состоят из полигонов, которые состоят из рёбер, которые сводятся между точками. У нас выходит логический парадокс. Теперь по сути наша точка хранит в себе информацию об ещё 4 точках, если объект который мы в неё поместим будет плоским, и множество точек - если объект который мы в неё поместим будет объёмным.
Для этого в разработке игр есть понятие "Дочерний и родительский объект". Точка - это тоже объект в понятии игрового движка, хотя мы не можем её увидеть, но она может быть "Родителем" в иерархии игровых объектов. Что это значит? Теперь все объекты, которые будут обозначены "дочкой" для этого объекта будут повторять все его действия. Мы можем написать скрипт в котором будет написана простая логика "Создавай точки и отправь их падать вниз, пока они не встретят пол" и назначить системе частиц, которая будет их родителем. Система частиц будет создавать точки в том количестве, в каком выставит программист. Эти точки будут "Дочерними" для этой системы частиц. Точки, в свою очередь будут "Родителями" для спрайтов (спрайт - это модель, которая состоит из 1 полигона и по сути помогает нам увидеть на экране обычную картинку), на котором будет изображено текстуру капли воды.
Как это будет работать? Теперь система частиц будет создавать уйму точек (например 3000), которые будут выглядеть как капли воды. Точки будут создаваться на большей площади (100 м ² ). Вода будет падать и как только она коснется пола - будет создана новая точка. Чтоб это не выглядело заскриптовано, программисты пишут не скорость падения капли, а диапазон скоростей (15 - 25 м/с) и потому капли летят с разной скоростью, но не превышая максимум или минимум. Плюс такого решения в том, что процессор не просчитывает траекторию каждой точки и каждого полигона. Он следит только за точкой, к короткой привязана текстура воды, саму же текстуру он не видет и не нагружается себя лишними вычислениями. Процессор не следит когда капля коснётся воды. Он считает всё в точках и так облегчается его работа. Каплю же отрисует видеокарта - об это есть отдельная статья.
Интересная информация - некоторые игры используют другую логику. Например игра Minecraft создаёт капли таким образом, что игрока невозможно намочить:
Огонь, дым и взрывы
А теперь поговорим о системах сложнее. Вначале обсудим дым и\или пар (для игрового движка это одно и тоже). Тут всё легко. Вместо рисунка капли воды нужно подставить рисунок дыма или облака. Вот пример:
Далее используя понятия родительского объекта и скриптов просто прописываем траекторию движения точкам . Теперь посмотрите насколько мало работы остаётся для процессора. На схеме я обозначил точки, в которых спрайты будут перекрашены для огня:
С огнем не всё так легко. Для огня используют логику поинтереснее. Как и для других частиц мы используем точку. Но к точке привязана не одна текстура, а несколько, которые сменяют друг друга от 25 до 60 раз в секунду, создавая видимость настоящего огня. Для этого можно находясь в студии записать на видео настоящий огонь, потом разбить видео на кадры и залить в игровой движок:
Результат получается поразительный. Многие разработчики смешивают этот и предыдущий способ в один и огонь начинает выглядеть ну уж очень красивым
Частицы полностью отрендеренные на видеокарте
Коротко упомяну о последних обновлениях в мире игровых движков. Компания Unity анонсировали свой VFX Graph. Это частицы которые работают полностью на видеокарте. Их минусом есть полное отсутствие взаимодействия с геометрией (как мы знаем, геометрию просчитывает центральный процессор и видеокарта об этом не имеет информации). То-есть нельзя будет реализовать скрипт "Падать вниз пока не коснешься пола", ведь видеокарта не знает где в игре находится пол, хотя она и знает какого он будет цвета. Но плюсом есть те эффекты, которых достигает такая система. Видеокарта может работать не с несколькими тысячами точками, а с несколькими десятками миллионов. И это только сегодня. Через пару лет эта цифра вырастет. При этом им можно прописывать очень строгие траектории полёта, смена цвета и другие логические действия. Советую всем вписать в YouTube "VFX Graph" и посмотреть на эту красоту. Вот вам пример картинки созданной полностью из частиц без единого полигона:
Как и обещал, вот ссылка на первую статью и на статью про видеокарту с процессором:
1. ) Трёхмерные модели, точки, полигоны;
2. ) Видеокарта и Процессор.