Создаём взрыв с помощью стандартных средств макса
ni hao, друзья!
Вот я просматривал тут уроки на рендере и нашел их целую кучу по системам частиц. Авторы применяли частицы для достижения самых разных эффектов. Но больше всего меня удивило то, что я не нашёл ни одного урока, в котором системы частиц применялись бы для создания взрыва. А ведь это, можно сказать, один из основных эффектов, где применяются частицы.
В этом уроке я хочу показать как можно создать эффекты взрыва, используя стандартные средства макса, и Particle Flow, в частности. Тот взрыв, который мы получим можно с успехом использовать во многих анимациях. Я пытался получить оптимальное соотношение рендеринг/качество, чего я думаю и добился.
Кроме создания самого взрыва, я смоделирую сцену и покажу как этот взрыв будет в ней смотреться. Сцена будет такой: два космических корабля летят над планетой, один стреляет по другому, в результате чего и образуется наш взрыв.
Этап №1 - Моделируем космические корабли
Итак, приступим к первому этапу нашей работы. Первый корабль я создам примерно так, как выглядел корабль из фильма Звёздные Войны, второй эпизод.
Возьмем за основу корабля сплайн. Создадим в окне Top профиль крыла (оставьте его не замкнутым). Потом подрисуйте половину корпуса, хотя вы можете сделать это и в одно действие. Для удобства можете пользоваться привязками.
Применим к нашему сплайну модификаторы Extrude и Edit Poly, и перемещая/создавая/обьединяя вершины и полигоны получим вот такой вот обьект.
Чего-то не хватает? Правильно - не хватает двигателей! Их четыре и размещены они по два на крыльях, ближе к корпусу. Двигатели создаются очень просто: насколько я видел в фильме они совсем простые. Форма Line и модификатор вращения Lathe сделают своё дело. И ещё надо добавить те две конусообразные пимпочки спереди и сзади, вроде турбины (хотя зачем в космосе турбины?). Преобразуйте двигатель в Edit Poly.
Теперь надо подготовить космический корбль к последующему текстурированию. Возвращаемся к Edit Poly, и установим ID для полигонов. Переключаемся в режим редактирования Polygon, выделяем полигоны всего корабля, и в счётчике set ID вводим 1. То же самое сделаем и с двигателями: выделяем все полигоны и устанавливаем для них ID = 1.
Теперь выделяем полигоны стекла и устанавливаем ID = 3.
Теперь создадим второй корабль. Я не буду так подробно описывать его создание, как создание первого корабля.
Скажу только, что сначала я получил вот такой обьект из сплайна, к которому впоследствии применил модификаторы extrude, Edit Poly и выровнял вершины и полигоны.
Этап №2 - Моделирование ландшафта
Правдоподобный ландшафт, как и некоторые другие вещи (например растительность) достаточно сложно создать стандартными средствами макса. Те убогие горы, получаемые с помощью Terrain нам не подходят, а вручную делать ландшафт (например, с помощью Soft Selection) довольно долго и сложно. В ландшафте необходима определённая доля случайности, поэтому большинство программ для его создания используют фрактальный алгоритм. Я создал наши просторы в Bryce 5.5. Трехмерный ландшафт там создаётся по 2d картинке, с помощью её яркости. Затем я экспортировал его в 3Ds max.
Процесс создания горы я не буду описывать, но если вам интересно, то вы можете почитать тут на рендере есть вроде про него уроки.
Вот ландшафт, который создал я (209 Kb).
Этап №3 - Текстурирование
Для начала надо решить чем будем рендерить. Наилучшую картинку вам, разумеется, даст VRay, но его надо долго настраивать.
Оттекстурим сначала наш первый кораблик. Создадим Multi/Sub - Object с четырьмя материалами. Первый у нас пойдёт на корпус, второй - на свет от двигателей, третий - на стекла, а четвёртый - на повреждённые поверхности корабля. В качестве первого материала создадим простой Standart, шейдер - anisotropic, specular level = 100, glossiness = 33, anisotropy = 55, для цвета диффузного рассеивания выбеите серый цвет (55,55,55), для reflection выберите карту raytrace. Второй материал тоже будет Standart. Для diffuse, ambient и self-illumination устанавливаем белый цвет. Наконец, третий материал для стекла: опять Standart, diffuse - чёрный цвет, шейдер и блики - как и у первого материала.
С четвёртым материалом будет посложнее. Помните, как мы назначили одному полигону ID, равный 4? Так вот в этот самый полигон попадёт один из снарядов. Разумеется, на нём должна образоваться вмятина. Для этого потребуется в photoshop или в другом графическом редакторе изготовить маску вмятины. Я её нарисовал вот так:
Так, приступим: создайте копию первого материала (корпус) и вставьте её в качестве четвёртого материала. Здесь для карты Displacement создайте карту mask:
В карте Mask не забудьте поставить галочку Invent Mask.
Вернитесь назад, к нашей вмятине и задайте величину карты Displacement равной -10. Это нужно для того, чтобы вмятина не выдавливалась из корпуса корабля, а наоборот вдавливалась в него.
Наша вмятина будет иметь цвет диффузного рассеивания: создадим нечто похожее на испепелённую поверхность.
Скопируйте карту из Displacement в Diffuse. Нажмите на кнопку, рядом с надписью Map и создайте вместо шума карту dent.
В итоге мы получили наш многокомпонентный материал:
Небольшая заметка для тех, кто в качестве визуализатора решил использовать Default scanline renderer. Этот визуализатор не умеет просчитывать карту Displacement, поэтому не пугайтесь если у вас получилась ерунда.
Готовый корабль можете скачать тут (29 Kb).
Не будем останавливаться на текстурировании второго корабля и ландшафта.
Здесь можете взять второй корабль с текстурами (2,75 Mb).
Этап №4 - Окружение и сборка сцены
Потихоньку, потихоньку мы подбираемся к основному этапу данного урока, а пока создадим окружение.
Может кто-то захочет сделать анимацию, тогда статичная картинка в качестве фона не подойдёт. Мы будем использовать карту environment.
Создадим нечто очень похожее на небо и облака.
Откройте редактор материалов. Загрузите в ячейку карту Gradient Ramp (Меню Material => Get Material... => Gradient Ramp).
В свитке coordinates установите флажок Environ и в свитке mapping выберите Spherical Environment. Поменяйте угол W на -90, чтобы небо шло не слева на право, а сверху вниз. Цвета градиента и параметры шума установите как показано ниже:
Теперь начнём собирать сцену. Импортируем в сцену наш ландшафт (File => Import...).
Создадим фотометрический источник освещения IES Sun, направим мишень куда-нибудь в центр ландшафта. Опустим наше солнышко пониже над горизонтом, типа сейчас вечер.
Настроим наше солнце: интенсивнсивность установите в 2000 lx, цвет - красноватый (246, 159, 124), тени - Ray Traced Shadows.
Добавьте в сцену наш корабль (File => Merge...). Размещаем его где-нибудь над горами и рендерим:
Но зато обратите внимание, как улучшилось качество корабля. Если в пустой сцене он выглядел отвратительно, то сейчас смотрится довольно неплохо.
Этап №5 - Работаем с частицами
Наконец-то мы добрались до Particle Flow! Это основной этап нашего урока. Но прежде чем к нему приступить разберёмся как моделируются взрывы.
Есть несколько способов. В одном из них взрыв моделируют с помощью очень большого количества очень мелких частиц, они имеют очень простую текстуру. Сложность этого метода заключается в описании движения этих частиц. Есть и другой способ: частиц мало, их движение описывается достаточно просто, но сложность состоит в изготовлении текстуры. Существует также метод, когда взрыв моделируются с помощью геометрии (например с добавлением анимированного модификатора Noise и т.д.). Такой вариант очень хорошо подходит для плотного, чёрного дыма.
Я создам взрыв с помощью метода № 2.
Итак, работаем с Particle Flow. Для тех, кто с ним не знаком и понятия не имеет, что это такое я вот здесь привожу краткую справочку для общего развития:
Particle Flow - это мощный модуль для работы с частицами. В отличае от всяких там Snow, Spray и прочих систем частиц, предназначенных для иммитации определённого эффекта (снег, дождь и т.д.), Particle Flow сможет создать всё, что вы пожелаете. Если раньше для достижения кого-то сложного эффекта с частицами нужно было писать скрипты, то с Particle Flow можно изобразить весь этот процесс схематически. Видите, комфорт всегда приходит... со временем.
Создайте где-нибудь в сцене PF Source из строки Particle Systems, в категории Geometry. В его настройках, в свитке Setup нажимаем Particle View. Появится вот такое окошко:
Вот описание некоторых операторов:
Position Icon - задаёт начальное положение частиц на нашем PF Source.
Position Object - частицы создаются на указанном обьекте.
Speed - задаёт скорость частиц в пространстве.
Material Dynamic - применяет к частицам анимируемый материал. С его помощью можно создать, например изменение цвета частиц со временем.
Keep Apart - изменяет направление движения частиц, держа их на заданном расстоянии друг то друга.
Кстати, к Particle Flow можно применять разные движущие силы (Forces), только не с помощью кнопки Bind to Space Warp, а непосредственно в окне Particle View через оператор Force.
Вот описание некоторых критериев:
Age Test - проверяет возраст частиц, когда он достигнет заданного значения, то выполняется какое-то событие.
Collision - проверяет столкнулись ли частицы с каким-нибудь дефлектором.
Find Target - интересная вещь! Посылает частицы к какой-нибудь точке или к какому-нибудь обьекту. Когда они достигнут цели происходит событие.
Split Amount - посылает заданное количество случайных частиц к следующему событию.
На сегодня с теорией - всё! Перейдём к практике (вернёмся к нашему проекту).
Итак, создаём взрыв!
Может вы видали в фильмах: из многих взрывов летят такие осколки, а за ними тянется длинный огненный след. Может я не совсем понятно обьяснил, но вы сейчас сами увидите.
Прежде чем начать взрывать надо подготовиться. Во-первых нам понадобится карта Particle Age. Эта карта изменяет текстуру частиц, в зависимости от их возраста. Она может применяться к частицам с помощью оператора Material Dynamic. Чтобы она правильно работала в событии обязательно должен стоять оператор Delete, с указанным максимальным возрастом частиц.
Создайте новый материал Standart. Для diffuse создайте карту Particle Age. Установите параметры так:
В качестве дополнительных текстур я установил Gradient Ramp. Настройки всех трёх примерно такие, различаются они только цветами. Да, кстати, проанимируйте параметр Phase: на 350-ом кадре значение установите в 6.
Копируйте нашу карту Particle Age и вставьте её как Self-Illumination. Теперь для Opacity создадим карту Mask. Первая карта (Map) - Gradient. Выглядит она так:
Всё, мы создали материал. Частицы будут постепенно менять цвет (от яркого к тёмному), постепенно превращаться в дым и исчезать.
Это ещё не вся подготовка! Создадим три forces: ветер (Strength = 0,01 ; Turbulence = 1,0), три "торможения" (в первом торможение по всем трём осям равно 0,5, во втором 15 и в третьем - 20) и гравитацию (Strength = 0,05).
В окне Particle View начанаем работать с первым событием (назовём его "Осколки"). Я буду по порядку описывать каждый оператор этого события. В скобках даны их настройки.
Birth (Emit Start = 0 ; Emit Stop = 3 ; Amount = 20) - создаём немного "ведущих" частиц, за ними будет тянуться след.
Position Icon - оставляем как есть.
Speed (Speed = 300 ; Variation = 50 ; Direction = Along icon Arrow ; Divergence = 80) - наши частицы полетят вдоль направления нашего PF Source (Direction), с разными скоростями (Variation) и под разными углами (Divergence).
Rotation - оставим как есть, или можете удалить его: он всё равно не понадобится.
Force (добавьте в список первое торможение и гравитацию, можете также попробовать добавить и ветер) - наши частицы будут затормаживаться, на них будет дуть ветер и они будут падать на землю.
Display (Visible % = 50) - сколько частиц в % будет отображаться в окнах проекций, 50 - иначе тормозить будет.
Shape Facing (Look At Camera/Object = наша камера ; переключатель в In Screen Space ; Proportion % = 1) - в качестве формы наших частиц выступит грань, всегда повернутая в сторону нашей камеры. Те, кто создавали (или пытались создать) 3D игры вспомнят те самые спрайты.
Material Dynamic (выбираем наш материал).
Spawn (переключатель в By Travel Distance ; Step Size = 3 ; Spawnable % = 100 ; Variation % = 100 ; в области Speed переключатель в положение Inherited % = 10 ; Divergence = 100 ; Variation % = 100) - этот критерий (кстати spawn переводится как "икра") создаёт дополнительные частицы по всему пути нашего осколка, это будет тот самый огненный "хвост". Новые частицы будут лететь на 90% медленнее осколка (Inherited), и их курс будет немного отклоняться (Divergence). Критерий Spawn посылает созданные частицы к следующему событию.
Delete (переключатель в By Particle Age ; Life Span = 200 ; variation = 50) - удаляет частицы, возраст которых 200 ± 50.
Так, переходим к следующему событию (назовём его "Огненный след"), оно происходит с частицами, созданными оператором spawn.
Я не буду описывать каждый оператор, только скажу, что это событие применяет к созданным частицам тот же материал, задаёт для них форму грани, почти с таким-же размером (чуть больше), как и размер осколка. На эти частицы воздействует только второе торможение, и они удаляются, когда их возраст 100 ± 50.
У вас должно получиться так:
Создадим огоньку. Для него потребуется отдельная текстура, но она очень похожа на предыдущую, за исключением Opacity. Коприруйте карту diffuse, зайдите в карту Mask для Opacity и вставте её вместо преждней Particle Age. Этим мы сделали частицы не только круглыми, но сделали и прозрачными чёрные области, создав языки пламени. Возвращаемся опять к окну Particle View. Создадим третье и четвёртое, независимые от двух других события.
Вот здесь можете взять сцену (22 Kb).
А вот здесь лежит анимация взрыва (259 Kb).
Когда я рендерил анимацию получил неплохое время: 3 минуты на кадр, и это если учесть мой "пень" 1700 МГц и мои несчастные 256 Mb оперативы... да да! Смейтесь сколько угодно! Главное, что у вас рендериться будет намного быстрее. Согласитесь, отличное сочетание время\качество.
Как выжать из этого максимум? Помните: этот взрыв подходит в основном для анимации, на статичном изображении он может выглядеть плохо. Насчёт наших осколков с "хвостом": если они наберут большую скорость, например при длительном падении вниз под действием гравитации, огонь начинает "распадаться", становятся видны отдельные грани, что очень плохо. Поэтому если вы захотите создать, например, метеоритный дождь, то позаботьтесь о том, чтобы на частицы действовало меньше торможения. Такой момент: наш взрыв представляет собой крупные частицы, поэтому не надо распологать такой взрыв близко к поверхности земли. Некоторые частицы могут частично "уйти" под землю, а частично оставаться наруже... Выглядит не очень, если честно.
Что я не смог реализовать? Взгляните на огненные "хвосты": они одинаковы по всей своей длине. На самом деле так быть не должно: один край "хвоста" (дым) должен быть шире чем другой (огонь). Можно было применить Keep Apart и постепенно изменять дистанцию между частицами, но тогда пришлось бы увеличить и количество самих частиц, и как следствие - время рендеринга быстро увеличивается. Если же ваш компьютер позволяет вам сделать такую вещь для анимации, тогда вперёд!
Вот, я думаю, и все предостережения.
Этап №6 - Собираем всё вместе и подводим итоги
На этом финальном этапе мы обьединяем нашу сцену и наш взрыв. От кораблика аккуратно отрезаем крыло: в режиме Edit Polygon выделяем полигоны крыла и жмём Detach. Затем в режиме Border выделяем границы образовавшихся разрезов и закрываем их (кнопка Cap). С помощью системы частиц PArray разнесём наше крыло на кусочки (основные настройки такие: Object-Based Emmiter = наше крыло ; в области Particle Type переключатель в Object Fragments ; в области Object Fragment Controls переключатель в Number of Chunks ; minimum = 120 ; thickness (толщина) = 3 ; нажмите кнопку Get material from ; Spin Time = 90 ; Variation = 50). Создайте, также какой-нибудь затухающий источник освещения чуть впереди взрыва. Он будет освещать центральные цастицы и будет создаваться впечатление, что в центре огонь горячее, чем по краям. Создадим выстрелы с помощью Video Post и плагина Trail (22 Kb). Размещаем все обьекты по местам и получаем окончательную картинку:
Вот, собственно говоря и всё. Подводя итоги хотелось бы, чтобы моя работа не была напрасной. В этом уроке было затронуто много тем, я надеюсь, что каждому этот урок принесёт пользу.
P.S. Обьём урока большой, возможно я где-то допустил ошибки или упустил какие-то моменты. Так или иначе, если что-то непонятно, то спрашивайте.