Лицевой риггинг для профессиональной анимации. Часть 3

8. Corrective Shapes

Corrective shape помогает создать формы, которые трудно достичь с помощью skin deformation. Например, изменение щеки, когда рот открывается и закрывается. Для этого мы используем Set Driven Key и Blendshape. Сперва сделаем эти позы в следующей таблице. Для рта не стали создать отдельный блендшейп. Но в остальных контроллерах будем использовать блендшейпы.

Driver Attribute Pose Driven Attribute Pose

ctrl_jaw RotateZ 0 ctrl_cheek_l_puff_SDK TranslateX 0

ctrl_jaw RotateZ 0 ctrl_cheek_r_puff_SDK TranslateX 0

ctrl_jaw RotateZ -4 ctrl_cheek_l_puff_SDK TranslateX 0.2

ctrl_jaw RotateZ -4 ctrl_cheek_r_puff_SDK TranslateX 0.2

ctrl_jaw RotateZ 35 ctrl_cheek_l_puff_SDK TranslateX -0.7

ctrl_jaw RotateZ 35 ctrl_cheek_r_puff_SDK TranslateX -0.7

ctrl_jaw RotateZ 35 ctrl_lip_l_side_SDK RotateY 35

ctrl_jaw RotateZ 35 ctrl_lip_r_side_SDK RotateY 35

(33.mb) (33.mov)

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



Для этого поставим 0 на атрибут envelop head_skin. И дублируем. Переименуем его на head_default. Еще раз дублируем и назовем его head_l_lip_out. Выберем его и потом head_skin и откроем Deform>Blendshape.



Скульптим Head_l_lip_out, как нарисовано выше. Соединим этот бленшейп с ctrl_lip_master_left с помошью Set Driven Key. (34.mb)



Теперь сделаем точно так же для правой стороны. Для этого используем скрипт absSymMesh.mel. Сначала выделим Head_default и нажмем на Select Base Geometry.



После этого выделяем head_l_lip_out и дублируем. Назовем его head_r_lip_out. Нажмем на Flip Selected. Точно также его добавим в блендшейп. После этого соединим его с контроллером ctrl_lip_master_right с помощью Set Driven Key. Эти блендшейпы припарентим в группу blendshapes. (35.mb) (35.mov)

Точно также сделаем блендшейпы когда контроллер двигается вверх, вниз и внутрь. У нас получиться вот такой результат. (36.mb) (36.mov)

Теперь добавим увеличение зрачка. Для этого дублируем и назовем его eyes_iris. Чтобы он не помешал нам мы переместим его чуть выше. Потом выделяем следующие вертексы и создадим кластер Deform>Cluster. После этого изменим его весы в Window>Component Editor.



Изменим расположение пивота кластера так чтобы он расположился ближе к поверхности глазного яблока.



Теперь начнем делать зрачок. Для этого выделим следующие вертексы и создаем кластер под названием cluster_r_iris_in.



Эти кластеры соединим с контроллерами ctrl_eye_l_ball и ctrl_eye_r_ball. Для этого нам поможет Set Driven Key. Соединим соответствующие scale атрибуты, это scaleX и scaleY. Когда увеличиваем, то видим, что глаза вылезают из головы. Для того чтобы претворить это, добавим анимацию к атрибутам scaleZ и translateZ. Теперь добавим новый атрибут pupil с помощью Channel Box>Add Attribute.



Соединим эти атрибуты с scale атрибутам cluster_l_iris_in и cluster_r_iris_in. Переместим блендшейпы и кластеры в группу blendshapes. (37.mb) (37.mov)

Теперь сделаем увеличение всего глаза. Для этого создадим контроллеры. (38.mb)



Выделяем нужные нам меши с помощью следующего скрипта. select -r eyes eyeLashes head_skin eyeBrow; Включим Vertex mode. Выделим следующие вертексы.



Создадим кластер Deform>Cluster. Тот, что в левой стороне назовем cluster_l_eye, а в правой cluster_r_eye. Теперь сглаживаем его влияние. (39.mb)



Нам нужно соединить кластеры с контроллерами. Для этого группируем cluster_l_eye и назовем Grp_cluster_l_eye. Его припарентим к группе ctrl_eye_l_all_SDK. Потом кластерам сделаем Parent и Scale Constrain к контроллеру ctrl_eye_l_all. Правую сторону сделаем точно также. Припарентим Grp_eye_all к контроллеру ctrl_head. Если повернем голову и проверим, то тогда видим следующую ошибку.


Направление головы и кластера не совпадают. Не смотря на то, что кластер припаренчен к голове. Выделим меш головы и изменим его Input. Две кластера должны стоят до skinCluster



Точно также сделаем для глаз, бровей и ресниц. Тогда channelBox выглядит таким образом.



Если присмотреться то увидим, что глаз немного вылазит.



Причина этого в том, что мы неправильно сделали Aim Constrain глаза. Если точнее, то Up Vector. Поэтому наши глаза всегда смотрят вверх. Нам нужно, чтобы они смотрели не вверх сцены в мировых координатах, а вверх в координатах головы. Чтобы исправить, мы сначала удалим Aim Constrain. Создадим нул объект под названием upVector_l_eye. Его переместим по оси Y вверх, относительно глазного яблока.



Сначала выделим ctrl_eye_l_aim, потом ctrl_eye_l_ball_0 и откроем параметры Aim Constrain.



Припарентим upVector_l_eye к контроллеру ctrl_eye_l_all. Правую сторону тоже сделаем таким же образом. (40.mb) (40.mov)

9. Squash and Strentch

Мы будем делать систему Squash and Stretch с помощью Lattice Deformer. Сначала припарентим head_skin к группе mesh. В Outliner откроем группы, лежащие под контроллером ctrl_head.



Это контроллеры лица. Их группируем grp_face_controllers. Теперь выделим всю геометрию в группе mesh, потом группу grp_face_controllers. Вы можете удивится, почему мы добавили контроллеры в эту систему. Потому что, если добавить их, они тоже будут стрейчится и сквошится. Если нет, все контроллеры лица будет стоят на месте и выглядеть странно. Теперь откроем Deform>Lattice.



Переименуем только что созданные ffd1Lattice и ffd1Base на ffd_SaS_Lattice и ffd_SaS_Base. Сгруппируем их по имени grp_ffd_SaS. Припарентим к контроллеру ctrl_head. Выделим следующие вертексы (Lattice Point) ffd_SaS_Lattice.

Создадим кластер под названием Cluster_sas. Изменим их вес следующим образом.

Теперь группируем кластер. Потом создаем контроллеры для squash stretch. (41.mb)

Переместим группу кластера в otherNonTransform, а группу контроллера в ctrl_head. Теперь соединим контроллер и кластер. Откроем Connection Editor. Соединим атрибуты translate и scale, не Rotate.

Двигаем контроллер по TranslateX. И у нас возникнет вот такая проблема.

Чтобы исправить эту ошибку нам нужно переместить пивот кластера ближе к своему контроллеру. И еще нам нужно добавить соединение в rotate с помощью Set Driven Key.

Driver Attribute Pose Driven Attribute Pose

ctrl_squashStretch TranslateX 0 cluster_sas RotateZ 0

ctrl_squashStretch TranslateX -2 cluster_sas RotateZ 10

ctrl_squashStretch TranslateZ 0 cluster_sas RotateX 0

ctrl_squashStretch TranslateZ 2 cluster_sas RotateX 10

После этого у нас будет вот такой результат. (42.mb) (42.mov)

Теперь двигаем контроллер по TranslateY и добавим squash stretch. Для этого дублируем ffd_SaS_Lattice и переименуем. Мы будем делать его с помощью блендшейпов.



Сначала выделим ffd_SaS_Lattice_blnd, потом ffd_SaS_Lattice. Создадим Blendshape. Не забудем поставить Front Of Chain в параметр Deformation Order. Поставим 1 на Blendshape. И создаем форму похожую на рисунок ниже.



