Автоматизируем рутину продуктового рендеринга (3Ds Max, Photoshop, Javascript)

В этой статье я хочу поделиться с вами решением одной, на первый взгляд, тривиальной задачи.

Представьте, что вам необходимо сделать рендеры, к примеру, такой вот тумбочки под телевизор (или как там это правильно называется?) в разных цветах и разных размеров. Всего для данного продукта существует 6 цветов и, допустим, 15 размеров.

Над каждым файлом на выходе нужно провести некоторый цикл постобработки в Adobe Photoshop и дать файлу корректное название в формате:

VOLO_tvset_40x150x60_front.A902_Super_blue.jpg
VOLO_tvset_40x150x60_front.J993_Yellow.jpg
,где длинная концовка после обозначения ракурса вроде A902_Super_blue является артикулом того или иного цвета и задается заказчиком.

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

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

Поэтому и возникает потребность в хотя бы частичной автоматизации процесса.

Приступим!


Шаг 1. Анимируем материал в 3Ds Max.

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

Пример материала ниже сделан для V-Ray, но принцип подходит и для других рендеров.

Анимированный материал в V-Ray

Каждый слой узла Composite соответствует определенной текстуре (цвету). Изначально, все слои должны быть видимыми и иметь режим наложения Normal.

Далее переходим в режим анимации Auto Key и начинаем выключать слои сверху-внизу, передвигая при этом ползунок таймлайна, чтобы каждый кадр соответствовал новому нижележащему слою.

Таким образом, в нулевом кадре будут видны все слои, в первом выключен самый верхний и так далее.

Рендерим полученную анимацию (не забываем про рендер элементы RGB_color, VRayLighting, VRayReflection, VRayWireColor), на выходе получаем набор всех выбранных рендер элементов вроде этого:

Кадр 1
VOLO_tvset_40x150x60_front.RGB_color.0000.jpg
VOLO_tvset_40x150x60_front.VRayReflection.0000.jpg
VOLO_tvset_40x150x60_front.VRayRawLighting.0000.jpg
VOLO_tvset_40x150x60_front.VRayWireColor.0000.jpg
Кадр 2
VOLO_tvset_40x150x60_front.RGB_color.0001.jpg
VOLO_tvset_40x150x60_front.VRayReflection.0001.jpg
VOLO_tvset_40x150x60_front.VRayRawLighting.0001.jpg
VOLO_tvset_40x150x60_front.VRayWireColor.0001.jpg
И так далее…

Рендеры продукта в разных цветах имеют почти корректные названия, остается только заменить номер кадра0000–N на артикул соответствующий краске в каталоге поставщика и провести постобработку.

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

Давайте попробуем автоматизировать переименование файлов при помощи JavaScript и Photoshop, а заодно и проведем автоматическую постобработку.


Шаг 2. Создаем Action.

Для понимания дальнейшего материала потребуются базовые знания Photoshop и записи Action.

Допустим, нам необходимо провести небольшую коррекцию отдельно на продукте и на фоне. На продукт мы наложим VRayRawLighting в режиме Overlay с некоторой прозрачностью по вкусу, затем VRayReflection в режиме Linear Dodge, Bleach Bypass при помощи фильтра Color Efex Pro 4 (Nik Collection) и слегка повысим резкость с помощью родного фильтра High Pass.

Чтобы не затрагивать фон, нам нужна маска для продукта. Здесь и пригодится VRayWireColor (перед рендером необходимо назначить продукту белый цвет, а фону черный — делается это в разделе Name and Color под примитивами).

На фон мы наложим требуемый цвет в режиме Darker Color чтобы выровнять лишний шум и сделать фон максимально однородным.

Получается следующая структура:

А вот результат постобработки:

Выкрутим кривые, чтобы проверить однородность фона:

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

Напрашивается простое решение — записать экшен (Action), воспроизводящий все эти действия за нас.

Все бы хорошо, но экшеном невозможно автоматически открыть рендер элементы соответствующие уже открытому RGB_Color, по крайней мере мне такие возможности неизвестны.

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

Для этого нам и нужно написать скрипт, который бы подготовил нужную структуру слоев для работы, а экшен уже сделал бы все остальное.

Поэтому, уже имея план действия для постобработки в голове, откроем требуемые файлы и создадим вручную необходимую нам структуру:

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

Отмечу только один важный момент — все действия должны быть универсальными, то есть не привязаны к конкретным именам слоев.

Поэтому навигацию по слоям лучше проводить при помощи горячих клавиш:

Alt+[ — опуститься на слой ниже

Alt+] — подняться на слой выше

Для выделения нескольких слоев используются те же сочетания с зажатым Shift’ом.

Сохраните записанный экшен и убедитесь, что он открыт в Photoshop.


Шаг 3. Пишем скрипт.

Для понимания дальнейшего материала потребуются базовые знания JavaScript.

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

Важно отметить соответствие номера кадра и номера соответствующей краски в массиве элементов:

var paintsArr = [
"A902_Super_blue", // для кадра 0000
"F148_Ivory", // для кадра 0001
"J993_Yellow", // для кадра 0002
"D021_Brownie", // для кадра 0003
"N820_Pale_Rose", // для кадра 0004
"L808_Cyan_Breeze" // для кадра 0005
];

Рассмотрим пример. Кадр

VOLO_tvset_40x150x60_front.RGB_color.0000.jpg

имеет краску “A902_Super_blue”, поэтому нулевым элементом массива paintsArr должна быть именно эта строка. И так далее для всех красок, которые мы зарендерили при помощи анимированного материала.

Принцип формирования массива артикулов красок

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

Запускаем скрипт в Photoshop через меню File-Scripts-Browse, выбираем папку с файлами и получаем следующий результат:

Результат работы скрипта

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

Потратьте немного времени и постарайтесь вникнуть в этот скрипт, возможно, вы найдете ему множество полезных применений.

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

Успехов!

Знаете как можно сделать оптимальнее/лучше? Обязательно пишите в комментариях :)

Понравилась статья? Поддержите меня на Behance

P.S. Полезные ссылки:

Официальная документация по скриптингу от Adobe

https://www.javascript.com/ — поможет вникнуть в JavaScript, есть интерактивные упражнения для новичков.

https://jsfiddle.net/ — удобный сервис, позволяет тестировать и делиться скриптами JavaScript. Само собой нельзя использовать функции Photoshop :)