Elizabeth – Facial Rigging


This is my ancient topic made in mid of 2005 on http://www.3dcenter.ru/ board.

Some things are outdated, but some others are relevant still. I’m creating this backdated post and a couple more, because I’m closing the site they we at ’till today – just not to waste them, for history, nostalgia and this sort of things 🙂

Sorry, it’s in russian only and I neither plan nor see any point in translating it into english.


Модель с кодовым названием “Elizabeth”:

О маппинге:

Лично моя цель тут была – получить как можно меньше швов в видимых областях. В прошлый раз я делал текстуру 4К и думал, что я попросту замажу прямо в Майе с помощью Paint 3D Tool все швы клоуном – в итоге оказалось, что даже если Майя не вылетит и не зависнет (для этого я рисовал под линуксом), то все равно во вьюпорте увидеть в нормальном виде что рисуешь – не реально (если выкручивать резолюцию отображения в такой ситуации, думаю и линукс сплавится :D)

Поэтому лично я готов на некоторые растяжки (а без них и не обойтись по-любому), но лишь бы без швов. Я правда не пользовался всякими Deep Paint и Body Paint – вот хочу на днях с первым поэкспериментировать – может быть он решит проблему с замазкой швов.

Вот такую развертку я получил для Дуньки-Елизаветы 😉

Собственно, это был cylindrical projection на всю половинку лица, за тем отдельные проекции на проблемные области и соединение кусков вновь. После миррора делаю миррор и всего нового shell’а (думаю, понятно зачем ;)) и сшиваю ребра до нужной точки (в конкретном случае я дошел до волосяной области, поэтому швы меня там не беспокоят.

Далее, интересные заметки.

1. Кто разворачивал UVs и пользовался обильно релаксом, знает как ведут себя interior border edges (как например глаз, ноздря, ухо, рот) – они не двигаются (и не должны, если включить чтобы и они релаксились – обычно выходит полная лажа), а interior UVs под них подползают, образовывая гадкие оверлэпные складки. Так вот удобный способ от этого избавиться – отсоединить геометрию в этом месте (к примеру, я экстрактил внутреннюю часть глаза ровненько по эдж лупу на соприкосновении века и глазного яблока) и прикрыть дырку полигоном (Fill Hole). Border edge понятное дело исчезнет, и релакс будет проходить приятнее. Потом полигон стираем и снова присоединяем геометрию, а маппинг это shmack поместить отдельно. На сриншоте выше видно как я это сделал с глазами и губами.

2. Совсем недавно натолкнулся на отличную возможность инструмента Straighten UV Border выравнивать промежутки между UVs. Соответственно, хватаем область UV Border, в которой UVs должны располагаться равномерно или около того, жмем Straigten UV Border и уменьшаем атрибут Preserve Length. Там же с помощью Curvature можно делать гладкие выгнутости/вогнутости выделенного участка.


Первый этап facial rigging – скиннинг.

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

Я уже вроде кучу всего написал по этому когда-то в топике Susie – с тех пор мало чего изменилось. Майя 6.5 вроде менее глючной стала в этом плане – выскакивающих вершин я почти не наблюдаю – а может быть у меня уже подсознательно заклинило куда жать не надо :)) Не то чтобы я любил скиннить, но для меня это самый магический и немного некромантский процесс во всем character creation – дар “полену” возможности органического существования. И всегда возникает какой-то трепет, когда модель начинает открывать рот, сгибать руки и ноги… В общем, ладно, я отвлекся 🙂

1. В качестве скелета для головы я делаю стандартный joint chain как на картинке. В скин идут только помеченные названиями джоинты – root>neck>head>jaw. Крайние два просто служат для визуализации костей и в скиннинге лишние. Конечно, на шею можно сделать и больше джоинтов – позвонков у человека насколько я помню в шейном отделе 7, но мало кто такое делает 😀

2. Для paint weights я до сих пор пользую посоветованный когда-то Майклом skinning tools с highend3d – очень удобный инструмент, как в сравнении с майским, так и с рядом других, опробованных мною с того же хайэнда. Разве что component editor у него неахти – приходится пользоваться майским. Но при скинниинге головы применения component editor’а я не нашел, так что это не проблема.

В целом, скиннинг головы чертовски прост. Реально надо настроить только jaw c переходом к head, и neck с переходом к root, остальное – мелочи.

3. Тут уже всякие схемы, которые каждый сам для себя подберет. Я на большинстве участков всего тела люблю перекидывать весь вес участка на определенный джоинт, а потом работая hold/unhold (skinning tools тут очень удобен) вытягивать из него вес в нужные места – особенно это для меня удобно при скиннинге кисти – закинуть весь вес от запястья и ниже на джоинт запястья, а потом уже тянуть на каждый палец – это имхо гораздо проще и удобнее для восприятия, нежели когда весь вес распределен майей автоматически по каждому фалангу, на еще и на соседние пальцы залезло…

