Перейти к основному контенту

МАНУАЛ: ЛИЦЕВОЙ РИГ ПЕРСОНАЖА (WIP)

МАНУАЛ: ЛИЦЕВОЙ РИГ ПЕРСОНАЖА

_______________________________________________________________________________


Здесь представлен подробный гайд по настройке лицевого рига персонажа. Настраивать лицевой сетап персонажа рекомендуется по порядку в соответствии с пунктами ниже. Как результат, на выходе будет получен лицевой риг, так же будет произведено подключения этого лица к существующему боди_ригу в rig_dev ассете и рассказаны особенности сборки персонажа для получения финального анимационного ассета

_______________________________________________________________________________

1. ИМПОРТ ЛИЦЕВОГО ПРЕСЕТА

Прежде чем начать работу необходимо открыть последний файл из моделлинга, и произвести небольшой клинап. Для этого в окне ригБилдера (РБ) необходимо открыть модуль cleanup, там выделить подмодуль cleaning_hash и кликнуть RUN. Далее, удаляем все, кроме:

  • группа for_rig
  • группа blendshapes
  • геометрические меши в группе geo, которые относятся к лицу (глаза, брови, ресницы, челюсти, язык, волосы, очки и т.п.)

Screenshot_13.png

Если нужно освежить память, как вызвать необходимый модуль в РБ, то можно обратить внимание на статью ниже, на графу: создание риг_дев ассета, пункт 2.

https://bookstack.yarko.com/books/rigging-AtN/page/manual-rigging-biped-personaza


Теперь когда сцена максимально очищена от разного мусора и лишних геометрий, нужно импортировать пресет лицевого рига, где уже будут созданы все необходимые контролы, а так же созданы все нужные связи между ними. Импортировать этот пресет можно через РБ, открыв модуль import_face_temp

Screenshot_2.png

Каждое лицо уникально, потому недостаточно просто импортнуть пресет, его нужно подогнать - для этого первая кнопка import helpers модуля import_face_temp импортирует в сцену хелперы. С помощью этих хелперов можно расставить ориентиры, где будут созданы контролы.

face_helpers.png

Чтобы избежать ошибок при позинге хелперов, полезным будет открыть 1 из существующих лицевых ригов (на момент написания статьи, готовы лица на персонажей doc и vinilion) и посмотреть в каких местах расставлены контролы.

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

face_helpers_pose.png

Следующим этапом будет конвертация хелперов в контролы, для этого нужно просто нажать вторую кнопку face adapt в модуле import_face_temp. После этого, работа над подгонкой лицевого сетапа будет почти завершена. Оставшиеся 10-20 процентов будут подгоняться за счет работы с тюнерами, которые будут находиться в группах локальных ригов внутри face_others.

Как работать с тюнерами будет описано ниже, в отдельных блоках посвященных локальным ригам.

Screenshot_1.png
Подогнанный лицевой сетап

Шейпы контролов, к сожалению, придется настраивать вручную, так как хелперы конвертируют только оффсет трансформы

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

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

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

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. РИГ РТА

Первое с чего начинаем работу, это с локального рига рта. Выполнять лицевой сетап нужно именно с этого потому, что бленды, которые отдает отдел моделлирования не полные, то есть, бленды, корректирующие уголок рта они выполняют только основываясь на уже лицевом сетапе. Таким образом, нет необходимости "целиться" в положения блендов, а так же не тормозит производственный процесс, так как лицевой риг в работу можно брать не имея бленды.

Screenshot_1.png

На старте, нужно сделать 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 нужно удалять.

Screenshot_2.png

_tuners_group - группы с тюнерами;
_constraint_tuners_others -  группа с констрейнами, после позинга должна быть удалена
--------------------------------------------------------------------------------------------------------------------------------------
Внутри 3 тюнера:

1) jaw_main_tuner обычно уже находится в корректном месте - его можно не двигать, однако должен он располагаться в середине между верхней и нижней губой;
2)
 jaw_pivot_tuner нужно ставить в точку открытия челюсти;
