Анимация следов на снегу с помощью 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. При таких настройках следы будет видно гораздо лучше.

В конечном итоге у меня получился вот такой ролик.

video sample 736 kb

Надеюсь вам это принесло пользу, ведь уроков по RenderMan катастрофически не хватает, а результаты, на какие он способен, мы с вами много раз видели. Спасибо за внимание, успехов в постижении новых горизонтов!

817 0 850 43
34
2009-03-17
5/5
2009-03-17
молодец. придумал зачтно - это не тока в рмане можно сделать.. кстати как раз скоро надо будет делать подобное... 5 и 5 спасибо
2009-03-17
[quote=Skif] [/quote] угу, конечно не только в рмане. Просто мне самому интересно было именно с его использованием сделать)
2009-03-17
Ай, молодца!!! Ай, молодца! Очень актуально. Я как-то давно применял похожий подход в максе, только для следов от ног, но вот до майки не доходил, а хотелось. 5/5
2009-03-17
Есть ещё идея, использовать вместо камеры снимающей снизу, источник света Direct light с DeepShadow. DeepShadow.tex выглядят также как и канал глубины с камеры. Но вот как перевести *.tex в *.tif для дальнейшей сборки в анимированную текстуру я не знаю. Можно наверняка через MEL с использованием it смешать эти *.tex файлы, но этого я не знаю подавно. А было бы круто... можно было бы прямо в один проход рендерить со следами...
2009-03-18
не читал, но видел, что есть то ,чего не знаю + раньше задавался примерно этим вопросом и не знал, как бы сделать красиво и просто... имхо. respect
2009-03-18
Похоже, это универсальный метод почти для любого редактора. Во всяком случае, в максе это тоже можно сделать, и без рендермана Давно думал как дисплейс грамотно анимировать, 5\5
2009-03-18
намного умнее и удобнее и более универсально было бы сделать не анимированную текстуру дисплейса, а смешать карту дисплейса так чтобы она просто появлялась в нужное время в нужном месте.
2009-03-18
самых замечательных результатов можно добится скульптя следы в zbrush а потом анимируя дисплейс карту способом описаным в предыдущем посте.
2009-03-18
[quote=[hidden]] самых замечательных результатов можно добится скульптя следы в zbrush а потом анимируя дисплейс карту способом описаным в предыдущем посте. [/quote] да? ну в данном случае с одним колесом, конечно. А если объектов много и все они движутся как захотят? ИМХО Сколько времени уйдёт на то "чтобы она просто появлялась в нужное время в нужном месте."?
2009-03-18
[quote=SquaLL] да? ну в данном случае с одним колесом, конечно. А если объектов много и все они движутся как захотят? ИМХО Сколько времени уйдёт на то "чтобы она просто появлялась в нужное время в нужном месте."? [/quote] гм, ну в качестве _маски_ дисплейса можно использовать тот же самый анимированный дисплейс, но без протекторов, можно его даже размыть. а вот сам дисплейс - это последний кадр, когда объект закончил движение. мой метод не лишен недостатка, зато позволяет редактировать дисплейс, чтобы было более реалистично и красиво. можно следы довести до ума в збраше - получится красиво, а потом этот дисплейс анимировать... интересно, как описанный в уроке метод будет работать на неровной поверхности?
2009-03-18
спасибо огромное, очень позновательно [smile=04]
2009-03-18
[quote=[hidden]] [/quote] Да, но мне кажется твой вариант это не замена предложенного мной, а дополнение, ведь всё равно, чтобы получить карту для дальнейшего редактирования её надо сначала просчитать. Конечно, для действительно красивого варианта нужна обработка этого следа, также надо добавить дополнительные эффекты типа частиц снега, налипания, проглядывающего асфальта, и в выводе дисплейса по маске тоже есть свои прелести и удобства, но тогда бы урок был, кажется, длиннее. Я показал лишь метод, а для применения его в реальном проекте конечно нужно дополнительно включать голову и решать задачи наверняка другими способами. :)
2009-03-18
[quote=SquaLL] [/quote] да, именно так. в любом случае 5/5.
2009-03-18
отличный урок 5/5 молодец)
2009-03-18
Спасибо за урок, хоть я и не майщик, оценил все. 5/5
2009-03-19
Всегда очень нравятся необчные и полезные идеи, реализованные самыми простыми средствами. 5/5
2009-03-19
гут 5/5
2009-03-19
Наконец-то и по Maya уроки делают.
2009-03-22
молодец. любые уроки по майке радуют. А етот ваще мозговой - интересно. можно ету идею додумать чтоб со скриптом и в один проход делать. бкдет полезная штука. если будет время(и не забуду) налеплю
2009-03-23
Вместо экшена в фотошопе, можно воспользоваться готовым фильтром Echo в афтер эффекте, для "накопительного" слияния кадров "губины" (в данном случае), отрендерить авишку и наложить как анимированную текстуру дисплейсмента, я так делал в Максе...
2009-03-23
[quote=Mr.DEE] [/quote] Да, конечно можно, но яж написал, если под рукой тока фотошоп)
2009-03-26
Круто! Обязательно сделаю урок!
2009-03-27
отличный урок. спасибо)
2009-03-29
урок просто супер 5\5,хотелось бы тоже самое для 3д макса))
2009-04-16
мне вот интересно, а можно ли этот снег сделать мягким телом и в каком нибудь real flow расчитать симуляцию???...
2009-05-08
Сейчас попробую осилить!
2009-07-27
Мда..докатились....как я считаю хороший урок это урок, который рассказывает как [b]рационально[/b] что-то сделать, затратив [b]минимум ресурсов[/b], и попутная получая технические знания о пакете. Урок, который описывает [b]метод[/b], использующий АЖ 3 пакета(причем не дешевых) вот так....Имхо рациональным назван быть не может. Вот если бы урок был рассказывал как получить подобную карту, используя стандартные средства майки(например как получить текстуру "давления"),попутно бы рассказывая например как работать с гипершейдом я бы оценил. Если бы урок рассказывал как рационально использовать использовать рендерман для выполнения задачи (например про то как хранить поинтклауд/2д текстуру как буффер, или про то как использовать банально окклюжен для выполнения этой же задачи, или про то как использовать CSG операции и т.д) попутно рассказывая про рендерман, например какие-то базовые вещи, я бы оценил. Если бы урок был бы про то как использовать фотошоп для получения анимированного сиквеснса, я опять-таки бы оценил. Но в таков виде в котором он сейчас, это "урок" для каких-то "варезных-умельцев" :) 2/2 только за то что упоминается прман P.S. Ничего против метода или автора не имею, я против того чтобы использовать данный 3хпакетный метод как урок.
2009-07-30
Мда что сказать тяжеловато!!! ИМХО Softimage рулит там кажись с 7 версии следы от любых обьектов делаються за пол минуты нужно только анимировать стопу колесо метеорит - да что угодно! и будет вам Счастье следы любой сложности)))
2009-07-30
P.S И всё это в реальном временни без тормозов!
2009-09-15
Xeash, кто сказал что все должно быть сделано в одной программе? Главное добиться решения поставленной задачи, о количестве программ никто не говорит. Мне лично понравился нестандартный подход. Вместо того чтобы поливать грязью человека, который не поленился потратить кучу времени на написание урока, ты бы лучше сам что-то предложил. Напиши свой "рациональный" урок.
2010-01-17
Есть методы намного проще и не нужно прибегать к сторонним пакетам, например покрыть поверхность тонким слоем FluidEffects и по нему прокатить колесо или пройтись ногой или чем угодно, всё замечательно отпечатается :-) И причём интерактивно, можно поставить разрешение флюидов поменьше и для финального обсчёта побольше :-))
2010-01-17
А вообще урок хороший! Если учесть ещё то что в рендермане дисплэйсмент работает очень быстро...
2010-03-30
[quote=Д_У_Ч] [/quote] да, способов полно разных, но! Каким ещё другим способом можно мять дисплейс дисплейсом? В перечисленных других вариантах, колесо придётся делать геометрией :)
RENDER.RU