
Значительную, если не самую главную, роль в сфере разработки динамических мышечных систем играют плагины, интегрирующиеся в пайплайн какого-либо софта. В рамках Maya и Houdini поддерживаются Ziva VFX и Adonis FX.
Ziva VFX
Ziva VFX представляет собой профессиональный плагин для создания анатомически точных симуляций мягких тканей, который революционизировал подход к созданию реалистичных персонажей в индустрии визуальных эффектов. Его фреймворк симуляции основан на методе конечных элементов (Finite Element Method). Изначально разработанный компанией Ziva Dynamics, плагин прошел сложный путь переходов: после приобретения технологий компанией Unity в 2022 году, в 2024 году произошла эксклюзивная продажа активов Ziva VFX студии DNEG. Этот стратегический переход сделал DNEG единственным владельцем лицензий на плагин, существенно ограничив доступность инструмента и документаций к нему для широкого рынка и превратив в эксклюзивный инструмент для внутреннего производства.
Детализированный рабочий процесс
Фаза 1: Подготовка скелетной системы и анимации Процесс начинается с тщательного моделирования геометрии скелета персонажа, где стандартная T-поза адаптируется под специфические требования проекта. После завершения моделирования применяются анимационные данные, которые экспортируются в формат Alembic для последующей интеграции в пайплайн Ziva VFX. Импортированные обратно в Maya кости преобразуются в специализированные Ziva Bones — кинематические объекты, которые служат основными драйверами для решателя Ziva и определяют базовое движение персонажа.
Фаза 2: Построение мышечной системы Мышечные структуры обозначаются как Ziva Tissues — объекты ткани, динамика которых симулируется солвером на основе движения скелета. Для ускорения процесса может использоваться Ziva Anatomy Transfer — автоматизированная система подгонки готовых анатомических setup под новую геометрию кожи. Критически важным этапом является создание системы креплений:
— Фиксированные соединения (Ziva fixed attachments) — обеспечивают жесткое крепление мышц к костям с настраиваемой жесткостью — Скользящие соединения (sliding attachments) — имитируют естественное скольжение тканей по поверхностям костей и других анатомических структур
Фаза 3: Реализация мышечного сокращения Для достижения анатомически корректного сокращения используется автоматизированная система Muscle Fiber в сочетании с инструментом Line of Action. Этот подход позволяет:
— Создать ориентированные поля мышечных волокон — Автоматически рассчитывать моменты и интенсивность сокращения — Достигать естественного сокращения мышц без ручной работы аниматора. Инструмент Line of Action анализирует расстояние между точками на анимированной кривой, определяя фазы сокращения и расслабления мышечных тканей.
Фаза 4: Создание жирового слоя и кожи Жировой слой формируется как объем между внутренней фасцией (2D-поверхность, окружающей мышцы и кости) и внешней кожей. Технологический процесс включает:
— Создание фасции через «усадку» Ziva Cloth с использованием атрибутов rest scale и pressure — Формирование «перчатки» кожи/жира путем соединения открытых концов с соответствующими точками фасции — Создание герметичного объемного объекта с последующей генерацией тетраэдральной сетки (Ziva tet mesh)
Фаза 5: Многоуровневая симуляция и интеграция Финальный этап предполагает каскадную симуляцию всех систем:
— Мышцы симулируются на основе Alembic-кеша анимированных костей — Полученные мышечные деформации используются как входные данные для симуляции жирового слоя — Слои жира преобразуются в единый объект ткани для финальной симуляции поверх закешированных мышц и костей
Такой многоуровневый подход обеспечивает точное воспроизведение биомеханических взаимосвязей между костями, мышцами и жиром, создавая беспрецедентный уровень реализма в динамике персонажей. Результатом становится полностью симулированный персонаж с фотореалистичной вторичной анимацией, сохраняющий анатомическую достоверность даже при самых сложных движениях.
Результат считается эталоном анатомической точности и максимально близок к гиперреализму.
Adonis FX
AdonisFX — это относительно новый плагин, который только набирает свою популярность в сфере CFX и который тоже поддерживается и в Maya, и в Houdini. Он очень похож на Ziva, так как они оба заточены на решение одной и тоже задачи. Однако AdonisFX использует иной фреймворк симуляции, чем Ziva, за счёт чего он может работать гораздо быстрее Ziva. Кроме того, AdonisFX имеет такие солверы, как AdnSimshape, которых нет в Ziva, и которые предоставляют уникальный способ создания лиц с реалистичной динамикой. AdonisFX также имеет целый набор локаторов, которые можно использовать для отслеживания и отладки активации мышц. Ziva может просчитывать коллизии и имеет инструменты для тетраэдризации моделируемых объемов, в то время как в AdonisFX ни того, ни другого пока нет.
ADN vs Ziva. Samah Ibrahim
Однако то, что Ziva находится в исключительной собственности DNEG, делает Adonis гораздо более предпочтительным вариантом для внедрения в свой пайплайн в контексте создания динамической мышечной системы.
Далее будет детально описан процесс работы в связке Maya + AdonisFX в формате туториала.
Мышечная система AdonisFX — туториал
Подготовка:
В рамках туториала сконцентрируемся на мускульной и суставной структуре руки, а именно на части грудной клетки, ключице, лопатке, плече, предплечье, запястье и пальцах. Базой будет являться цельная геометрия скелета руки от лопаток до пальцев, а также заранее смоделированные отдельные мэши мышц. Геометрия скелета может состоять и из составных частей, однако позже это может привести к сложностям из-за возникающих коллизий мэшей.
Для геометрии скелета необходимо создать риг, который будет задействовать все кости и все возможные движения, которые кости могут совершать: сгибание и разгибание, пронация и супинация суставов. Это говорит о том, что кроме основных джойнтов рига стоит сделать ещё дополнительные джойнты, повторяющие локтевую и лучевую кости в предплечье. Кроме того, стоит сделать дополнительные джойнты у плечевого и локтевых сустава, к которым в дальнейшем будут констрейниться локаторы, определяющие степень активации мышцев. Привязываем геометрию скелета к ригу с помощью skinCluster и заранее делаем анимацию движения руки, чтобы в дальнейшем на ней проверять работу мышц.
картинки
Касательно геометрии мышц — детальность проработки всех мышц и их общее количество будет влиять на производительность всей симуляции. Имеют место быть некоторые обобщения и упрощение: к примеру часто могут не прорабатываться внутренние мышцы, иногда прорабатываются не все мышцы в угоду большей производительности, иногда могут сливаться в единые формы множество маленьких мышц. Однако важно соблюдать баланс между технической эффективностью и желаемым реализмом.
В моём случае представлен следующий список мышц:
Далее следуют заранее подготовленные три геометрии, обозначающие слой фасции, слой жира и слой кожи. Фасция практически полностью совпадает с мышцами. В это же время слой жира должен накладываться сверху слоя фасции, и то, на каком расстоянии находятся эти два слоя, будет определять толщину жирового слоя в симуляции. Наконец, на слое кожи будет отрабатывать вся симуляция.
картинки
Пойдём последовательно по всем мышцам, начнём с плечевой мышцы (brachialis).
Для начала создаём локатор через AdonisFX —> Create —> Locator —> Distance между двумя передними джойнтами у плеча и локтя, которые предварительно создавались для размещения локаторов Adonis. Называем этот локатор L_arm_flex_adnLocatorDistance (добавляем префикс в самом начале). Далее выбираем этот локатор, и создаём на нём сенсор также через AdonisFX —> Create —> Sensor —> Distance. В настройках атрибутов также меняем название, и после этого там же в окне Remap Distance в Output проверяем текущее значение дистанции. В Input Min Distance будет автоматически вписано максимальное значение этой дистанции, а в Input Max Distance нужно будет вручную вписать минимальное значение, которое можно проверить в Output’е, прокручивая анимацию в поисках минимального значения расстояния. Теперь можно увидеть, как меняется цвет этого локатора в зависимости от значения, которое он принимает, и соответственно в зависимости от положения плеча и локтя относительно друг друга.
Для создания солвера мышцы (Muscle Solver) в AdonisFX на плечевую мышцу (brachialis) необходимо использовать пункт Create —> Solvers —> Muscle. В атрибут эдиторе солверу присваиваем префикс L_brachialis, после чего настраиваем его параметры.
Можно поменять Scale Attributes в случае, если единицы измерения в Maya не соответствуют реальным размерам геометрии. В поле Gravity устанавливаем значение 9,8, соответствующее ускорению свободного падения. В секции Advanced Settings — Mass Properties выбираем в Point Mass Mode режим By Density, который позволяет задать плотность мышечных волокон в поле Density. Параметр Global Mass Multiplier регулирует вес мышцы с учетом гравитации, в нём ставим значение 0,1. В Dynamic Properties обязательно проверьте галочку на опции triangulate mesh — это нужно для увеличения количества констрейнов, т. к. каждый эдж будет посчитан как взаимосвязь, что в свою очередь повышает качество симуляции. Также проверьте, что опция hard attachments отключена, поскольку ее активация делает крепления слишком жесткими, мешая корректному распределению весов. Использование hard attachments оправдано лишь в исключительных случаях, когда требуется сильная фиксация точки к целевой геометрии.
В Dynamic Properties в Sliding Constrains Mode выбираем Quality, для достижения максимально качественного возможного результата. Максимальное расстояние скольжения (Max Sliding Distance) установим в 1, что позволит каждой точке скользить по цели максимум на 1 см во всех направлениях. Базовая настройка мышцы готова. Теперь выбираем ее, затем выбираем мышцу и нажимаем «Add Muscle Target». Теперь скелет является целью для мышцы.
В Adonis можно прикреплять мышцы и к джойнтам, чтобы работать с мышцами на уровне риггинга, или же к геометрии костей для полного CFX-опыта, а также можно комбинировать эти способы.
После прикрепления мышцы к скелету выбираем мышцу и инструмент «Paint Tool». Рекомендуется отключить коррекцию цвета и включить рентген для лучшей видимости. Все значения распределяемого веса будут указаны приблизительные, отклонения от этих чисел допустимы. Во всех случаях начального распределения веса я использую режим Replace, изредка прибегая к режиму Add во время финальных доработок весов.
В первую очередь распределяем веса влияний по атрибуту Attachments To Geometry. В реальном теле внешняя фасция сжимает мышцы к кости. Для эмуляции этого устанавливаем базовое прикрепление 0.1 с помощью Flood. Если нежелательно сильное сжатие мышц, можно использовать меньшее значение, например 0.01. После этого мы распределяем вес 1 на тех местах мышцы, где она крепится к кости. Далее под брюшком мышцы, где она соприкасается с костью, устанавливаем вес 0.5, чтобы имитировать соединительную ткань между мышцей и костью. Теперь можно проверить, как мышца ведет себя вместе с костью.
Переключаемся на атрибут Slide On Geometry, назначим всей мышце общий вес 0.5 с помощью Flood и «окрасим» нижнюю часть мышцы, которая соприкасается с костью, весом 1, позволяя ей скользить по геометрии костей, но оставляя область сухожилий более свободной.
Переключимся на атрибут Shape Preservation, отвечающий за сохранение формы мышцы. Проставим на всю мышцу вес 1 с помощью Flood.
Затем переключимся на атрибут Tendons, где с весом 1 отрисовываем сухожилия, отмечая их начало и концы. Стоит отметить, что распределение весов сухожилий не влияет напрямую на их прикрепление; они используются в дальнейшем для создания волокон на мышце в атрибуте Fibers.
Переключимся на атрибут Fibers. В настройках солвера мышцы в разделе Debug можно установить масштаб (например, 5) этих волокон и проверить их направление. Они должны стремиться совпадать с топологией мышцы и идти вдоль неё, кистью можно при необходимости «расчёсывать» их, исправляя их направление для обеспечения корректной симуляции.
Теперь подключим мышцу к сенсору. В редакторе соединений сенсоров (Adonis FX —> Sensors —> Connection Editor) в левую часть как source загружаем сенсор L_arm_flex_adnLocatorDistance, в правую — плечевую мышцу. Выход расстояния активации (activationDistance) подключаем к активации мышцы (activation). Теперь этот локатор в зависимости от значения расстояния активирует сокращение плечевой мышцы. После этого по необходимости можно возвращаться обратно к рисованию весов на атрибуте Attachments To Geometry, чтобы вносить изменения в деформации, получаемые под влиянием солвера и сенсора.
Приступим к следующей мышце — это бицепс плеча (biceps brachii). Эта мышца интересна тем, что она прикрепляется не только к костям на концах сухожилий, но и частично к длинной ладонной мышце. Эту взаимосвязь удастся проработать после настройки всех мышц. Также можно заметить, что бицепс плеча скользит по плечевой мышце (brachialis). Кроме того, активация волокон бицепса зависит не только от сгибания локтевого сустава, но и от супинации запястья, что является интересной особенностью для воспроизведения с помощью нодов Adonis.
Если в случае с плечевой мышцой привязка шла в два этапа (сначала применяли солвер мышцы, а потом выбрав геометрию скелета, затем саму мышцу назначили таргет), то в этом случае привязка идёт в один шаг: выбираем скелет, выбираем плечевую мышцу, выбираем бицепс плеча и через AdonisFX —> Solvers —> Muscle создаём солвер. На скелет и на плечевую мышцу автоматически назначатся таргеты.
В настройках солвера мышцы ставим такие же параметры, как и в солвере плечевой мышцы: Gravity на 9,8, Global Mass Multiplier на 0,1, Max Sliding Distance на 1. Поначалу мы будем ставить эти же настройки на каждой мышце, чтобы в дальнейшем вносить изменения в уже собранную систему.
Выбрав бицепс плеча и открыв Paint Tool, можно увидеть, что в каждом атрибуте теперь есть по два влияния, каждому из которых нужно распределить веса. В атрибуте Attachments On Geometry мы распределяем веса влияния скелета, нарисовав значение веса 1 на связках и значение 0,1 на областях мышцы, которые не соприкасаются с областью контакта с плечевой мышцей. В это же время влиянию плечевой мышцы присваиваем значение 0,1 в оставшейся незакрашенной области бицепса плеча, после чего на месте соприкосновения с плечевой мышцой под брюшком распределяем вес 0,5.
Переключимся на атрибут Slide On Geometry. Влиянию плечевой мышцы присваиваем значение веса 0,5 на всю область соприкосновения этих двух мышц, а под брюшком бицепса на месте прямого контакта мышц распределяем вес 1. Влияния геометрии скелета в этом атрибуте конкретно на этой мышце нет, поэтому веса оставляем нулевыми.
Переключившись на атрибут Tendons, закрашиваем области связок, после чего в атрибуте Fibers выравниваем направление волокон.
Наконец, связываем сенсор локатора сгибания и бицепс плеча через Adonis Connection Editor таким же образом, как и связывали плечевую мышцу: соединяем атрибут activationDistance сенсора с атрибутом activation мышцы. После этого можно так же возвращаться обратно к рисованию весов на атрибуте Attachment To Geometry для корректировки весов.
Теперь нужно настроить активацию бицепса плеча и при супинации запястья. Создадим описанным ранее образом локатор, назовём его L_wrist_supination_adnLocatorDistance, следом создадим сенсор и определим минимальное и максимальное расстояние, при котором происходит активация и деактивация соответственно.
Выберем бицепс плеча и откроем его в Node Editor, развернув входящие и исходящие взаимосвязи. Добавим в нодовое пространство шейп только что созданного локатора супинации. Наша задача — соединить работу сенсора сгибания локтя и супинации запястья так, чтобы они оба активировали работу бицепса плеча.
Создаём ноду AdnActivation. В каждый из его входов input в атрибуты value подключаем атрибуты Activation Distance из шейпов локаторов сгибания локтя и супинации запястья соответственно. Внутри самой ноды активации можно выбрать операцию, проводимую над входящими значениями: в нашем случае для input 0 оставляем команду Over, а для input 1 ставим команду Add, чтобы две активации работали вместе.
Если всё оставить теперь как есть, то при отдельной активации каждого из сенсоров бицепс плеча будет сокращаться. Однако если одновременно и сгибается локоть, и проворачивается запястье, то можно заметить, что движение происходит без каких-либо изменений в мышце, так как сейчас при работе обоих сенсоров значение активации мышцы становится 1. Такое поведение нереалистично, поэтому нужно промодулировать значения активации так, чтобы только один сенсор мог приводить значение активации мышцы до 1. Согласно биомеханике мышц бицепс плеча больше включается при супинации запястья, чем при сгибании локтя, поэтому таким сенсором будет сенсор супинации.
Для этого создадим ноду remapValue, в его вход input value подключаем выход activatio distance из шейпа локатора сгибания, и внутри самой ноды меняем значение output max на меньшее. Я в своём случае меняю на 0,3. Теперь бицепс плеча активируется на сгибании частично, а до своего максимального сокращения доходит при вращении запястья наружу.
Продолжаем последовательную работу над каждой из мышц руки. Теперь на очереди трицепс плеча (triceps).
Создадим локатор-сенсор (L_arm_extend_adnLocatorDistance), определяющий расстояние и активацию разгибания локтя по описанному ранее способу.
Применяем солвер мышц на геометрию трицепса и ставим базовые параметры в настройках солвера: Gravity на 9,8, Global Mass Multiplier на 0,1, Max Sliding Distance на 1. Для удобства можно сохранить эти настройки в отдельный пресет через Presets —>Save AdnMuscle Preset, я присвою этому пресету название basic_parameters.
Выбираем геометрию скелета, выбираем трицепс и создаём таргет через AdonisFX —> Muscle —> Add Targets. Открываем Paint Tool и проделываем те же действия, что и с предыдущими мышцами в обозначенных атрибутах:
— Attachments To Geometry: заполняем всю мышцу весом 0,1 через Flood, распределяем значение веса 1 на местах крепления связок к кости и раскрашиваем область брюшка мышцы, соприкасающейся с костью, весом 0,5. — Sliding On Geometry: заполняем всю мышцу весом 0,5 через Flood, закрашиваем область соприкосновения брюшка мышцы с костью значением веса 1. — Tendons: распределяем вес 1 на области связок мышцы. — Fibers: выравниваем направления волокон вдоль мышцы.
После этого коннектим атрибут activationDistance сенсора разгибания и атрибут activation трицепса через Adonis Connection Editor.
Следующая на очереди дельтовидная мышца (deltoid) по своей сборке мало чем отличается от настройки трицепса:
Создаём локатор-сенсор подъёма всей руки (L_arm_elevation_adnLocatorDistance). Создаём солвер мышцы, применяем базовые настройки из сохранённого пресета. Создаём таргет, привязав дельтовидную мышцу к скелету.
Распределяем веса влияния скелета по всем обозначенным атрибутам по всем обозначенным ранее принципам.
Коннектим activationDistance сенсора подъёма и activation дельтовидной мышцы.
Аналогичным образом настраиваем и привязываем к геометрии скелета все оставшиеся мышцы предплечья: плечелучевая мышца (brachioradialis), круглый пронатор (pronator teres), длинная ладонная мышца (palmarus longus), длинный сгибатель запястья (extensor carpi longus), короткий сгибатель запястья (extensor carpi brevis), локтевой сгибатель запястья (extensor carpi ulnaris), поверхностный сгибатель пальцев (extensor digitorum) и в моём случае слитые для простоты в одну единую мышцу остальные сгибатели пальцев.
Настраиваем солверы мышц и распределяем веса влияний на каждый из обозначенных атрибутов покаа без создания локаторов-сенсоров и подключения мышц к ним. Все оставшиеся сенсоры будут созданы позже.
Из примечательного стоит отметить, что после настройки мышц предплечья нужно изменить некоторые взаимосвязи:
Создаём таргет, выбрав единую мышцу сгибателей пальцев, выбрав длинную ладонную мышцу и нажав Adonis FX —> Muscle —> Add Targets. По сути ладонная мышца практически полностью лежит на сгибателях пальцев и соответственно следует всем деформациям той единой мышцы. В свою очередь это означает, что из влияний на эту мышцу можно удалить геометрию скелета. Для этого выбираем геометрию скелета, выбираем длинную ладонную мышцу и используем операцию Remove Targets через Adonis FX —> Muscle —> Remove Targets.
И теперь перераспределяем веса влияния в ладонной мышце по тем же атрибутам и принципам, что и ранее.
Ещё одно изменение — это добавление длинной ладонной мышцы в список влияний на бицепс, так как одна из связок бицепса плеча крепится к этой мышце. Для этого так же используем команду Add Target, и после этого добавляем через Paint Tool соответствующие веса для нового влияния.