МАНУАЛ: ЛИЦЕВОЙ РИГ ПЕРСОНАЖА (WIP)
МАНУАЛ: ЛИЦЕВОЙ РИГ ПЕРСОНАЖА
_______________________________________________________________________________
Здесь представлен подробный гайд по настройке лицевого рига персонажа. Настраивать лицевой сетап персонажа рекомендуется по порядку в соответствии с пунктами ниже. Как результат, на выходе будет получен лицевой риг, так же будет произведено подключения этого лица к существующему боди_ригу в rig_dev ассете и рассказаны особенности сборки персонажа для получения финального анимационного ассета.
_______________________________________________________________________________
1. ИМПОРТ ЛИЦЕВОГО ПРЕСЕТА
Прежде чем начать работу необходимо открыть последний файл из моделлинга, и произвести небольшой клинап. Для этого в окне ригБилдера (РБ) необходимо открыть модуль cleanup, там выделить подмодуль cleaning_hash и кликнуть RUN. Далее, удаляем все, кроме:
- группа for_rig
- группа blendshapes
- геометрические меши в группе geo, которые относятся к лицу (глаза, брови, ресницы, челюсти, язык, волосы, очки и т.п.)
Если нужно освежить память, как вызвать необходимый модуль в РБ, то можно обратить внимание на статью ниже, на графу: создание риг_дев ассета, пункт 2.
https://bookstack.yarko.com/books/rigging-AtN/page/manual-rigging-biped-personaza
Теперь когда сцена максимально очищена от разного мусора и лишних геометрий, нужно импортировать пресет лицевого рига, где уже будут созданы все необходимые контролы, а так же созданы все нужные связи между ними. Импортировать этот пресет можно через РБ, открыв модуль import_face_temp.
Каждое лицо уникально, потому недостаточно просто импортнуть пресет, его нужно подогнать - для этого первая кнопка import helpers модуля import_face_temp импортирует в сцену хелперы. С помощью этих хелперов можно расставить ориентиры, где будут созданы контролы.
Чтобы избежать ошибок при позинге хелперов, полезным будет открыть 1 из существующих лицевых ригов (на момент написания статьи, готовы лица на персонажей doc и vinilion) и посмотреть в каких местах расставлены контролы.
Хелперы следует расставлять аккуратно, в правильные и логичные места на лице. На некоторых хелперах будут скрыты атрибуты вращения - это не ошибка, а умышленное действие, поскольку поворот хелпера будет учитываться при конвертации в контролы. Пример подгонки хелперов, изображен на изображении ниже.
Следующим этапом будет конвертация хелперов в контролы, для этого нужно просто нажать вторую кнопку face adapt в модуле import_face_temp. После этого, работа над подгонкой лицевого сетапа будет почти завершена. Оставшиеся 10-20 процентов будут подгоняться за счет работы с тюнерами, которые будут находиться в группах локальных ригов внутри face_others.
Как работать с тюнерами будет описано ниже, в отдельных блоках посвященных локальным ригам.
Шейпы контролов, к сожалению, придется настраивать вручную, так как хелперы конвертируют только оффсет трансформы
Поскольку данная система лицевого рига имеет локальную основу, каждая часть лица будет выполняться на отдельной геометрии, т.е. вся работа лицевого сетапа выполняется локально - такой подход позволяет удобно работать с ригом, а так же минимизирует время на дебаггинг в случае, если риг нуждается в правках.
Начинать работу будем с локального рига рта - поскольку бленды на уголки рта моделлеры делают на основе лицевого рига. То есть, когда риг рта будет закончен, эта версия рига отправляется в отдел моделлинга, где создают дополнительные корректы под заданные лимиты уголков рта. В это время работа над лицевым риггом не прекращается, а просто выполняются другие элементы лицевого рига (риг век, бровей, доработка рига рта и т.п.). После того, как бленды будут закончены и одобрены - их нужно подключить уже в лицевом сетапе.
Тем самым, все бленды будут готовы. Ниже будут ссылки на статьи по блендшейпам, для того, чтобы можно было самостоятельно проверить все ли бленды присутствуют на геометрии.
https://bookstack.yarko.com/books/modelirovanie/page/blendseipy-licevye-dlia-glavnyx-personazei
https://bookstack.yarko.com/books/modelirovanie/page/blendseipy-licevye-dlia-vtorostepennyx-personazei
_______________________________________________________________________________
2. РИГ РТА
Первое с чего начинаем работу, это с локального рига рта. Выполнять лицевой сетап нужно именно с этого потому, что бленды, которые отдает отдел моделлирования не полные, то есть, бленды, корректирующие уголок рта они выполняют только основываясь на уже лицевом сетапе. Таким образом, нет необходимости "целиться" в положения блендов, а так же не тормозит производственный процесс, так как лицевой риг в работу можно брать не имея бленды.
На старте, нужно сделать 3 копии головы head, что для нас готовят моделлеры, и переименовать их в blends_mouth_geo, lips_minor_geo, mouth_geo, где mouth_geo будет нашей финальной геометрией рта, lips_minor_geo будет нужен для минорных изменений и blends_mouth_geo - под основную настройку открытия рта и деформаций уголков - начинать как раз будем с этой геометрии. Все геометрии перенесем в группу mouth_others, в face_others.
Для позинга внутренних элементов локальных ригов нужно двигать тюнеры. Тюнеры можно назвать внутренними хелперами, с помощью которых можно донастроить лицевой сетап каждой локальной части лица. Тюнеры двигают непосредственно элементы рига, что находятся внутри others групп. Так же внутри имеются группы с констрейнами - все они нужны ТОЛЬКО для позинга - в работе они не нужны - отсюда, после того как тюнеры будут в правильных местах, группу _constraint_tuners_others нужно удалять.
_tuners_group - группы с тюнерами;
_constraint_tuners_others - группа с констрейнами, после позинга должна быть удалена
--------------------------------------------------------------------------------------------------------------------------------------
Внутри 3 тюнера:
1) jaw_main_tuner обычно уже находится в корректном месте - его можно не двигать, однако должен он располагаться в середине между верхней и нижней губой;
2) jaw_pivot_tuner нужно ставить в точку открытия челюсти;
3) tongue_pivot_tuner нужно тоже ставить в точку открытия челюсти.
В силу стилизации, важное замечание:
jaw_main_tuner не всегда нужно ставить в анатомически верное положение
После того, как все тюнеры были расставлены и группа с констрейнами были удалены, необходимо создать пару кривых на верхнюю губу - M_jaw_up_curve, и на нижнюю губу - M_jaw_low_curve. Сделать подобное можно с помощью модуля mouthRig_temp в РБ.
Принцип работы следующий:
1) в окне name пишем название кривой, то есть если мы настраиваем верхнюю губу, то M_jaw_up, если нижнюю, то M_jaw_low;
2) далее на персонаже выделяем соответствующий эйджЛуп от левого уголка рта, до правого. Важно понимать, что эйджлупы нужно брать на рту, которые пересекаются;
3) далее жмем кнопку RUN.
В конечном итоге будут созданы все необходимые кривые и размещены в правильных местах в иерархии групп.
Важно обращать внимание на нейминг, на момент написания статьи все локаторы имеют одинаковый префикс - потому его нужно править вручную, руководствуясь тем, что левые локаторы и кости внутри имеют префикс L, правые R, а центральный - оставить M.
Так же нужно уделять внимание на начало кривых, т.е. направление кривых должны быть одинаковые
Когда кривые настроили, нужно обратить внимание на трансформу face_head_transform. В атрибутах у этой трансформы есть много каналов, каждый из которых уже связан с элементами лицевого рига. Все эти каналы разбиты на группы для удобства. Благодаря этим атрибутам можно не копаться в риге, а сразу настраивать все, что необходимо.
Следующим этапом будет создания скина, как на кривых, так и на геометрии. Наш основной вектор, это при открытие рта попасть в положение блендшейпа открытого рта, который отдают моделлеры. Конечно, точь в точь попасть в положения блендов не получится, однако нужно стремиться к тому, чтобы кривые при открытие рта были почти по форме блендшейпа открытого рта.
Здесь представлены 3 скинКластера на кривые и на геометрию соответственно, а в окне outJoints представлены кости, на которые нужно выполнять этот скинКластер.
А именно:
1) jaw_low_psd_skinCluster - это скин на кривую M_jaw_low_curve;
2) jaw_up_pds_skinCluster - это скин на кривую M_jaw_up_curve;
3) mouth_skinCluster - это скин на геометрию blends_mouth_geo.
Добиться этого могут помочь атрибуты на face_head_transform. Регулировать их нужно когда рот уже открыт на максимум (вкл. limits на контроле M_jaw_control и опускаем рот максимально по оси Y).
CornerX - отвечает за движение уголка рта по оси X при максимально открытом положении рта;
CornerY - отвечает за движение уголка рта по оси Y при максимально открытом положении рта;
CornerZ - отвечает за движение уголка рта по оси Z при максимально открытом положении рта;
jaw_open_ty - отвечает за движение челюсти по оси Y при максимально открытом положении рта;
jaw_open_tz - отвечает за движение челюсти по оси Z при максимально открытом положении рта;
jaw_open_rx - отвечает за поворот челюсти по оси X при максимально открытом положении рта;
jaw_upper_open_tz - отвечает за движение верхней части челюсти по оси Z при движении челюсти вверх;
jaw_upper_open_rx - отвечает за поворот верхней части челюсти по оси X при движении челюсти вверх;
corner_angle - отвечает за угол наклона уголка рта - этот атрибут автоматически настраивается исходя из угла наклона хелпера (см. пункт 1 - этого мануала). Однако его можно регулировать и потом, если при работе появляется необходимость поменять этот параметр.
Как результат (см. картинки ниже), на выходе мы получим максимально приближенный к блендшейпу открытого рта результат основанный только на скиннинге, где выделенные кривые и наш blends_mouth_geo максимально приближены к блендшейпу, что выделен черной сеткой.
При покраске blends_mouth_geo важное замечание, уделять больше вниманию уголку рта, поскольку задача покрасить рот настолько хорошо, насколько это возможно ДАЖЕ С ЭКСТРЕМАЛЬНЫМИ положениями рта (для этого нужно на L(R)_corner_control выключить атрибут limits.
Добиться нужного результата за счет использования только скинКластера не получится, потому нужны корректирующие бленды. Здесь работа делится на 2 части - 1 часть выполняется отделом риггинга, 2 - отделом моделлинга.
Количество блендов на уголки рта лимитировано и они выполняются как на кривых, так и на геометрии, а именно:
-
corner_U
-
corner_D
-
corner_I
-
corner_O
-
corner_UO
-
corner_OD
-
corner_ID
-
corner_IU
-
jaw_open__corner_U
-
jaw_open__corner_D
-
jaw_open__corner_I
-
jaw_open__corner_O
-
jaw_open__corner_UO
-
jaw_open__corner_OD
-
jaw_open__corner_ID
-
jaw_open_corner_IU
Где, U - означает вверх, D - вниз, I - в центр, O - наружу. Префикс jaw_open означает, что рот персонажа открыт в положение открытого рта, которое задается блендшейпом открытого рта.
Так же применяется как на кривых, так и на геометрии корректирующий шейп jaw_open, который был взят для ориентира когда настраивали скин кривых.
Бленды, которые так же будут присутствовать в лицевом сетапе рта, но применяются только на геометрии:
-
jaw_U
-
roll_up_in
-
roll_up_out
-
roll_bot_in
-
roll_bot_out
-
mouth_rotate_L
-
mouth_rotate_U
-
mouth_rotate_D
-
mouth_rotate_R
Исходя из описания блендов выше, необходимо создать блендшейпы на кривых M_jaw_low_curve - jaw_low_psd_blendShape и M_jaw_up_curve - jaw_up_psd_blendShape, и создать на них соответствующие таргеты уголков рта. На геометрии тоже нужен блендшейп - mouth_blendShape, на который следует продублировать таргеты, что есть на кривых, а так же добавить таргеты, которые должны быть, но только на геометрии (см. выше).
Корректы на кривых следует выполнять таким образом, чтобы кривые по ходу движения уголка рта двигались по черепу персонажа - это придаст более реалистичный вид деформациям
Поскольку большую часть корректов, что отдают моделлеры, на начало работы с лицевым ригом уже готовы - их следует подключить к таргетам mouth_blendShape.
Бленды на roll_up и roll_bot отдаются нераздельно, т.е. на нижнюю и верхние части нужно делить уже в риге. Выполняется это с помощью покраски блендшейпа или любым другим известным способом.
Бленд mouth_rotate_R получается путем миррора mouth_rotate_L
Итоговым результатом будет открытие рта и максимально хорошая покраска скина. Далее этот файл передается в отдел моделлинга или руководителю риг отдела, чтобы тот передал это в отдел моделлинга - для дополнительных корректов на уголках рта. Когда бленды будут готовы, их следует подключить/заменить на соответствующие таргеты в блендшейпе mouth_blendShape.

Результат с блендами уголков рта и открытой челюстью
Далее, нужно создать блендшейп с геометрии blends_mouth_geo на геометрию lips_minor_geo, тем самым передадим деформации открытого рта на другой меш лица. Создадим скинКластер для настройки минорных изменений рига рта.
Сами миноры нужны для создания дополнительных форм лица, когда обычные контролы не позволяют передать ту или иную мимику.
Здесь представлен скинКластер на lips_minor_geo, а в окне outJoints представлены кости, на которые нужно выполнять этот скинКластер.
А именно:
lips_minor_skinCluster - это скин на геометрию lips_minor_geo
Красить миноры рекомендую уже в позе, поскольку мимика персонажа должна позволять расширять рот настолько широко, насколько это возможно.
Чтобы миноры следовали за геометрией, нужно настроить uvPin на null группы миноров. uvPin следует цеплять к mouth_geo (эта геометрия будет изменяться, потому миноры будут спокойно следовать за геометрией без возникновения циклов). Однако выходящую матрицу из uvPin я рекомендую декомпозировать через ноду decomposeMatrix и передавать только каналы транслейта, поскольку ротейт в данном случае не нужен.
Однако при движении миноров теперь, будут возникать двойные трансформации, для нивелирования такой проблемы, достаточно создать multiplyDivide ноду, в input1 которой будут входить атрибуты транслейта минора, а в input2 находиться минусовые значения (-1, -1, -1). Выход multiplyDivide ноды следует подключить на группу трансформу между минором и его null группой.
1) L_lips_low_3_minor_control_null - оффсет группа минора
2) L_lips_low_3_minor_control_transform - трансформа минора
3) L_lips_lower_3_minor_control - сам минор
Теперь назначим блендшейп от lips_minor_geo к геометрии mouth_geo. Это будет финальная геометрия рта, соответственно назвать этот блендшейп нужно как minors_final_blendShape. Создадим последние управляющие элементы рига к рту с помощью скинКластера к mouth_geo и назовем его как mouth_final_skinCluster.
Здесь представлен скинКластер на mouth_geo, а в окне outJoints представлены кости, на которые нужно выполнять этот скинКластер.
А именно:
mouth_final_skinCluster - это скин на геометрию mouth_geo
Требования к покраске будут таким же, как и к минорам. Нужно стараться добиваться таких деформаций, чтобы регулируя контролы, можно было добиться максимальной экспрессии.
Иногда полезно будет использовать деформер deltaMush, который позволит выровнять местами сетку. Однако следует помнить, что больше 10 smoothing iteration ставить нельзя, поскольку на больших значениях deltaMush с удовольствием скушает не мало fps
На данном моменте лицевой сетап рта считается законченным и геометрию mouth_geo можно подключать через блендшейп к геометрии head_final_geo и переходить к другим локальным ригам.
_______________________________________________________________________________
3. РИГ ВЕК И ГЛАЗ
Для создания локального рига век нужно будет использовать 3 геометрии: eyes_geo - геометрия, на которой будут деформации внутренней границы века; eyes_outer_geo - геометрия, на которой будут деформации внешней границы века; eyes_final_geo - финальная геометрия, на которой будет финальный скейл век и подключенные eyes_outer_geo и eyes_geo, через блендшейп.
Геометрию eyes_geo обычным дубликатом не получить, потому начинать работу нужно с геометрией блендшейпа закрытого глаза closed_eyes.
Выделим геометрию closed_eyes и подвинем тюнеры век в группе lids_tuners_group/internal_tuners_group по границе линии смыкания век. Тюнеры подгонят необходимые элементы для риггинга век в нужные места, после их подгонки нужно удалить группу lids_constraint_tuners_others.
Тюнеры век не стоит ставить куда попало, нужно руководствоваться простой логикой:
1) L_lids_corner_out_tuner и L_lids_corner_in_tuner ставятся в положения L_lids_minor_outer_control и L_lids_minor_inner_control соответственно;
2) тюнеры верхние и нижние должны двигаться в "синергии", то есть не нужно брать желтые тюнеры и двигать 1 влево, другой вправо - такой подход просто не позволит вам сомкнуть веко корректно при дальнейшем сетапе;
3) располагать тюнеры следует логично, где центральные желтые тюнеры должны находить в середине, крайний левый и крайний правый на равноудаленное расстояние от центра и голубые тюнеры на середине между corner тюнерами и low(up)_1_tuner и low(up)_3_tuner соответственно.
Для наиболее простого понимания, картинка ниже визуально описывает правила расстановки тюнеров век.
Следующей задачей будет создание геометрической плашки L(R)_eyelids_plane_geo, на которой будут находиться косточки, от которых в свою очередь будет идти скин. Сами косточки цепляются через uvPin - такой подход не снизит производительность и сильно облегчит скин. Как альтернатива плашке может являться кривая, однако красить её не совсем комфортно.
Получить плашку можно выделив полигоны по линии смыкания век, и удалить все не нужное, кроме этой плашки.
Небольшой помощью при работе будет если последний полигон при выделении фейсЛупа убрать из этого выделения, тем самым будет четкое понимание где находится край века.
После получения плашки, нужно прискинить её к следующим косточкам, которые находятся в группах face_others/eyelids_others/lids_others.
Эти косточки можно найти в группе, что описаны выше. Следует понимать, что эти косточки нужны лишь для левой плашки, для правой будут ровно те же самые косточки, но уже с префиксом R, вместо L.
Прежде чем перейдем к настройке открытия века, нужно выполнить еще 1 действие - создать косточки, от которых будет идти базовый скин на открытие/закрытие века. Количество этих джоинтов будет эквивалентно количеству лупов на плашке, а их создание происходит вручную. Сами косточки нужно расставить по крайним положениям эйджЛупов.
Сами косточки нужно приврапить к плашке. Выполняется подобное через uvPin, поскольку это наиболее быстрый способ с точки зрения производительности ригга. Однако, стандартный uvPin передает все трансформы на джоинты, что создает ненужные ротейты на костях. В нашем случае ничего, кроме транслейтов не нужно, потому нужно декомпозировать исходящую матрицу из uvPin ноды в транслейты и передать на джоинты. Вручную такое выполняется с помощью decomposeNode, однако для экономии времени можно воспользоваться модулем uvPin_2 в RB.
1) geo - это имя плашки;
2) new_name - это имя, которое будет у uvPin ноды;
3) joints - лист джоинтов.
Принцип работы достаточно тривиален, сначала нужно вставить в графу geo плашку или геометрию, на которой будет создан uvPin. В графу new_name нужно написать имя будущей uvPin ноды. В окно joints нужно вставить джоинты, которые будут приврапены к geo, сделать это можно выделив все нужные косточки в сцене и нажав правой кнопкой мыши по окну joints выбрать get selected from maya.
Теперь жмем RUN и все приврапится как нужно.
В процессе открывания глаза, вероятен такой исход событий, когда джоинты или прыгают в нуль координат или врапятся к другому вертексу на плашке. В таком случае, я рекомендую приоткрыть глаз, удалить uvPin ноду и вручную перетащить в нужные места "улетевшие" джоинты. После снова применить модуль uvPin_2 в RB.
Когда все подготовительные элементы сделаны, можно начинать настройку открытия глаз. Первым делом корректно раскрасим скин на плашке L(R)_eyelids_plane_geo, результатом которого будет являться - корректные деформации при перемещении миноров века и вращении основных контролов век L_lids_upper_control и L_lids_lower_control.