3) tongue_pivot_tuner нужно тоже ставить в точку открытия челюсти.

Screenshot_3.png

В силу стилизации, важное замечание:
jaw_main_tuner не всегда нужно ставить в анатомически верное положение

После того, как все тюнеры были расставлены и группа с констрейнами были удалены, необходимо создать пару кривых на верхнюю губу - M_jaw_up_curve, и на нижнюю губу - M_jaw_low_curve. Сделать подобное можно с помощью модуля mouthRig_temp в РБ.

Screenshot_4.png

Принцип работы следующий:
1) в окне name пишем название кривой, то есть если мы настраиваем верхнюю губу, то M_jaw_up, если нижнюю, то M_jaw_low;
2) далее на персонаже выделяем соответствующий эйджЛуп от левого уголка рта, до правого. Важно понимать, что эйджлупы нужно брать на рту, которые пересекаются;
3) далее жмем кнопку RUN.

В конечном итоге будут созданы все необходимые кривые и размещены в правильных местах в иерархии групп.

Screenshot_5.png

Screenshot_6.png

Важно обращать внимание на нейминг, на момент написания статьи все локаторы имеют одинаковый префикс - потому его нужно править вручную, руководствуясь тем, что левые локаторы и кости внутри имеют префикс L, правые R, а центральный - оставить M.

Так же нужно уделять внимание на начало кривых, т.е. направление кривых должны быть одинаковые

Screenshot_7.png

Когда кривые настроили, нужно обратить внимание на трансформу face_head_transform. В атрибутах у этой трансформы есть много каналов, каждый из которых уже связан с элементами лицевого рига. Все эти каналы разбиты на группы для удобства. Благодаря этим атрибутам можно не копаться в риге, а сразу настраивать все, что необходимо. 

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

Безымянный.png


Здесь представлены 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).

Screenshot_8.png

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 максимально приближены к блендшейпу, что выделен черной сеткой.

Screenshot_9.pngScreenshot_10.png

При покраске 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.

Screenshot_11.png

Результат с блендами уголков рта и открытой челюстью

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

Screenshot_12.png

Здесь представлен скинКластер на lips_minor_geo, а в окне outJoints представлены кости, на которые нужно выполнять этот скинКластер.

А именно:
lips_minor_skinCluster - это скин на геометрию lips_minor_geo

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

Screenshot_13.png

Чтобы миноры следовали за геометрией, нужно настроить uvPin на null группы миноров. uvPin следует цеплять к mouth_geo (эта геометрия будет изменяться, потому миноры будут спокойно следовать за геометрией без возникновения циклов). Однако выходящую матрицу из uvPin я рекомендую декомпозировать через ноду decomposeMatrix и передавать только каналы транслейта, поскольку ротейт в данном случае не нужен. 

Screenshot_14.png

Однако при движении миноров теперь, будут возникать двойные трансформации, для нивелирования такой проблемы, достаточно создать multiplyDivide ноду, в input1 которой будут входить атрибуты транслейта минора, а в input2 находиться минусовые значения (-1, -1, -1). Выход multiplyDivide ноды следует подключить на группу трансформу между минором и его null группой. 

Screenshot_15.png

1) L_lips_low_3_minor_control_null - оффсет группа минора
2) L_lips_low_3_minor_control_transform - трансформа минора
3) L_lips_lower_3_minor_control - сам минор

Screenshot_16.png

Теперь назначим блендшейп от lips_minor_geo к геометрии mouth_geo. Это будет финальная геометрия рта, соответственно назвать этот блендшейп нужно как minors_final_blendShape. Создадим последние управляющие элементы рига к рту с помощью скинКластера к mouth_geo и назовем его как mouth_final_skinCluster.

Screenshot_17.png

Здесь представлен скинКластер на mouth_geo, а в окне outJoints представлены кости, на которые нужно выполнять этот скинКластер.

А именно:
mouth_final_skinCluster - это скин на геометрию mouth_geo

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

Screenshot_18.png

Иногда полезно будет использовать деформер deltaMush, который позволит выровнять местами сетку. Однако следует помнить, что больше 10 smoothing iteration ставить нельзя, поскольку на больших значениях deltaMush с удовольствием скушает не мало fps


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

Screenshot_19.png

_______________________________________________________________________________

3. РИГ ВЕК И ГЛАЗ

Для создания локального рига век нужно будет использовать 3 геометрии: eyes_geo - геометрия, на которой будут деформации внутренней границы века; eyes_outer_geo - геометрия, на которой будут деформации внешней границы века; eyes_final_geo - финальная геометрия, на которой будет финальный скейл век и подключенные eyes_outer_geo и eyes_geo, через блендшейп

maya_w5bysu5bVS.png

Геометрию eyes_geo обычным дубликатом не получить, потому начинать работу нужно с геометрией блендшейпа закрытого глаза closed_eyes.

Выделим геометрию closed_eyes и подвинем тюнеры век  в группе lids_tuners_group/internal_tuners_group по границе линии смыкания век. Тюнеры подгонят необходимые элементы для риггинга век в нужные места, после их подгонки нужно удалить группу lids_constraint_tuners_others

maya_nrS37eAE9z.png

Тюнеры век не стоит ставить куда попало, нужно руководствоваться простой логикой:

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 соответственно.

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

maya_oytp0Ng5ro.png

Следующей задачей будет создание геометрической плашки L(R)_eyelids_plane_geo, на которой будут находиться косточки, от которых в свою очередь будет идти скин. Сами косточки цепляются через uvPin - такой подход не снизит производительность и сильно облегчит скин. Как альтернатива плашке может являться кривая, однако красить её не совсем комфортно. 

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

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

maya_B9vTMwBoJb.png

После получения плашки, нужно прискинить её к следующим косточкам, которые находятся в группах face_others/eyelids_others/lids_others.

maya_ogvBgLPg9e.png 

Эти косточки можно найти в группе, что описаны выше. Следует понимать, что эти косточки нужны лишь для левой плашки, для правой будут ровно те же самые косточки, но уже с префиксом R, вместо L.

Прежде чем перейдем к настройке открытия века, нужно выполнить еще 1 действие - создать косточки, от которых будет идти базовый скин на открытие/закрытие века. Количество этих джоинтов будет эквивалентно количеству лупов на плашке, а их создание происходит вручную. Сами косточки нужно расставить по крайним положениям эйджЛупов.

maya_YT08H37lO9.png

Сами косточки нужно приврапить к плашке. Выполняется подобное через uvPin, поскольку это наиболее быстрый способ с точки зрения производительности ригга. Однако, стандартный uvPin передает все трансформы на джоинты, что создает ненужные ротейты на костях. В нашем случае ничего, кроме транслейтов не нужно, потому нужно декомпозировать исходящую матрицу из uvPin ноды в транслейты и передать на джоинты. Вручную такое выполняется с помощью decomposeNode, однако для экономии времени можно воспользоваться модулем uvPin_2 в RB.

maya_RMLU5X7RbR.png

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.

maya_wQOqroo8Ku.png
maya_vEP4QTv8as.png

На первой картинке ротейт основного контрола века L_lids_upper_control, в то время как на второй были смещены 3 минора внутренней границы века.

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

Теперь можно открыть веко с помощью атрибутов на face_head_transform. Поскольку мы открываем глаза из положения закрытого века - результатом будет максимальное приближение к открытому глазу, то есть нужно настроить атрибуты таким образом, чтобы плашка L(R)_eyelids_plane_geo при открытии века была приближена к открытому веку настолько, насколько это возможно. Управлять открытием глаза можно с помощью атрибута blink на контроле L(R)_eye_lids_control.

maya_UYhbfEGmPm.png
Процесс настройки выполняется в соответствии с порядком атрибутов начиная с 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.