Анимация следов на снегу с помощью Displacement
Доброго времени суток. Меня зовут Данил Шапошников. Живу и работаю в Самаре. В свободное от работы время решил сделать что-то полезное, например поделиться таким вот тутором.
Не так давно увидел небольшой ролик, где красиво взаимодействуют разные предметы со снегом. Впечатлился. Задумался, как же это сделано? И родился вот такой вариант - анимировать следы на снегу с помощью дисплейса. Пытаясь воплотить это, получил опыт, который и излагаю.
Наглядно будет продемонстрировать это на автомобильной покрышке.
1. Сцена
Сначала создаём проект и сцену. File>Project>New. В окне вписываем сверху имя нашего проекта и жмём кнопку Use Deafults, затем Accept. Дальше создаём Poligon Plane в окне top и присваиваем ему размеры 40*40. И поднимаем по оси Y на 0,2 единицы, это будет глубина нашего снега.
Квадратные размеры этой плоскости важны, так как мы будем снимать с помощью неё текстуру для дисплейса, а RenderMan адекватнее работает именно с квадратными текстурами, любые другие он всё равно конвертит в квадрат.
Приступаем к покрышке. Создаём Poligon Torus со следующими параметрами и поворачиваем по Z на 90 градусов.
Дальше, с помощью инструментов Insert Edge Loop Tool и Select Edge Loop Tool приводим наш торус в следующий вид. Первый инструмент при клике по эджу добавляет кольцо эджей. Это нужно для контроля над скруглениями. Второй инструмент позволяет выделить кольцо эджей, чтобы двигать, скалить, крутить их. После того как колесо готово, не забываем чистить историю Alt+Shift+D.
Клавиша "3" позволяет переключить выделенный объект в превью сглаженного вида, как на рисунке ниже. Клавиша "1" переключает объект обратно.
Для сглаживания мы будем использовать замечательный рендермановский Subdiv Scheme. Этот нод при рендеринге клёво и шустро сглаживает полигоны. Если вы будете анимировать колесо просто ключами, то уже сейчас можете применить к pTorusShape1 этот параметр (см. ниже). Но если вы собираетесь анимировать колесо с помощью nCloth, то придётся потерпеть и применить этот параметр к ноду outputCloth1, который появится после того как вы примените nCloth к объекту.
Дальше, делаем дисплейс протектора покрышки. Меня устроила UV развёртка торуса. Я открыл UV Texture Editor и сделал UV Snapshot. Выбрал там размер 2048*2048. Формат tif, чтобы можно было редактировать в фотошопе.
Сделал вот такую нехитрую текстуру, по UV Snapshot`у в фотошопе. Важным моментом является то, что фон залит серым цветом ровно середины палитры. Это будет 0 дисплейсинга. Всё что светлее этого серого, будет "вровень выпирать" (с) «НашаРаша», всё что темнее, будет вдавлено в поверхность. Обратите внимание на указанные зелёными стрелками еле видные светлые пятна, их достаточно чтоб изобразить выпуклости напоминающие шипы.
Создаём для шины материал. выбираю Blinn со следующими настройками.
Чтобы прицепить к этому материалу дисплейс, нужно перейти на вкладку blinn1SG, там выбрать узел file.
Дальше, разберём что к чему в настройках дисплейса. На картинке ниже цифрами помечены ключевые моменты. 1 - Тип фильтра. Тобишь сглаживания текстуры. Опытным путём показалось что такой вариант выглядит в данном случае получше. 2 - Тут прицепляется наша карта дисплейсинга с протектором. 3 - Тут управляется величина дисплейсинга. Alpha Gain это диапазон дисплейса. Я выбрал 0.150. У вас может быть другая величина, но вот следующая шкала Alpha Offset должна быть ровно в 2 раза меньше чем Alpha Gain да ещё с обратным значением. Иначе, ноль дисплейсинга будет выше или ниже и ваш снег будет глубже чем надо или вообще под колесом. Для этого я уже по привычке использую expression. Щёлкаем правой кнопкой по значению Alpha Offset, выбираем Create New Expression, и в окошке снизу пишем file1.alphaOffset = - file1.alphaGain / 2 и нажимаем Create. Если всё без ошибок, то окошко Alpha Offset автоматом будет выставлять нужное значение при смене диапазона.
Ещё нужно добавить рендермановский атрибут управления дисплейсом. Выбираем атрибут displacementShader1 и следуем по рисунку, чтобы добавить строчки снизу. Значение Displacement Bound это размер воображаемого контейнера дисплейса и это значение должно быть чуть больше, чем Alpha Gain. Если значение будет меньше, то дисплейс не будет помещаться в контейнер и появятся чёрные артефакты, если больше, то добавляется время на просчёт.
У меня получилась вот такая шина:
Всё готово для анимации. Я сделал её с помощью nCloth. Вы можете сделать любым своим способом анимацию шины, которыя падает на снег и немного катится по нему. Можете даже заставить свою покрышку скакать как сумасшедшую так, как вам заблагорассудится или можете сделать их с десяток. Всё равно, при описанном способе все объекты будут оставлять отличные следы, этим и привлекателен описанный ниже метод. Только поверхность, которая будет имитировать снег оставьте на высоте 0.2 Y. Пусть шина во время анимации проникает сквозь него до 0. Вот та область, которая проникает в снег и будет нам нужна для генерации карты дисплейсинга снега. Повторяю, если вы делали анимацию в nCloth, то атрибут Subdiv Scheme нужно прицеплять к outputCloth1.
Всё готово для самого интересного. Сейчас я объясню по какому принципу буду делать мягкий, податливый шине снег. Мы создадим камеру, поместим её так, чтобы она снимала поверхность снега с обратной стороны. Отрендерим анимацию через эту камеру с Z Depth. Этот самый Z Depth мы соберём в анимированную текстуру и применим её снегу как дисплейсинг.
2. Экспорт карты глубины (Z Depth)
Начнём. Создаём новую камеру и называем её "z"
Переворачиваем её по оси Х на 90 градусов
Включаем в Output Settings рендеринг глубины
Ниже во вкладке Orthographic Views отмечаем камеру как ортографическую, тоесть без перспективы, чтоб избежать искажения нашей карты. И ставим значение 40 в Orthographic Width. Это значение не с потолка, это ширина нашей квадратной поверхности снега.
Выбираем в рендер сеттингс 2048*2048 размер изображения. Это будет наш размер текстуры дисплейса снега.
Теперь если в окне проекции переключиться в нашу камеру "z", то мы должны увидеть поверхность снизу, и должен быть видим кусок шины, что проник в "снег". Для уверенности что всё правильно выберите в окне камеры z Camera Settings > Resolution Gate . Появившаяся рамка должна полностью совпадать с поверхностью снега.
Дальше, в настройках рендера, во вкладке Renderable Cameras выбираем нашу камеру Z и ставим галку Depth channel (Z Depth), если не стоит. Во вкладке Quality ставим Shading Rate на 1 и сэмплы например на 6. Чем ниже Shading Rate, тем выше качество. Та пятёрка, что стоит там по умолчанию, сделает наш след не достаточно чётким.
с этими настройками рендерим последовательность в *.iff. Frame padding это формат, в котором пишутся номера кадров. Если стоит 1, то кадры нумеруются 1,2,3,....10,11,12...99,100... это может быть неприемлемо для некоторых программ, такая последовательность может перепутаться и за единицей пойдёт не 2, а 11... Цифра 3 в значении будет записывать имена кадров в трёхзначном формате 001, 002,003.... Следовательно, если в вашей анимации больше 999 кадров, то нужно ставить 4, если больше 9999, то 5. Если меньше 99, то достаточно двоечки.
Рендерим, должна получиться последовательность кадров с глубиной. Поясню лишь, что может возникнуть соблазн убрать на время рендера поверхность, чтобы уменьшить время рендера, ведь нужна только глубина шины, но это не так. Эта поверхность нужна для того, чтобы рендерман брал от неё отсчёт дисплейсинга, не будет поверхности, дисплейс будет в каждый кадр разный ( по крайней мере у меня так было). Можно лишь пойти на хитрость и уменьшить плоскость в размерах, чтобы просчиталось быстрее, но она не должна быть меньше чем область экрана, в котором перемещается шина на протяжении всей анимации. Пусть даже будет чёрный фон при рендере за пределами поверхности, всё равно скрипт, которым мы будем собирать файлы в фотошопе смешает всё темнее глубины поверхости снега, если мы в ручную исправим хотябы 1 кадр в фотошопе. Рекомендую честно отрендерить целое изображение, чтоб не было ошибок. По моим наблюдениям, кадры анимации, где не было видно шины просчитали с ошибкой глубину. Видимо одной только плоскости в кадре не достаточно для корректной работы. Можно было бы конечно добавить элемент который присутствует в кадре всегда и пересчитать, но проще ошибочные кадры просто залить основным цветом позже в фотошопе.
Теперь надо "выдрать" канал с картой глубины из нашей последовательности. Открываем анимацию через утилиту Fcheck (не забываем поставить галочку открывать файл с z depth). Выбирам там View / full rezolution ... (если не выбрать, то картинка экспортируется в уменьшенном размере). После этого нажимаем на кнопку отображения канала Z глубины. И выбираем File / save animation. Теперь можно выбрать tif чтобы это всё спокойно открывалось в фотошопе. Если всё правильно, то получится такаяже последовательность, только в формате tif и без канала изображения. Подозреваю, что это можно было сделать проще, с помощью рендермановской утилиты Sho.exe, но я не знаю как, если кто в курсе, напишите.
3. Создание Action в фотошопе для подготовки анимированной текстуры
Дальше фотошоп. Под рукой нет никого видеоредактора, которым можно было бы это сделать, но всегда есть фотошоп и с помощью нехитрого Action можно сделать другую последовательность текстуры, в которой след от предыдущего места шины не пропадает, а сливается со следом следующего кадра и т.д.
Делаем копию наших кадров с z глубиной в другой папке (на всякий случай). Для записи скрипта открываем фотошопом первый кадр. Дальше внимательно и по-порядку. Убедитесь, что раскладка английская. Нажимаем Ctrl+A на нашем кадре чтобы всё выделить и нажимаем Ctrl+C, чтобы это скопировать. После, нажимаем во вкладке Actions кнопку создания нового Action.
Даём любое название в появившемся окне, например convert. Нажимаем record. Отныне идёт запись ваших действий, о чём символизирует красная кнопка на панельке Actions. Дальше нажимайте следующее: Ctrl+V (вставляется то, что вы скопировали в буфер), меняйте режим смешивания получившегося слоя на Lighter Color.
Дальше жмите во вкладке Layers / Flatten image (это сведёт слои в один). Ctrl+A (выделить всё), Сtrl+C (скопировать в буфер). Закройте кадр и согласитесь сохранить его. На вкладке Actions нажмите стоп. Экшн готов. Теперь идёте во вкладку File/Automate/Batch. Открывается окно. В нём уже должен быть выбран ваш Action с названием Convert. Кнопкой Choose, указываете папку с файлами, над которыми вам придётся глумиться и нажимаете ОК. Теперь файлы должны автоматически по порядку открыться и применить к себе те действия, что вы записали. Получилась анимированная последовательность карты дисплейса для снега.
4. Завершение
Теперь пора сделать снег с этим дисплейсом. Создаём шейдер снега, по вашему усмотрению. Дисплейс присоединяется по тому же принципу, что и тот, на покрышке. За исключением некоторых моментов. Также, к строке Displacement map шейдер группы вашего материала снега прикрепляем нод file. Получился нод file2. Ниже показаны настройки. 1 - фильтр сглаживания текстуры, на этот раз на опытах показался приемлемым именно этот вариант. 2 - сюда прикрепляете первый кадр вашей tif-последовательности, которую сгенерил batch в фотошопе. 3 - ставите галочку Use Image Sequence, которая включает использование всей последовательности. Автоматически создаётся expression на Image Number, который подгружает необходимый кадр вашей карты, в зависимости от того, на каком месте ваш слайдер анимации. 4 - Тут придётся задать отрицательное значение диапазона дисплейса, почему? Потому что на нашей с вами Z Depth карте дисплейс получился в негативе. Если оставить положительное значение, то следы от шины будут наизнанку выпячиваться из снега. 5 - уже знакомый expression, который делит значение Alpha Gain пополам и присваивает обратное значение. На этот раз он выглядит как file2.alphaOffset = -file2.alphaGain / 2. Не забываем добавить рендермановский атрибут дисплэйсмента, как мы делали на примере с покрышкой.
Дальше придётся отразить карту file2, иначе следы будут не под колесом, а зеркально. Смотрите рисунок ниже. Хотя возможно вам это и не понадобится, или нужны будут другие значения. Для опытов я возвращал во вкладке Quality настроек рендермэна на значения Shading Rate 5 и Pixel Samples 3. Эти значения хоть и не позволяют рассмотреть деталей, но помогают быстро сориентировать карту, выполняя тестовые рендеры.
Дальше, создайте освещение на своё усмотрение. Только не забывайте к источникам света добавлять рендермановский атрибут, как показано на картинке снизу и включать во вкладке Shadows тени Depth Map Shadows. Этот Extra RenderMan Attrs включает родной и очень качественный и быстрый алгоритм просчёта теней DeepShadow. Есть и другие варианты, как например Custom Shadow Map, где можно более гибко настраивать тени используя запекание, группы и другие параметры, но урок не об этом, сейчас уже пришла пора рендерить.
Не забудьте во вкладке Quality поставить значения Shading Rate 1 и Pixel Samples на этот раз 10. При таких настройках следы будет видно гораздо лучше.
В конечном итоге у меня получился вот такой ролик.
Надеюсь вам это принесло пользу, ведь уроков по RenderMan катастрофически не хватает, а результаты, на какие он способен, мы с вами много раз видели. Спасибо за внимание, успехов в постижении новых горизонтов!