4. Так вот, лично я перекидываю весь вес на head, потом беру сколько надо на jaw, открываю рот и смуфлю переход (крутить джоинты не выходя из paint skin weights mode – похоже, самое большое преимущество skinning tools) пока меня не устроит плавность натяжения кожи. Необходимо часто крутить челюсть туда-сюда дабы уследить и обеспечить легкое натяжение кожи аж до скул, ну или до куда надо.

5. Flood smooth лучше никогда не пользоваться. Flood replace – как раз я использую для “перекидывания” веса куда нужно – это без проблем, а вот flood smooth кажется быстрым и удобным, но в итоге заканчивается тем, что при открытии челюсти двигается кожа на затылке, не говоря уже про брови и проч. Так что все-таки лучше всего обрабоать вручную артизаном.

6. О переходе от head к neck в принципе можно не беспокоиться – head отдельно от neck обычно крутиться не будет, поэтому нужно попросту вытянуть из head на neck жесткой replace 1.0 кисточкой значения с большим захлестом, потом уже из neck вытянуть точно также вес для root и настроить переход между ними. Вот как у меня в итоге настроен вес для neck – такой резкий переход к head не проблема в данном случае – там деформаций происходить от костей не будет.

7. Еще очень удобно пользоваться слайдером max color который позволяет отображать очень маленькие значения ярче – сразу видно будет ли jaw joint деформировать что-нить на затылке или пятке (это не совсем шутка ;))

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

Вот какая страшная пасть у модели, будто у нее там мячик застрял. По-хорошему, когда рот открывается, кожа натягивается и щеки сужаются, потом при повороте головы влево-вправо выпирают sternums (от уха к груди мышца ;)) Сделать это скиннингом… В принципе можно влепить отдельные джоинты в нужные места, отскинить их и поставить на SDK (здесь и далее – не Software Development Kit, а Set Driven Keys :D), но удобнее имхо это сделать с помощью кластеров, учитывая то, что их можно миррорить – я наконец-то нашел способ, но об этом потом.

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

Так вот, после установки веса одного кластера (тут я подкрутил max value дабы ярче было видно распределение, на самом деле оно такое слабое, что еле видно) естественное желание зазеркалить его на противоположную щеку.

Раньше сколько я ни парился, сколько ни спрашивал – таки не нашел решения – приходилось заново красить вес для второго кластера (тут это не особо проблемно, а вот при настройке века – довольно много времени отнимает). Может быть я был глупее, может быть Майя была 6.0 версии… Может все вместе 🙂

Необходимое условие для миррора – нормальная симметричная развертка головы.

В общем, методика такова – при создании кластера на левой щеке запоминаем какие вершины в его состав включали. То же самое делаем для правого кластера. Затем у левого экспортируем из настроек артизана paint cluster weights карту атрибутов.

Пардон, что на скриншотах щеки уже подтянуты 😀 У меня ведь давно уже все это настроено – забыл отключить 😉

В фотошопе аккуратно зеркалим и где надо подкрашиваем pencil’ом (иногда границы получаются не совсем одинаковыми и вылезают черные пикселы), а исходную область глушим в черное.

Теперь можно включать paint cluster weights для правого кластера и импортировать новую карту атрибутов – получается быстрый и точный миррор.

Ну а дальше ставить SDK на поворот челюсти – сужение кластеров при открытии рта и легкое расширение при сжимании.

Меня сегодня попросили более подробно и внятно рассказать об использовании этих кластеров и методе их миррора. Я, честно говоря, не очень понимаю чего я на примере щек написал непонятного, но так как люди попросили хорошие, no way I won’t do that 😀

Но уже на примере век.

Как я уже упомянул, разные люди любят настраивать веки по-разному – блендшейпами (мне не нравится потому, что нужно делать in-between формы, так как веки они все-таки девормируются по поверхности глазного яблока, т.е. эдакое вращательное движение, а не линейный морф, предоставляемый одним блендшейпом, ну а делать несколько блендшейпов для in-between положений – какая-никакая перегрузка сцены таргетами), костями (мне просто не нравится 🙂 наверное из-за долбанутой иерархии скелета, хотя есть свои удобства – в основном в настройке веса и отсутствии проблем с порядком трансформаций) и даже не вспомню чем (wire tool? :D)

Мне больше всего нравятся кластеры, поэтому далее про них.

1. Выделяем необходимые вершины, с приличным захлестом, небольшим оверлэпом области верхнего века и нижнего, запоминаем область (нужно для миррора, как я писал выше) – я люблю считать от всяких 5-corner points и т.п. 🙂 но почти никогда не запоминаю 😀

2. Выделили, сделали relative cluster.

3. Далее пивот кластера нужно поместить в центр глазного яблока, для чего последнему сделаем center pivot и включим в атрибутах Display Handle – к полученному selection handle можно поинт-снэппом присобачить пивот кластера (я всегда удивлялся почему в книгах по Майе, рассчитанных на intermediate и advanced level подобные руководства всегда сопровождаются уточнениями типа “для этого нажимаем кнопичку insert, вид манипулятора меняется, зажимаем кнопичку v (for point snap) и затем дергаем зажатой средней кнопичкой мыши по… :D)

Для тех кто сможет понять что тут изображено – скриншот 😀

4. Теперь прежде чем начать рисовать вес кластеров, стоит поставить анимационные ключи на поворот кластера, дабы не вылезать из рисования, чтобы покрутить кластер и посмотреть деформации в действии (skinning tools понятное дело с кластерами не работает).

5. В этом пункте долго и подробно описывается процесс рисования веса кластера, мало чем отличающийся от рисования веса скина по принципу “кто во что горазд”.

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

Естественно, вес там распределяется по дефолту.

7. Далее снова включаем первый, настроенный, кластер и делаем экспорт его веса в карту атрибутов (attrMap) по luminance из опций Paint Cluster Weights Tool.

8. Получаем карту стандартного вида – вес кластера отображен градациями серого. Собственно, задача перенести этот градиент на другой глаз.

9. Просто копируем кусок с градиентом, делаем ему horizontal flip и накладываем поверх правого глаза. Вот тут и необходима симметричная развертка, а у меня она еще отцентрована, поэтому совсем просто – сделать вертикальный гайд по центру и по нему разместить копию. Внутренний border обычно не совпадает чуть-чуть – видно немного черных пикселов. Вряд ли это на что-то повлияет, но я все равно беру pencil, сэмплирую соседние пикселы и закрашиваю выбивающиеся.

10. Ну а прежнюю область нужно свести в черное 0 0 0 любым удобным способом. Я делаю через Output Levels. Потом я сделал то же самое с кусочком внизу – картинок постить не буду 🙂

11. Сохраняем карту и импортируем (там же где и экспортировали) ее для правого кластера.

La finita.

Да, забыл сильно важную штуку – deformation order (последовательность деформаций). Чтобы кластеры работали нормально при повороте и перемещении костей – их действие должно происходить ДО скин кластера. Если этого не обеспечить, будут очень забавные штуки.

Поставить это можно в списке инпутов. У меня тут много всего, но сейчас самое важное, что skin cluster находится выше (значит ПОСЛЕ) кластеров.

Сами хэндлы кластеров можно либо оставить в world (все равно потом на нихповесятся SDK и их можно будет скрыть) – тогда они при перемещении персонажа будут оставаться на месте. Но лучше всего под трансформ нод, содержащий root – тогда все будет как ожидается.

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


В продолжение лицевого сетапа.

До или после настройки век нужно сделать таргет для глазных яблок, дабы контролировать направление взгляда. Тут описывать особенно нечего – старый добрый способ, вроде в уроках с Майей присутствует (про лягушку и муху) – через aim constrain.

Важно тут то, что один таргет для обоих яблок лучше не делать, иначе только при перемещении таргета сильно в даль глаза не будут косить. Поэтому самое на мой взгляд правильное – два локатора, по одному на каждый глаз, объединенные в группу. Группе включается Selection Handle дабы легко выбирать сразу именно ее. Ну и еще кучу атрибутов можно повесить, типа каждое веко, сужение зрачков, bulge (об этом потом) и т.п.

Далее важная штука – эту самую группу aim constrain к head joint (я обычно к нему паренчу сами глазные яблоки). При таком сетапе при перемещении группы локаторы сами будут разворачиваться в сторону головы, что позволит избежать всяких искривлений, ну и просто визуально удобнее.

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

Далее так называемые skinny eyes – когда глазные яблоки вращаются, происходит две вещи – из-за выпуклости cornea перед радужкой и зрачком веки несколько набухают в зависимости от положения этой выпуклости, то бишь от направления взгляда. Второе – веки тянутся в след за глазным яблоком – оно поворачивается вверх, верхнее веко поднимается и нижнее немного, и разумеется наоборот.

