Как сделать верхнее веко меньше


Как сделать верхнее веко меньше

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 Ark · Permalink
In: Rigging · Tagged with: aim, cluster, constraint, deformation order, deformer, drivenKeys, maya, motionPath, rivet, script, sculpt, skinning, weightMap, weights, wire





Как сделать верхнее веко меньше

Как сделать верхнее веко меньше

Как сделать верхнее веко меньше

Как сделать верхнее веко меньше

Как сделать верхнее веко меньше

Как сделать верхнее веко меньше

Похожие новости: