Сложный скиннинг

О себе: Кирилкин Валерий, val172@yandex.ru


3D увлекаюсь несколько лет. Сначала перебивался какими-то мелкими программами, потом узнал Макс, ещё позже - Маю. Как влюбился в неё с первого взгляда, так и не могу оторваться до сих пор... Больше графики люблю только свою жену и мотоциклы :)!



Для иллюстрации принципа возьмём простую модель руки:

Skin_01

Далее конвертируем наш поли-объект (Mesh) в сабдивы, не забыв оставить исходник:

Прибавим сабдиву разрешения до трёх и для удобства положим оба объекта в соответствующие слои:

Создаём три кости и цепляем IK:

Далее выделяем Mesh и корневую кость, потом smooth bind по умолчанию:

Skin_02

Для начала создадим дубликат нашего поли-объекта:

Потом снимем блокировку трансформаций - для этого выделим все «серые» атрибуты

и, нажав правую клавишу на любом из них, выбираем unlock selected.

Продублируем новый объект ещё раз, отодвинем оба дубля в сторонку и спрячем их в отдельный слой. Также я для удобства спрятал в свой слой кости и IK.

Теперь нужно создать Blend Shape деформацию. Для этого выделим первый дубль, потом добавим к выделению второй, и только после них – оригинал полигональной руки. Дальше Deform => Create Blend Shape по умолчанию.

Теперь, выделив нашу руку, в редакторе атрибутов мы увидим ноду blendShape1 и два её главных параметра: веса обоих наших дублей.

С помощью этих параметров мы и будем контролировать форму руки при сгибе в локтевом суставе.

Теперь свяжем Mesh с polyToSubd1 посредством Wrap: выделяем сначала polyToSubd1, а потом Mesh. Далее - Deform => Create Wrap:

Skin_03

Теперь, если мы скроем Mesh и потянем за ikHandle, то увидим, что и наш сглаженный сабдивижн-объект будет деформироваться.

Рука гнётся весьма нереалистично – здесь надо было бы подправить веса вершин, однако данный метод позволяет решить этот вопрос другим способом.

У нас осталась ещё одна нерешённая проблема: нужно переставить местами inputs у полигональной руки, так как на самом деле Blend Shape нужно прицеплять до скининга. Увидеть нашу проблему просто: не отменяя ранее сделанного перемещения ikHandle, надо скрыть polyToSubd1, а у Mesh перейти на закладку blendShape1 и подвигать ползунок Dubl_1. Рука будет возвращаться в начальное место. Нам же нужно добиться, чтобы она только деформировалась. Не забудем отменить перемещение ikHandle.

А исправляем так: на поли-объекте щёлкаем правой клавишей, выбираем Inputs – All Inputs. Потом подводим курсор к Blend Shape и средней клавишей (колесом) перетаскиваем её на Skin Cluster. Эти две ноды должны поменяться местами и Skin Cluster будет сверху:

Теперь, пожалуй, всё готово – перейдём к сути метода!

Открываем окно Set Driven Key:

Выделяем кость предплечья (joint2) и нажимаем Load Driver. В верхней части появится joint2, справа – набор её атрибутов, там мы выделяем rotateY. Далее выделяем нашу полигональную руку, открываем редактор атрибутов, переходим на закладку blendShape1 и нажимаем кнопку Select в нижней части редактора. И теперь нажимаем Load Driven.

Справа от появившегося там blendShape1 выделяем Dubl_1 и Dubl_2.

Проверяем, чтобы значения весов дублей были равны 0. Значение вращения кости тоже должно быть равно 0, если, конечно, вы не сдвинули ikHandle.

Итак, теперь мы нажмём Key, и у нас создастся ключ, связывающий значения Driver и Driven.

Skin_04

Берём ikHandle (или просто joint2) и сгибаем руку примерно на 90 градусов. В закладке blendShape1 значение Dubl_1 меняем на единицу. Снова нажимаем Key, проверив, чтобы всё было выделено как раньше:

Скрываем Mesh и кости и показываем сабдив и дубликаты. Выделяем Dubl_1 и переходим к редактированию его вершин. Сдвигаем вершины (контролируя результат на сабдиве) с внутренней и внешней сторон локтевого сустава:

