Перья для маски жрицы Деркето
Поделюсь своим способом создания перьев для маски жрицы Деркето. Это не обучающая статья, а просто заметки о персональном проекте. Уверена, что многие из Вас придумали бы способ лучше, проще и быстрее. Никогда до этого не было необходимости делать перья. И не просто перья, а огромные яркие пушистые перья, которых в реальной жизни возможно и не существует. Поэтому весь процесс был максимально интуитивный и творческий. Для меня перья - это волосы птицы, А волосы - это добро пожаловать в Maya XGen.
И так, во-первых, я создала очень узкий плэйн (скрин 1.), из которого планировала направить будущие волоски в сторону имитируя половину пера. Генерировала волоски через Interactive Groom Splines (скрин 2.) Идея была создать не очень длинные, тонкие и довольно гнущиеся волосинки (скрин 3.), которые легко бы направлялись и пушились. Всего перьев было 4, показываю на одном. Сгенерированные волоски модифицировала (скрин 4.). Зачесала в одну сторону. Верхнюю часть чуть наверх, среднюю часть просто вбок. А нижнюю скруглила вниз (это был один sculpt layer скрин 5.). На следующем sculpt layer я заморозила самые близкие волоски к стержню пера, инвертнула заморозку и аккуратно приподняла у основания (скрин 6.), чтобы перо не было очень плоским. Дальше применила чуть-чуть Clump и Noise. Вот половина пера и готова.
Далее я повторила все тоже самое, но уже в другую сторону. Полученные половинки сдвинула (скрин 7.) ближе друг к другу и в середине добавила узкий плейн для сердцевины пера, чуть более широкий у основания и сужающийся к концу (скрин 8.). И сразу, на будущее продублировала сердцевину и добавила ей толщину (скрин 9.). Получилось целое перо. Второй этап - это преобразование сгенерированных волосков пера в самостоятельный объект для экспорта и дальнейших модификаций. Для начала сделала конверсию (скрин 10.) и получились такие серые плашечки. Так как я хотела чтобы каждая волосинка пера запеклась адекватно, нужно было направить все UV в одном направлении. Для этого я просто открыла UV editor (скрин 11.) Разложила Layout Along по U (скрин 12.) Все волоски упали в одну стопку, что не хорошо – поэтому далее модифицировала через Normalize (скрины 13-14.). Это позволило разложить каждую волосинку пера в правильном направлении сверху вниз, максимально плотно в один UV квадрат. Именно этот этап позволит сделать такие карты как Root, AO, Flow уникальными и рабочими.
На этом этапе я продублировала меш пера. Исходный меш переименовала по номеру пера, а копии добавила толщину (скрин 15.) и назвала соответственно - перо с толщиной. Это необходимо для адекватной Normal map и Thickness. Далее создала плашки (скрин 16.) которые и будут перьями. Волоски пера и сердцевина располагается строго над лоупольной версией пера. Делала в режиме просмотра сверху, чтобы максимально эффективно использовать пространство LOW. После этого сделала UV LOW перьев (скрин 17.). Тут все обычно. Напоминаю, что у меня было 4 пера и соответственно вышло 4 UV шелла. Проверила чекером, чтобы не было потягов. После того, как готова UV для LOW перьев продублировала LOW плашки и сделала из копии LOW на которых буду запекать карту высот. Назвала соответственно – LOW_High. Эти LOW разместила так, чтобы они были в середине соответствующего пера (скрин 18.).
Следующий этап - это разделение каждого пера (с толщиной) внутри на группы, чтобы каждая волосинка была рандомизирована по цвету. Это актуально при создании Color map. Обычно волосы делят на 4-5 таких групп. Это зависит от густоты пряди и художественных потребностей. Чем больше групп – тем больше разнообразия. Но не стоит увлекаться, чтобы результат не выглядел сумасшедшим. Для моих потребностей было достаточно 3 группы. Группа 50% содержит половину всех волосков, вторую половину я еще раз поделила пополам, соответственно по 25% от общего числа. Полученные группы назвала: Group_50, group_25 и group_25.2. Возможно существуют специальные аддоны, позволяющие разделить все волоски рандомно по группа, но я пошла по пути страдания и использовала кастомный код:
import maya.cmds as cmds
import random
def create_subgroups_by_percentage(percentage):
"""
Create subgroups from selected objects based on the given percentage.
Args:
percentage (float): The percentage of objects to include in each subgroup.
Should be between 0 and 100.
"""
# Validate percentage
if percentage <= 0 or percentage > 100:
cmds.error("Percentage must be greater than 0 and less than or equal
to 100.")
return
# Get selected objects
selected_objects = cmds.ls(selection=True)
if not selected_objects:
cmds.error("No objects selected.")
return
# Calculate the number of objects per subgroup
total_objects = len(selected_objects)
num_in_subgroup = int(total_objects * (percentage / 100.0))
if num_in_subgroup == 0:
cmds.warning("Percentage too small to create a subgroup. No subgroups
created.")
return
# Shuffle the objects for randomness
random.shuffle(selected_objects)
# Create subgroups
remaining_objects = selected_objects[:]
group_count = 1
while remaining_objects:
# Extract a subgroup
subgroup = remaining_objects[:num_in_subgroup]
remaining_objects = remaining_objects[num_in_subgroup:]
# Create a new group for the subgroup
group_name = f"subgroup_{group_count}"
cmds.group(subgroup, name=group_name)
group_count += 1
cmds.confirmDialog(title="Subgroups Created",
message=f"Subgroups successfully created with ~{percentage}% of
objects each.")
# Example usage: Set the percentage and run the function
# You can call this function interactively in Maya with a percentage of
your choice
create_subgroups_by_percentage(50) # Example:
Creates subgroups with 30% of objects in each
Таким образом к экспорту у меня были готовы: 4 пера хайполи; 4 пера хайполи с толщиной; 3 группы рандомизированные по 50%, 25% и 25%; группа лоуполи перьев; группа лоуполи перьев для запекания высот (скрин 19.). Запекала карты в XNormal. Для запекания Alfa я загрузила хайполи и лоуполи в разделе High definition meshes. Для базовых текстур использовала абсолютно белый фон для хайполи файлов, и абсолютно черный - для лоуполи (скрин 21.). В Low definition meshes загрузила ту же самую лоуполи. А также увеличила Ray distance до 50 (скрин 22.). В Baking options (скрин 23.) назначила Output. Для каждой отдельной текстуры надо было менять название. Выставила желаемый размер будущей текстуры и выбрала какой тип текстуры мне необходим из списка.
Таким же образом я запекла карту Root. Но удалила из High definition meshes лоуполи перьев и заменила базовые текстуры на карту gradient_root. Я уже не первый раз использовала XNormal для запекания карт волос, поэтому у меня уже есть набор базовых текстур для запекания (скрин 20.). Я радовалась как ребенок, когда увидела, что карта Root запеклась так, как хотелось. Темнее у стержня пера и светлее на кончиках для каждого волоска. Поэтому и был важен этап подготовки UV каждого волоска.
Далее запекала карту для уникального цвета по группам. Для этого в High definition meshes удалила все мешки и загрузила мешки по группа 50-25-25% и в базовые текстуры им добавила серые карты со скрина 20: 50, 25, 15. Лоуполи оставила ту же.
Для запекания карты Flow я использовала тот же сет хайполи, но заменила вариативные серые базовые текстуры на базовую текстуру для Flow со
скрина 20. Для корректного отображения ивертнула красный канал в фотошопе (скрин 25.).
Для High map использовала так же предыдущий сет хайполи. Но в настройках экспорта карт выбрала запекание Hight map. После запекания всплывает такое окошко, где можно подвигать ползунки для настройки максимально вариативного результата. Чтобы задний план не был сильно темным, а передний слишком светлым.
Normal map и AO запекала в Marmoset c использованием хайполи меша перьев с толщиной.
Дальше была креативная работа в фотошоп по созданию уже финальных текстур для рендера в Marmoset. Часть запеченных текстур, таких как Normal map, Flow использовались в оригинале. А Color map, Specular – собирались из разных комбинаций запеченных карт