Начну со второго. Это обычные SDK на поворот яблока: повернулось вверх – дергаем соответствующие ранее настроенные кластеры век и т.п. До чего я допер сравнительно недавно – SDK это ведь просто анимационные кривые, значит их можно как таковые и рулить. Поэтому я после настройки откапываю в гиперграфе соответствующие ноды и в graph editor’е ставлю первый и последний ключи на flat, а средний (тот который “все по нулям” – дефолтовое направление взгляда) вручную подправляю для гладкости. Таким образом получается мягкий эффект деформации век – когда глаз поворачивается вниз, веки опускаются нелинейно, плавно замедляясь к финалу, что более естественно.

Elizabeth skinny eyes rig graph

Elizabeth skinny eyes rig graph

Ну а выпуклость делается созданием для меша головы sculpt deformer (flip/ring) – который я и называю в данном случае bulge, выпуклость. Он помещается опять же в центр глазного яблока скейлится под вышеупомяную выпуклость – в этом вся суть, сделать его такой формы, чтобы он влиял только в тех местах, где на яблоке выпуклость (выпуклость – главное слово этого поста :)) Парентим к яблоку и настраиваем значения по вкусу.

Важно сделать ему выключатель – как я уже сказал, я вешаю на группу-таргет кастом атрибут. Потому что потом, даже если я об этом сейчас подробно расскажу, все равно он может неприятностей доставить уйму. Это я про блендшейпы – забыл отключить bulge при дубликации сетки – все, полученный блендшейп будет еще сильнее вздувать веки 😀 Я об этом знаю, но все равно иногда забываю 😀

Да, что касается deformation order – sculpt должен быть ПОСЛЕ скинКластера. На предыдущем скриншоте инпутов там он как раз в правильной позиции расположен.


Ресницы

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

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

1. Создаем кривую – на которой будут располагаться ресницы. Очевидно, нужно сделать полигоны Live и нарисовать кривую. Располагайте CVs равномерно, если возможно – в середине каждого полигона (потом будет ясно зачем).

2. Создаем геометрию для ресницы. Пивот помещаем в корень.

3. Присоединяем ресницу к кривой motion path на какое-нить круглое значение кадров, у меня сейчас 200 (0-199).

4. Теперь нужно подправить анимацию ресницы – скейл самой геометрии и направление по motion path, то бишь front/up/side twist. Можно, конечно, пойти еще дальше – проставить дополнительные ключи для uValue и установить области где ресница движется быстрее (там в итоге они будут располагаться реже), а где медленнее (там гуще), но я этого не делал.

5. Ставим time range согласно продолжительности motion path и в скрипт эдиторе выполняем скрипт:

for ($i = 0; $i < 100; $i++) {
	select pCylinder1;
	duplicate;
	rotate -r (rand(-10,10)) (rand(-10,10)) (rand(-10,10));
	move -r (rand(-.02,.02)) (rand(-.02,.02)) (rand(-.02,.02));
	playButtonStepForward;
	playButtonStepForward;
}

Я в скрипт Бардвелла добавил команду move, дабы был случайный оффсет не только направления, но и позиции ресницы.

Рулить плотность ресниц можно параметрами, отмеченными синим. Соответственно, дабы сделать плотность в два раза меньше, я добавил еще один playButtonStepForward – в результате чего ресница создается не каждый кадр, а через кадр и уменьшил максимум $i в два раза.

Скриншот по какой-то причине я сделал верхних ресниц 😀 Ну да ладно…

Ну и теперь сетап – как сделать чтобы ресницы четко следовали за веком при анимации. Сетап Барвелла меня не впечатлил, учитывая то, что он кривую делает на НУРБСах, поэтому как curve on surface и она следует благодаря истории сама за поверхностью. В полигонах по крайней мере я не знаю как это сделать. Поэтому я сделал вот таким образом:

6. На каждый CV кривой ставим по non-relative кластеру.

7. На каждый полигон под каждым кластером ставим rivet (еще раз напоминаю, лежит он свободно на highend3d – и очень-очень полезной штукой является) – вот зачем желательно изначально создавать кривую с CVs в серединах полигонов – для соответствия кластеров CVs и локаторов ривета.

8. И парентим каждый кластер к соответствующему локатору (в процессе этого кластеру создается еще груп ноуд – можно потратить немного времени и вынести кластеры из этих групп, затем их (группы) удалить – чем меньше нодов, тем лучше).

Теперь кривая гнется четко в зависимости от изгибов века.

9. Теперь комбайним все ресницы в один объект и пользуясь wire deformer цепляем полученный ресничный объект к кривой, ставим dropoff distance для wire побольше.

Все 😀

Posted on July 3, 2005 at 20:00 by · Permalink
In: Rigging · Tagged with: , , , , , , , , , , , , , ,

Leave a Reply