![Скриншот лицевого рига персонажа[1] на основе процедурной генерации текстуры Скриншот лицевого рига персонажа[1] на основе процедурной генерации текстуры](https://habrastorage.org/r/w1560/getpro/habr/upload_files/db3/5f7/8db/db35f78dbc727398f1f6737702b02c36.png)
Как правило, когда дело доходит до реализации 2D лица персонажа, в Blender 3D, много кто сразу пытается создать систему на основе булевых операций. В Blender подобное можно реализовать при помощи модификатора Boolean, но это не совсем верный подход с точки зрения оптимизации, пускай и самый легкий. Все из-за нестабильной работы самого модификатора Boolean. Конечно же, с каждым обновлением Blender становится все более совершенным, но… при большом количестве разных эмоций (которые представляют собой mesh и зачастую содержат модификатор Subdivision), вычислительная нагрузка довольно большая, особенно на маломощных ПК. У такого подхода требуются достаточно долгие расчеты и сотни, а иногда даже и тысячи полигонов для качественного отображения одной эмоции. Все это в совокупности увеличивает шанс критической ошибки и банального «вылета» программы без сохранения прогресса (особенно неприятно, когда анимация содержит свыше 1000 кадров и рендер экстренно завершает работу).
В отличии от «Boolean системы» (назовём ее так), процедурные текстуры призваны минимизировать случаи критической ошибки. Разумеется, они требуют немного больше памяти GPU, но это настолько критически мало, по сравнению с масштабами рендера большинства тяжелых сцен, что лучше отдать предпочтение процедурным текстурам. При этом вы не потеряете в качестве визуальных эффектов, а даже сможете его улучшить. Эта система работает довольно стабильно, но иногда Blender может «вылетать» (особенно при использовании ядра Vulkan, но это редкость).

Наверняка уже возник вопрос: как это работает? Конкретно в этом проекте, я отталкивался от свойств кругов Эйлера. Самые банальные операции сложения и вычитания множеств дают просто потрясающий результат! И более того, текстура не имеет своей плотности пикселей! То есть при бесконечно большом приближении текстура всегда будет оставаться гладкой, что согласитесь несколько избыточно для анимации, но это скорее приятный бонус, чем необходимость. И так как эта система буквально результат математических действий, то она намного легче обрабатывается программой, в отличии от «Boolean системы», которая изменяет топологию mesh сетки. По крайне мере, по моим личным наблюдениям, это более рациональный подход к распределению ресурсов во время рендеринга (точных измерений производительности я не составлял). И если у вас дома стоит компьютер NASA, то можете не читать дальше эту статью: я предлагаю решение для среднестатистических характеристик ПК и ноутбуков на момент 2024-2025 года.

Это система не полная замена классическим булевым операциям, но она отлично дополнит систему rig глаз персонажа. Тут надо сделать важные замечания: система идеально подойдет для анимации на плоских и слабо искривлённых поверхностях (на более сложных формах возможны изменения пропорций или полное не предсказуемое искажение), идеально подойдет для анимации 2D глаз (например, для «ядра» из сериала «Murder Drones» от студии Glitch Productions), отлично подойдет для работы с простыми формами (брови, зрачок и тд).

И тут мне кажется, пора перейти к минусам: самое важное, это конечно же работа с простыми формами, как бы это парадоксально не звучало. Проблема не в том, чтобы создать нужную эмоцию, проблема в последующей настройке анимации — комплексные формы достаточно сложно изгибать привычным перемещением костей. Из‑за своей сложности, система не может похвастаться такой степенью свободы, как у классического метода с Boolean. Кроме этого, такая система с процедурными текстурами не имеет универсальности, в каждом новом проекте ее придется настраивать заново с полного нуля. Ну конечно же, можно создать «заготовки» по типу овалов, может быть бровей или чего‑то подобного, но все равно логику работы драйверов внутри материала придется создавать для каждого проекта отдельно. Эту систему нельзя использовать за пределами Blender 3D, так как она несовместима с другими программными 3D пакетами. Эта система несовместима с инструментом Grease Pencil.
Однако, эта система, как мне кажется, удобна для анимации простых 2D эмоций. Разумеется, на просторах интернета (в том же YouTube или RuTube) есть обучающие видео по созданию 2D рта или, например, логотипа соцсети «ВКонтакте». Эта система - не новшество в 3D. Работа была посвящена конкретно моделям из веб анимационного сериала «Murder Drones» от судии Glitch Productions. Я не нашел ни одной 3D модели в свободном доступе с подобной системой и решил доказать, что такой подход имеет право на жизнь и он в каком-то смысле даже лучше, чем система на основе модификатора Boolean. Безусловно, использование исключительно такой системы с процедурной генерацией из математических формул накладывает определённые ограничения (которые были описаны выше), и я не призываю использовать только «математику». Эта всего лишь дополнение, которое может помочь оптимизировать некоторые задачи или решить проблему растяжения мешей при их перемещении, так как классический модификатор Shrinkwrap работает не всегда корректно. Конечно же, моя работа[1] это не конечный вариант. Это своего рода эксперимент. В процессе разработки я буду стараться создать более «дружелюбную» и понятную для реализации систему.
Хочу высказать отдельную благодарность моему другу Hard imagine. Именно он дал мне надежду, что такая система, основанная на математике, может применяться в подобных проектах. Ссылка на его YouTube обучающее видео[2].
P.S. Эту 3д модель я создал по уже существующему концепт арту[3] и 3д модели[4].
Ссылки на используемые источники:
[1] https://www.renderhub.com/heimerdinger/quadric-assault-robotic-detonator
[2] https://youtu.be/n6_IM0SkY_U?si=m3IcXL3J6V4niT9t