На первой картинке ротейт основного контрола века L_lids_upper_control, в то время как на второй были смещены 3 минора внутренней границы века.
Исходя из картинок можно понять, что верхнее и нижние полигоны на плашке века имеют одинаковые веса - тем самым при смыкании геометрического глаза не будут возникать дырки и заломы. Кроме того, особое внимание при покраске следует обратить на плавность изгибов века.
Теперь можно открыть веко с помощью атрибутов на face_head_transform. Поскольку мы открываем глаза из положения закрытого века - результатом будет максимальное приближение к открытому глазу, то есть нужно настроить атрибуты таким образом, чтобы плашка L(R)_eyelids_plane_geo при открытии века была приближена к открытому веку настолько, насколько это возможно. Управлять открытием глаза можно с помощью атрибута blink на контроле L(R)_eye_lids_control.
Процесс настройки выполняется в соответствии с порядком атрибутов начиная с upper_remap и заканчивая min tZ.
upper remap - угол на который поднимется верхнее веко;
lower remap - угол на который опустится нижнее веко;
corners remap - угол по которому будет двигаться угловые контролы (обычно дефолтное значение около -40 хватает);
lower info - максимальный угол нижнего века (атрибут заблокирован, он нужен только как информация);
upper info - максимальный угол верхнего века (атрибут заблокирован, он нужен только как информация);
upper value - максимальный угол верхнего века;
lower value - минимальный угол верхнего века;
upper angle joints - угол поворота верхних косточек при открытие/закрытие глаза;
lower angle joints - угол поворота нижних косточек при открытие/закрытие глаза;
max tX - максимальное положение по транслейту Х верхнего века;
max tY - максимальное положение по транслейту Y верхнего века;
max tZ - максимальное положение по транслейту Z верхнего века;
min tX - минимальное положение по транслейту Х нижнего века;
min tY - минимальное положение по транслейту Y нижнего века;
min tZ - минимальное положение по транслейту Z нижнего века.
При изменении атрибутов upper и lower remap можно регулировать угол на который будут опускаться и подниматься веки - таким образом, изменение этих атрибутов подгонит верхнюю и нижнюю границы плашки под открытый глаз на геометрии.
- картинка где плашка при blink 1 и открытый глаз
Для наиболее точной работы рига век, значение атрибутов upper remap и lower remap стоит сохранять равными друг другу. Конечно, система позволяет использовать разные значение этих атрибутов, но работать с настройкой век будет проще и комфортнее, имея равные значения в upper и lower remap.