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

О себе: Кирилкин Валерий, val172@yandex.ru
3D увлекаюсь несколько лет. Сначала перебивался какими-то мелкими программами, потом узнал Макс, ещё позже - Маю. Как влюбился в неё с первого взгляда, так и не могу оторваться до сих пор... Больше графики люблю только свою жену и мотоциклы :)!
Для иллюстрации принципа возьмём простую модель руки:
Далее конвертируем наш поли-объект (Mesh) в сабдивы, не забыв оставить исходник:
Прибавим сабдиву разрешения до трёх и для удобства положим оба объекта в соответствующие слои:
Создаём три кости и цепляем IK:
Далее выделяем Mesh и корневую кость, потом smooth bind по умолчанию:
Для начала создадим дубликат нашего поли-объекта:
Потом снимем блокировку трансформаций - для этого выделим все «серые» атрибуты
и, нажав правую клавишу на любом из них, выбираем unlock selected.
Продублируем новый объект ещё раз, отодвинем оба дубля в сторонку и спрячем их в отдельный слой. Также я для удобства спрятал в свой слой кости и IK.
Теперь нужно создать Blend Shape деформацию. Для этого выделим первый дубль, потом добавим к выделению второй, и только после них – оригинал полигональной руки. Дальше Deform => Create Blend Shape по умолчанию.
Теперь, выделив нашу руку, в редакторе атрибутов мы увидим ноду blendShape1 и два её главных параметра: веса обоих наших дублей.
С помощью этих параметров мы и будем контролировать форму руки при сгибе в локтевом суставе.
Теперь свяжем Mesh с polyToSubd1 посредством Wrap: выделяем сначала polyToSubd1, а потом Mesh. Далее - Deform => Create Wrap:
Теперь, если мы скроем 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.
Берём ikHandle (или просто joint2) и сгибаем руку примерно на 90 градусов. В закладке blendShape1 значение Dubl_1 меняем на единицу. Снова нажимаем Key, проверив, чтобы всё было выделено как раньше:
Скрываем Mesh и кости и показываем сабдив и дубликаты. Выделяем Dubl_1 и переходим к редактированию его вершин. Сдвигаем вершины (контролируя результат на сабдиве) с внутренней и внешней сторон локтевого сустава:
Здесь же можно создать и небольшую выпуклость для напряжённого бицепса. Когда результат нас удовлетворяет, можно сохраниться и посмотреть как работает наша система, двигая ikHandle или вращая joint2.
Не очень красиво получается при сгибе градусов на 60 – рука становится слишком толстая:
Это тоже достаточно просто исправить. Выделяем Mesh, и загружаем Graph Editor:
Там выбираем верхнюю joint2.Rotate Y (вверху появится blendShape1.Dubl_1) и нажимаем f:
Выделяем точку, потом её танжент, зажимаем среднюю клавишу и тянем. Также поступаем с другой точкой, пока не получим что-то подобное:
Теперь уже рука выглядит лучше.
Осталось согнуть руку «до упора», в закладке blendShape1 поменять значение Dubl_1 на ноль, а Dubl_2 - на единицу и поставить Key. Редактируем Dubl_2 и наблюдаем результат на сабдиве. Для достижения особо реалистичного результата придётся помучаться, но что-то приемлемое можно сделать достаточно быстро:
Вот собственно и всё! С помощью данной технологии можно добиться весьма точного контроля над вашими моделями и автоматизировать движения мускулов.
Конечно, техника может показаться нелаконичной и запутанной - это из-за того, что урок я построил так, чтобы показать как можно больше сопутствующих нюансов. На самом деле всё, даже и не очень гениальное, просто!