Здесь же можно создать и небольшую выпуклость для напряжённого бицепса. Когда результат нас удовлетворяет, можно сохраниться и посмотреть как работает наша система, двигая ikHandle или вращая joint2.

Не очень красиво получается при сгибе градусов на 60 – рука становится слишком толстая:

Это тоже достаточно просто исправить. Выделяем Mesh, и загружаем Graph Editor:

Там выбираем верхнюю joint2.Rotate Y (вверху появится blendShape1.Dubl_1) и нажимаем f:

Выделяем точку, потом её танжент, зажимаем среднюю клавишу и тянем. Также поступаем с другой точкой, пока не получим что-то подобное:

Теперь уже рука выглядит лучше.

Skin_05

Осталось согнуть руку «до упора», в закладке blendShape1 поменять значение Dubl_1 на ноль, а Dubl_2 - на единицу и поставить Key. Редактируем Dubl_2 и наблюдаем результат на сабдиве. Для достижения особо реалистичного результата придётся помучаться, но что-то приемлемое можно сделать достаточно быстро:

Skin_06

Вот собственно и всё! С помощью данной технологии можно добиться весьма точного контроля над вашими моделями и автоматизировать движения мускулов.

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

220 0 850 14
21
2006-05-22
Лучше бы написал как добиться окончательного, реалистичного результата, а не того что на последнем скрине.
2006-05-22
Да просто добиться: делай модель подетальней и мучай вершинки пока не надоест. Тут уже дело не в технологии.
2006-05-22
cgmuscle можно взять :) а урок хороший!
2006-05-22
урок - хороший, полезный.
2006-05-22
сама идея хорошая, а вот и сполнение... большой + это дивен кей и бленд шейп. но большой - это то что не полностью раскрыл тему.. извини но баллы средние.
2006-05-22
А почему не смус поли - врапа то не нада будет?
2006-05-23
Тема для урока очень хорошая, но сам урок построен из рук вон плохо. Урок должен описывать не просто действие которое надо совершить, а еще и причину по которой мы должны это действие сделать. Делаешь какое то действие - опиши почему оно необходимо. Уроки написанные по такой методике намного лучше усваиваются и читающий их получает более развернутое представление о самой программе и о методах работы в ней. При таком описании как сделали Вы, все сопутствующие ньюансы о которых вы говорите, сходят на нет.
2006-05-23
всё это очень просто для такого сочленения, есть еще колено, пальцы в сложных конструкциях гораздо сложнее з.ы. Steven Stahlberg, лет 5 назад про этот метод писал в своём туторе
2006-05-23
И в начале урока нужно хотя бы осветить цели, задачи и возможно даже небольшой план.
2006-05-23
Благодарю за отзывы. Согласен, некоторая сумбурность присутствует. Просто хотелось сделать урок достаточно сжатым.
2006-05-25
К сожалению, урок был опубликован и на другом сайте, что не соответствует условиям конкурса, поэтому его участие прекращается.
2006-05-29
Да, я подтверждаю, что урок опубликован ещё в одном месте. Но для того, чтобы очистить своё, так сказать, доброе имя, хочу сообщить, что произошло это по причине почти двухнедельной задержки не только в публикации на данном сайте, но даже ответа на не одно моё письмо.
2006-05-30
Ну и ЧТО?! Давным давно извстный способ, далеко не самый эффективный. К тому же ты показываешь как правишь распрямлённую руку для коррекции деформаций, это сложно и не интерактивно, показал бы как делать на деформированой руке. Скачай bodyShape.mel , в нём всё в разы лучше реализовано. К тому же, от хорошей привязки локтя (самый простой в плане деформаций сустав) до всего тела как от моей деревни до китайской границы. Рассказал бы как плечо хорошо ригить для всего спектра движений -- это было бы интересно.
2006-06-04
дарова всем я новичок но помоему неплохо получилось у нево конечно не доконца здел но всеже повысти ему бал чтоб небыл в минус.
2006-06-06
в майке я недавно! я от всего балдею!!!
2006-06-19
2006-09-11
Средненький урок.
2006-09-12
В MAX это проще.
2006-09-12
Не важно - попал на конкурс, не попал. Но людям помог. Спасибо.
2006-09-15
Спасибо, друг.
2014-06-03
Меня больше интересует скиннинг у тазе человека
RENDER.RU