Соединим блендшейп с translateY контроллера с помощью Set Driven Key.

Driver Attribute Pose Driven Attribute Pose

ctrl_squashStretch TranslateY 0 sas ffd_SaS_Lattice_blnd 0

ctrl_squashStretch TranslateY -3 sas ffd_SaS_Lattice_blnd 1

Поправим кривые в Graph Editor, как показано ниже. И потом наш контроллер начнет работать правильно.



Группируем Lattice блендшейпы и переместим их в группу blendshapes в Outliner. Если хотим больше управление можем соединить Rotate атрибуты кластера и контроллера с помощью Set Driven Key. (43.mb) (43.mov)
Теперь почистим атрибуты контроллеров. То есть залочим и захайдим не нужные нам атрибуты в контроллерах. Это будем делать согласно с следующей таблицей. Можете использовать скрипт для выделения контроллеров.

Controller

Attribute

select -r ctrl_root ctrl_neck ctrl_head ctrl_jaw ctrl_teethDown ctrl_tongue5 ctrl_tongue4 ctrl_tongue3 ctrl_tongue2 ctrl_tongue1 ctrl_lip_up ctrl_lip_down ctrl_lip_r_UpA ctrl_lip_r_UpB ctrl_lip_r_side ctrl_lip_r_DownB ctrl_lip_r_DownA ctrl_lip_l_UpA ctrl_lip_l_UpB ctrl_lip_l_side ctrl_lip_l_DownB ctrl_lip_l_DownA ctrl_lip_master_up ctrl_lip_master_down ctrl_lip_master ctrl_lip_master_left ctrl_lip_master_right ctrl_teethUp ctrl_eye_l_ball ctrl_eye_r_ball ctrl_eye_l_lidG2 ctrl_eye_l_lidA2 ctrl_eye_l_lidB2 ctrl_eye_l_lidC2 ctrl_eye_l_lidD2 ctrl_eye_l_lidE2 ctrl_eye_l_lidF2 ctrl_eye_l_lidH2 ctrl_eye_l_lidUp ctrl_eye_l_lidDown ctrl_eye_l_lidInner ctrl_eye_l_lidOuter ctrl_eye_r_lidG2 ctrl_eye_r_lidA2 ctrl_eye_r_lidB2 ctrl_eye_r_lidC2 ctrl_eye_r_lidD2 ctrl_eye_r_lidE2 ctrl_eye_r_lidF2 ctrl_eye_r_lidH2 ctrl_eye_r_lidUp ctrl_eye_r_lidDown ctrl_eye_r_lidInner ctrl_eye_r_lidOuter ctrl_eye_l_upperLidB ctrl_eye_l_upperLidC ctrl_eye_l_upperLidD ctrl_eye_l_upperLidG ctrl_eye_l_upperLidH ctrl_eye_l_upperLidF ctrl_eye_r_upperLidB ctrl_eye_r_upperLidC ctrl_eye_r_upperLidD ctrl_eye_r_upperLidG ctrl_eye_r_upperLidH ctrl_eye_r_upperLidF ctrl_brow_l_main ctrl_brow_l_inner ctrl_brow_l_mid ctrl_brow_l_outer ctrl_brow_r_main ctrl_brow_r_inner ctrl_brow_r_mid ctrl_brow_r_outer ctrl_brow_center ctrl_noseMain ctrl_nose ctrl_nose_l_stril ctrl_nose_r_stril ctrl_cheek_l_nose ctrl_cheek_l_puff ctrl_cheek_l_eye ctrl_cheek_r_nose ctrl_cheek_r_puff ctrl_cheek_r_eye ctrl_eye_l_all ctrl_eye_r_all ctrl_squashStretch ctrl_eye_aim ctrl_eye_l_aim ctrl_eye_r_aim ;

Visibility

select -r ctrl_eye_l_aim ctrl_eye_r_aim ;

Rotate, Scale

select -r ctrl_eye_aim ctrl_neck ctrl_head ctrl_jaw ctrl_teethUp ctrl_teethDown;

Scale

select -r ctrl_brow_l_mid ctrl_brow_l_outer ctrl_brow_r_inner ctrl_brow_r_mid ctrl_brow_r_outer ctrl_brow_center ctrl_eye_l_lidC2 ctrl_eye_l_lidD2 ctrl_eye_l_lidE2 ctrl_eye_l_lidF2 ctrl_eye_l_lidH2 ctrl_lip_up ctrl_lip_down ctrl_lip_r_UpA ctrl_lip_r_UpB ctrl_lip_l_DownA ctrl_lip_master_up ctrl_lip_master_down ctrl_lip_master ctrl_cheek_l_nose ctrl_cheek_l_puff ctrl_cheek_l_eye ctrl_cheek_r_nose ctrl_cheek_r_puff ctrl_cheek_r_eye ctrl_lip_master_left ctrl_lip_master_right ctrl_eye_l_ball ctrl_eye_l_upperLidH ctrl_eye_l_upperLidF ctrl_eye_r_upperLidB ctrl_eye_r_upperLidC ctrl_eye_r_upperLidD ctrl_eye_r_upperLidG ctrl_eye_r_upperLidH ctrl_eye_r_upperLidF ctrl_brow_l_inner ctrl_eye_l_lidUp ctrl_eye_l_lidDown ctrl_eye_l_lidInner ctrl_eye_l_lidOuter ctrl_eye_r_lidG2 ctrl_eye_r_lidA2 ctrl_eye_r_lidB2 ctrl_eye_r_lidC2 ctrl_eye_r_lidD2 ctrl_eye_r_lidE2 ctrl_eye_r_ball ctrl_eye_l_lidG2 ctrl_eye_l_lidA2 ctrl_eye_l_lidB2 ctrl_lip_l_UpA ctrl_lip_l_UpB ctrl_lip_l_side ctrl_lip_l_DownB ctrl_eye_r_lidF2 ctrl_eye_r_lidH2 ctrl_eye_r_lidUp ctrl_eye_r_lidDown ctrl_eye_r_lidInner ctrl_eye_r_lidOuter ctrl_eye_l_upperLidB ctrl_eye_l_upperLidC ctrl_eye_l_upperLidD ctrl_eye_l_upperLidG ctrl_lip_r_side ctrl_lip_r_DownB ctrl_lip_r_DownA ;

Scale

select -r ctrl_eye_l_lidUp ctrl_eye_l_lidDown ctrl_eye_r_lidUp ctrl_eye_r_lidDown ctrl_eye_l_lidInner ctrl_eye_l_lidOuter ctrl_eye_r_lidInner ctrl_eye_r_lidOuter;

Rotate, TranslateZ

select -r ctrl_eye_l_ball ctrl_eye_r_ball ;

Translate

select -r ctrl_nose_l_stril ctrl_nose_r_stril ctrl_noseMain;

Scale

select -r ctrl_nose

ScaleY, ScaleZ

Вот на этом заканчивается урок. (44.mb)

Надеюсь, что урок был полезен нам всем. Спасибо за внимание!

449 0 850 6
5
2016-11-14
Спасибо за труд!
2016-11-14
Спасибо большое!
2016-11-17
памятник надо ставить за такой труд!спасибо!
2016-11-24
Просто супер ,Спасибо автору !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2016-11-30
а теперь, господин Автор, заанимируйте эту голову так же как в вашем риле. Вы будете огорчены недостатком артикуляционных двигалок. Ваш риг годится только для немого кино. И вы намеренно не доделали ваш урок, что б не плодить себе конкурентов. Но ведь ваша публикация на чистом альтруизме, я не понимаю смысла ваших действий. Зачем вы писали этот бестолковый урок, ведь навык приобретенный здесь никак не поможет трудоустроится. Ваш урок - это медвежья услуга. Я бы вас понял, если бы вы хотели поймать барышь, но вы не преследуете меркантильных целей. Поэтому допишите урок до конца, как мужчина
RENDER.RU