Качественный риггинг руки

Меня зовут Загоруйко Александр. Мне 22 года, я работаю в области 3D-графики в течение 5 лет. Сейчас я главный сетапер и разработчик скриптов в студии Artoon в Воронеже. Студия занимается созданием полнометражных мультфильмов. Риггингом я занимаюсь на протяжении последних 3-ех лет и нахожу это занятие весьма интересным и увлекательным. Собственно в этой области я и хочу расти дальше.
Помимо сетапа мне очень нравится программирование в разном виде:
C/C++,Assembler, Pascal, Python, веб-программирование (php, html, js, css ),Java ME, Lisp.
Другие мои интересы: путешествия,психология и музыка ( играю на скрипке, флейте и на гитаре )

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

Основное внимание в этом уроке будет уделено таким темам:
1. Три режима работы руки: IK,FK, ElbowFix
2. Стретч для каждого режима
3. Общее скалирование всей системы
4. Безшвовое переключение режимов IK-FK

Итак, в данном уроке нам предстоит разобрать в деталях как именно делается грамотный риг руки (плеча, предплечья) с необходимым набором возможностей и функций.

Урок рассчитан на достаточно опытных пользователей системы Autodesk Maya , впрочем, все детально объяснено и практически любой начинающий пользователь сможет повторить описанную ниже процедуру.

Начнем по-порядку. Делаем систему из трех костей в начале координат по оси X ( для наглядности мы пока опустим кисть )

Так как кости мы построили строго по оси X, для корректной работы IK-решателя нам необходимо задать "угол-предпочтения" (Preferred angle).
Повернем joint2 по оси Y на -45 градусов и жмем Ctrl+правая-кнопка-мыши. В меню выбираем "Set preferred angle"

Угол предпочтения необходим для того, чтобы IK-решатель знал как именно поворачивать цепочку костей при позиционировании IK-Handle.

Далее, на данном этапе нам нужно сделать 3 копии получившейся системы.
Первая - для FK, вторая - для IK, третья - для ElbowFix ( фиксация локтя )

Выделяем joint1 и жмем Ctrl+d 3 раза. Итого у нас получается 4 системы костей.
А теперь самое время навести марафет. По секрету вам скажу, что порядок в сцене - это 80% хорошего, грамотно-сделанного
сетапа. Такой риг легко отлаживать, заскриптовывать и поддерживать на протяжении всего проекта.

Первую систему ( joint1 ) именуем соответственно arm1_joint, arm2_joint, arm3_joint
Вторую ( joint4 ): armFK1_joint, armFK2_joint, armFK3_joint
Третью ( joint 5 ): armIK1_joint, armIK2_joint, armIK3_joint
Четвертую ( joint 6 ): armElbowFix1_joint, armElbowFix2_joint, armElbowFix3_joint

Создадим несколько "папочек" для организации сетапа в сцене.
Делаем главную родительскую группу arm и помещаем в нее еще одну группу skeleton ( в этой группе мы будем хранить все что связано
с цепочками костей и кинематиками ). Перемещаем в группу skeleton созданные цепочки костей (arm1_joint, armFK1_joint, armIK1_joint, armElbowFix1_joint)

Итого у нас должно получится вот что:

Наведем еще кое-какой порядок в сцене: скроем все атрибуты для группы arm. Запомните, всегда оставляйте в сцене только то, что реально нужно аниматору.
В противном случае вам придется расплачиваться "глюками" под конец проекта :-)

Следующий наш шаг - это настроить каждую систему в отдельности. Начнем с FK.
Давайте скроем все, кроме системы armFK1_joint. Сделаем элементы управления системой FK в виде NURBS-кружков.
Убедитесь, что кружки сориентированы верно, имеют 0 в каналах translate и rotate и 1 в канале scale, а также в истории отсутствует какая-либо информация.
Называем данные контролы соответственно armFK1, armFK2

Помещаем armFK2 в armFK1, тем самым создав FK иерархию для элементов управления.
Далее, соединим контролы и кости: выделяем armFK1_joint и armFK1 и выбираем Constrain->Point->[] ( опции ). Жмем Edit->Reset, а затем Apply.
Также назначим pointConstraint для armFK2_joint и armFK2. В результате у нас каждая кость системы FK управляет по translate соответствующим
элементом управления.

Теперь свяжем вращение контролов и костей. Для этого выделяем последовательно armFK1, armFK1_joint и
выбираем Constrain->Orient->[] ( опции ). Жмем Edit->Reset, ставим галочку Maintain offset, щелкаем Apply.
Аналогично для armFK2, armFK2_joint.
На данном этапе мы имеем кости, управляющие элементами управления по translate, и элементы управления, управляющие костями по rotate.

Наводим порядок: помещаем созданные элементы управления в новую "папку" armFK_controls, которая в свою очередь находится в новой группе arm|controls.
Скрываем лишние атрибуты: у armFK1 оставляем только каналы rotate, у armFK2 только rotateY.

Базовую настройку системы FK мы завершили.

Приступим к IK-системе.
Как и в предыдущий раз скройте все лишнее, оставив только цепочку костей armIK1_joint.
Назначим IK-решатель системе, выбрав Skeleton -> IK Handle Tool -> []. Нажмите Reset. В списке Current solver у вас должно стоять ikRPsolver.
Щелкаем по первой кости (armIK1_joint) в окне проекции,а затем по последней (armIK3_joint).
В результате будет создан решатель инверсной кинематики для цепочек armIK1_joint,armIK2_joint и armIK3_joint.
Назовите полученный ikHandle1 как armIK_IKHandle и поместите его в группу arm|skeleton.

Давайте создадим элементы управления для IK-системы. Сделаем их также из NURBS-кривых.
Создайте кружок и поместите его в район последнего сустава (armIK3_joint). Назовите данный объект armIK.

Для локтя мы сделаем элемент из трех шейпов. Создайте круг в начале координат,а затем еще два. Поверните их соответствующим образом
чтобы получалась сферка.

Далее выделите полученные кривые и запустите следующий скрипт:

{ // Данный скрипт переносит шейпы выделенных объектов под трансформ последнего выделенного объекта
string $ls[] = `ls -sl`; // получить список выделенных объектов
if (`size $ls`<2) error "Select at least 2 object to make parenting"; // сообщить об ошибке, если их меньше двух

$parent = $ls[`size $ls`-1]; // последний выделенный объект - родитель для остальных
for ($obj in $ls){ // пройтись по объектам
if ($obj == $parent) continue; // пропустить, если текущий объект - родитель

parent $obj $parent; // иначе припарентить к родителю текущий объект

string $objShape[] = `listRelatives -f -s $obj`; // получить список шейпов для текущего объекта
makeIdentity -apply true -t 1 -r 1 -s 1 -n 0 $obj; // зафризить их

for ($s in $objShape) parent -r -shape $s $parent; // и припарентить к новому трансформу
delete $obj; // удалить трансформ
}
select -r $parent;
}

После выполнения скрипта у вас останется всего один объект, но с тремя шейпами.
Переименуйте полученный объект в elbowIK.
Поместите эти два объекта в группу arm|controls|armIK_controls.
Скройте лишние атрибуты: у elbowIK оставьте только translate, а у armIK оставьте translate и rotate (для ориентации кисти).

Не назначая констрейнтов, перейдем к системе "фиксированного локтя".
Оставьте в сцене только armElbowFix1_joint. Назначьте инверсную кинематику с решателем ikSCsolver от кости armElbowFix1_joint к кости
armElbowFix2_joint. (Skeleton -> IK Handle Tool ->[], Current Solver = ikSCsolver )
И еще один такой же IK-решатель назначьте от кости armElbowFix2_joint к кости armElbowFix3_joint.
Переименуйте IKHandle1 и IKHandle2 соответственно в armElbowFix1_IKHandle и armElbowFix2_IKHandle и поместите эти объекты в arm|skeleton.

Теперь пришла пора связей.
Выделите elbowIK и armElbowFix1_IKHandle и выберите Constrain->Point ( с базовыми параметрами ).
По аналогии armIK и armElbowFix2_IKHandle.
Свяжите локоть и "хэндл руки" полевекторным ограничителем, выделив elbowIK и armIK_IKHandle и выбрав Constrain->Pole Vector.
Выделите последнюю кость системы ElbowFix ( armElbowFix3_joint ) и armIK, затем выделив armIK_IKHandle и выбрав Constrain->Point ( с базовыми параметрами ).
В последнем случае у нас два объекта управляют одним по translate. Рассчет итоговой трансформации определяется по весам в атрибутах pointConstraint ноды.

Давайте добавим атрибут, управляющий режимом "фиксированный локоть".
Запустите следующую команду:

// добавить атрибут "elbowFix" типа double, изменяющийся в пределах от 0 до 1 с начальным значением 0
addAttr -ln "elbowFix" -at double -min 0 -max 1 -dv 0 -k true armIK;

Если значение этого атрибута равно 0,то используется обычный режим IK, если же 1 - используется ElbowFix.
Сделаем это через управляемые ключи ( Driven keys ). Найдите ноду (узел) armIK_IKHandle_pointConstraint1 ( с двумя управляющими объектами ).
Откройте окошко Set Driven Key, нажав Animate -> Set Driven Key -> Set ...
C помощью Load Driver, Load Driven добейтесь соответствия с изображением. Нам необходимо, чтобы атрибут elbowFix управлял двумя атрибутами у pointConstraint.

Нажимаем Key при таких значениях атрибутов: elbowFix = 0, armElbowFix3_jointW0 = 0, armIKW1 = 1
И еще раз при таких: elbowFix = 1, armElbowFix3_jointW0 = 1, armIKW1 = 0

Настройка режима IK завершена.

Далее у нас по плану связать системы FK и IK с основной, но прежде нужно сделать еще один элемент управления.
Данный контрол нужен для управления рукой в целом (скажем, для переключения кинематик, для принудительного скалирования отдельных суставов и т.д.).
Сделаем флажок, назовем его arm_control и поместим его в arm|controls
Добавим атрибут для переключения кинематики и скроем все лишнее:

// добавить атрибут
addAttr -ln "kinematic" -at double -min 0 -max 1 -dv 0 -k true arm_control;

Свяжем системы IK и FK, запустив скрипт:

{
int $num = 2; // число костей

string $basic = "arm"; // название базовой системы
string $basicFK = "armFK"; // FK система
string $basicIK = "armIK"; // IK система

string $end = "_joint"; // оставшаяся часть в названии без цифр

$attr = "arm_control.kinematic"; // атрибут, управляющий переключением кинематики
for ($i=1;$i<=$num;$i++){
select -r ($basicFK+$i+$end); // сперва выделяем FK кость
select -add ($basicIK+$i+$end); // потом IK
select -add ($basic+$i+$end); // а затем основную

string $oc[] = `orientConstraint`; // в итоге у нас две кости будут влиять на последнюю по rotate

setAttr ($oc[0]+".interpType") 2; // shortness

setDrivenKeyframe -at ($basicFK+$i+$end+"W0") -v 1 -dv 0 -cd $attr $oc[0]; // установка управляющих ключей
setDrivenKeyframe -at ($basicFK+$i+$end+"W0") -v 0 -dv 1 -cd $attr $oc[0];

setDrivenKeyframe -at ($basicIK+$i+$end+"W1") -v 0 -dv 0 -cd $attr $oc[0];
setDrivenKeyframe -at ($basicIK+$i+$end+"W1") -v 1 -dv 1 -cd $attr $oc[0]; }
}

После выполнения скрипта атрибут arm_control.kinematic управляет какая именно система влияет на основные кости (0 - FK, 1 - IK)
Скрипт аналогичен серии команд Set Driven Keys с нужными параметрами.

Скройте все, оставив только систему arm1_joint и arm_control.
Теперь свяжем видимость нужных элементов управления, чтобы,скажем, в режиме FK аниматору были доступны только элементы FK.
Выделите armFK_controls и arm1_joint_orientConstraint1 ( нод, который появился после выполнения скрипта выше ) и
откройте Connection Editor (Windows->General->Connection Editor)

Соедините arm1_joint_orientConstraint1.armFK1_jointW0 с armFK_controls.visibility.
Аналогично соедините arm1_joint_orientConstraint1.armIK1_jointW1 с armIK_controls.visibility.

Теперь у нас отображаются только те элементы, которые нужны для данной кинематики.

Все готово, но у нас еще нет кисти. Давайте создадим ее.
Постройте 3 системы как показано на рисунке, переименуйте их соответствующим образом и поместите в arm|skeleton.

Система handFK1_joint предназначения для управления кистью в режиме FK, а handIK1_joint - для IK.

Выделите armFK3_joint и handFK1_joint и выберите Constrain->Point ( с базовыми параметрами ).
Аналогично armIK3_joint и handIK1_joint и arm3_joint и hand1_joint.

Для режима FK нам понадобиться создать контрол на кисть ( NURBS-круг ). Назовите этот элемент armFK3 и припарентите к armFK2
Сделайте, чтобы кость armFK3_joint управляла armFK3 по translate ( через pointConstraint )

Выделите armFK3 и handFK1_joint и выберите Constrain->Orient ( с Maintain offset ).
Аналогично armIK и handIK1_joint.

У armFK3 оставьте только каналы rotate.

Далее с помощью вышенаписанного скрипта настройте переключение IK-FK для кисти.

{ // Этот код настраивает работу кисти для разных кинематик
int $num = 1; // число костей

string $basic = "hand"; // название базовой системы
string $basicFK = "handFK"; // FK система
string $basicIK = "handIK"; // IK система

string $end = "_joint"; // оставшаяся часть в названии без цифр

$attr = "arm_control.kinematic"; // атрибут, управляющий переключением кинематики
for ($i=1;$i<=$num;$i++){
select -r ($basicFK+$i+$end);
select -add ($basicIK+$i+$end);
select -add ($basic+$i+$end);

string $oc[] = `orientConstraint`;

setAttr ($oc[0]+".interpType") 2; // shortness

setDrivenKeyframe -at ($basicFK+$i+$end+"W0") -v 1 -dv 0 -cd $attr $oc[0];
setDrivenKeyframe -at ($basicFK+$i+$end+"W0") -v 0 -dv 1 -cd $attr $oc[0];

setDrivenKeyframe -at ($basicIK+$i+$end+"W1") -v 0 -dv 0 -cd $attr $oc[0];
setDrivenKeyframe -at ($basicIK+$i+$end+"W1") -v 1 -dv 1 -cd $attr $oc[0];
}
}
791 0 850 38
40
2010-02-04
Охрененный урок, спасибо!!! Молодец! Правда не для начинающий, впрочем, начинающим следует привыкать к хорошему стилю сразу! Оценка 5 баллов!
2010-02-04
Однозначная 5-ка. Хорошие уроки по сетапу на русском - редкость. Я могу ошибаться, но, вроде, при описании стретча опечатка. Переименовываем узел в armIK_stretchOnOff_condition. Соединяем armIK.stretch с armIK_stretchOnOff_condition.firstTerm и устанавливаем armIK_stretchOnOff_condition.secondTerm в 1. Соединяем armIK_minSquash_condition.outСolorR с armIK_minSquash_condition.colorIfTrueR и armIK_minSquash_condition.outСolorG с armIK_minSquash_condition.colorIfTrueG. Правильно (судя по скринам) так. Соединяем armIK_minSquash_condition.outСolorR с armIK_stretchOnOff_condition.colorIfTrueR и armIK_minSquash_condition.outСolorG с armIK_stretchOnOff_condition.colorIfTrueG
2010-02-04
[b]SdvMike[/b] Точно! Спасибо за внимательность :-) Описывать коннекты такое неблагодарное дело)) иной раз проще либо скрин выложить, либо скрипт.
2010-02-05
Санек жжешь. Столько кода....урок по программингу?))) Еще бы C++ сюда бы напихал А так молодец....риг руки конечно тема- "избитее" некуда=) С кой чем я тут не согласен, но уже поздно так как уже прочитали. Ты конечно можешь поправить то что при elbow locking со stretch кисть руки почему то может уехать, но люди уже прочитали и будут мучаться))) Ладно дальше уже придирки. Молодец, поощрю, 5 5 ЗЫ Жди в понедельник с утра нагряну "главный сетапер и разработчик скриптов в студии Artoon" xD ЗЗЫ Scale factor жесть, всего перса еще ладно... а вот руку....так же неудобно скалировать без манипулятора. А почему бы просто значения не умножать на матрицу скалируемой трансформ ноды?
2010-02-05
Xeash, по поводу "главный сетапер и разработчик скриптов в студии Artoon" какие-то проблемы? Он был и остается главным сетапером, навечно.
2010-02-05
Какие вы все молодцы! [b]xeash[/b] Чтобы кисть не уезжала сделай вот что: 1. Найди armElbowFix2_distance_group. 2. Удали pointConstraint у locator5. 3. Создай pointConstraint от armElbowFix2_joint к locator5. И будет счастье!
2010-02-05
[quote]ЗЗЫ Scale factor жесть, всего перса еще ладно... а вот руку....так же неудобно скалировать без манипулятора. А почему бы просто значения не умножать на матрицу скалируемой трансформ ноды? [/quote] Сань, что плохого в возможности скалировать руку? У меня же урок посвящен не всему персонажу,а только руке, стало быть разбираем только эту часть персонажа. Почему неудобно скалировать без манипулятора? Я ни разу не сталкивался с ситуацией,когда нужно было отскалировать персонажа непропорционально.. а проблем с этим я отгреб порядочно. Аниматоры они такие )) оставишь свободные каналы sx,sy,sz, так они парочку из них санимируют "нечаянно".
2010-02-05
[quote=Wiellarifayeretielliy v] Xeash, по поводу "главный сетапер и разработчик скриптов в студии Artoon" какие-то проблемы? Он был и остается главным сетапером, навечно. [/quote] Вова?)) никаких проблем xD [quote=minstrel] Сань, что плохого в возможности скалировать руку? У меня же урок посвящен не всему персонажу,а только руке, стало быть разбираем только эту часть персонажа. Почему неудобно скалировать без манипулятора? Я ни разу не сталкивался с ситуацией,когда нужно было отскалировать персонажа непропорционально.. а проблем с этим я отгреб порядочно. Аниматоры они такие )) оставишь свободные каналы sx,sy,sz, так они парочку из них санимируют "нечаянно". [/quote] Если у тебя на весь перс висит Scale factor проблем нет. Все логично. Я насколько помню ты делаешь как: у тебя есть scale factor на rig part скажем рука левая и рука правая. И есть 1 глобальный Scale factor, который управляет скейл факторами....Получается такая сеть scale factor'ов, которые влияют на дистансы. Согласись если бы ты делал через скейл матрицы то у тебя все было модульнее и логичнее(никаких "сетей соединений") и не нужно было никаких дополнительных аттрибутов. Ты сможешь создать поверх сколько угодно родительских трансформ нод и риг у тебя всегда будет хорошо скалироваться. А насчет лишних ключей, scale factor = натянутое решение. Ведь scale factor тоже аттрибут который тоже можно случайно заанимировать(если он анимируемый). Поэтому тут уже нужно искать другие решения насчет локинга лишних аттрибутов, если уж на то пошло. Естественно все это имхо
2010-02-05
[b]xeash[/b] Не знаю,Сань, спорно это все на мой взгляд.
2010-02-06
Спасибо, автору за труд! В целом хороший урок. [quote]Столько кода....урок по программингу?))) Еще бы C++ сюда бы напихал[/quote] 2Xeash: что в этом плохого? Прокомментируй
2010-02-06
ZIS, да ничего плохо он наверное не имел в виду, т.к. понимает, что программирование неотъемлемая часть сетапа в Мауа. Без кода только моделирование.
2010-02-07
Максисты полистали, задумались, позавидовали, и понаставили минусов xD
2010-02-07
Было бы чему завидовать
2010-02-07
Я просто поражаюсь, опять МАХ-истов зацепили, так у кого всётаки комплексы? :) Поставил 5/5 потому что Майщики васхещаются!
2010-02-07
[quote=OrcSWAT] Я просто поражаюсь, опять МАХ-истов зацепили, так у кого всётаки комплексы? :) Поставил 5/5 потому что Майщики васхещаются! [/quote] А я поражаюсь сколько позёрства у майщикоа. А по сути ничего за этим позёрством пустота ... и это печально( ЗЫ От голосования воздержался
2010-02-07
Посмотрел урок мельком. Непонятен один момент. Все тот же спорный scale factor. При значении scale factor > 1 рука не выпрямляется... А в общем, отличный, полезный урок :) 5/5
2010-02-07
[b]Артём Ягодин[/b] Да уж, видимо не тот файл прикрепился. ArmFinal.ma - финальный файл, но без настроенного scaleFactor. Можно просто запустить скрипт для настройки и все будет работать. createNode multDoubleLinear; // узел, перемножающий два значения rename multDoubleLinear1 "armIK_scaleFactor_multDoubleLinear"; connectAttr main.scaleFactor armIK_scaleFactor_multDoubleLinear.input1; // scaleFactor setAttr armIK_scaleFactor_multDoubleLinear.input2 4; // умножаем на 4 connectAttr armIK_scaleFactor_multDoubleLinear.output armIK_multiplyDivide.input1Y; // и соединяем результат с атрибутом, где раньше была 4 connectAttr armIK_scaleFactor_multDoubleLinear.output armIK_multiplyDivide.input2X; //-------------- createNode multDoubleLinear; // аналогично rename multDoubleLinear1 "armElbowFix1_scaleFactor_multDoubleLinear"; connectAttr main.scaleFactor armElbowFix1_scaleFactor_multDoubleLinear.input1; setAttr armElbowFix1_scaleFactor_multDoubleLinear.input2 2; connectAttr armElbowFix1_scaleFactor_multDoubleLinear.output armElbowFix1_multiplyDivide.input1Y; connectAttr armElbowFix1_scaleFactor_multDoubleLinear.output armElbowFix1_multiplyDivide.input2X; //-------------- /* В нашем случае мы могли бы и опустить этот кусок ( и использовать нод,созданный выше ), так как у нас длины костей armElbowFix1_joint и armElbowFix2_joint совпадают. Но на практике длины плеча и предплечья редко совпадают. */ createNode multDoubleLinear; rename multDoubleLinear1 "armElbowFix2_scaleFactor_multDoubleLinear"; connectAttr main.scaleFactor armElbowFix2_scaleFactor_multDoubleLinear.input1; setAttr armElbowFix2_scaleFactor_multDoubleLinear.input2 2; connectAttr armElbowFix2_scaleFactor_multDoubleLinear.output armElbowFix2_multiplyDivide.input1Y; connectAttr armElbowFix2_scaleFactor_multDoubleLinear.output armElbowFix2_multiplyDivide.input2X;
2010-02-10
Опять что-ли холивар? По уроку - ничего не понял! Много букф!
2010-02-11
Пролистнул... и ничего не уловил. Но урок закину в закладки - ибо переходить на майю прийдется рано или поздно =)) А за урок 5\5. з.ы. "так же неудобно скалировать без манипулятора. А почему бы просто значения не умножать на матрицу скалируемой трансформ ноды?" ВЫНОС МОЗГА =)
2010-04-12
очень интересно :)
2010-04-14
Так... Санёк фишки выкладывает... Видимо проект закончен?)
2010-04-17
я думал это без скриптов делается
2010-04-18
[quote=gecka] я думал это без скриптов делается [/quote] Скрипт - это всего лишь способ автоматизации ручных действий. Все перечисленное можно было бы сделать и вручную, только какой толк писать об этом в таком виде: "соединям атрибут blendTwoAttr2.output с атрибутом condition1.colorIfTrueR". Это не очень наглядно и к тому же можно легко ошибиться. Лучше написать скрипт, который не ошибается и четко показывает нам схему работы.
2010-06-01
привет земляку!!!)) спасибо за урок, все достаточно просто и гениально ... есть один вопросик ... когда вставляется оснастченный персонаж в сцену инстансом, все имена объектов переписываются ... что делать со скриптом, преписывать в ручную имена, или есть лекарство? подскажи пожалуйста, а то у меня стопор ... как-то не мобильно со скриптом получается.... в выражениях куда ни шло ... там все автоматом меняется ...
2010-06-01
[quote=ClinicalFilm] привет земляку!!!)) спасибо за урок, все достаточно просто и гениально ... есть один вопросик ... когда вставляется оснастченный персонаж в сцену инстансом, все имена объектов переписываются ... что делать со скриптом, преписывать в ручную имена, или есть лекарство? подскажи пожалуйста, а то у меня стопор ... как-то не мобильно со скриптом получается.... в выражениях куда ни шло ... там все автоматом меняется ... [/quote] Привет! я ответил по этой теме тебе в топик ) "Это называется пространством имен или неймспейсом. А решается это просто: сам скрипт должен уметь обрабатывать неймспейсы, Скажем: 1. У тебя есть контрол leg 2. Ты импортнул перса в сцену 3. Теперь у тебя имя объекта my_pers:leg Реально в сцене может быть сколько угодно таких персонажей и твоя панелька должна работать с каждым из них. Единственное,что меняется у таких персонажей - неймспейс. Возьмем такую процедуру (она определяет выделена ли нога персонажа): proc isLegSelected(){ string $ls [] = `ls -sl`; // список выделенных объектов string $buffer[]; int $size = `tokenize $ls[0] ":" $buffer`; // разбить строку на части if ($buffer[$size-1]=="leg") print "Leg is selected"; } Суть такова - берешь имя объекта, вычленяешь неймспейс и работаешь с конкретным именем. "
2011-01-06
Какими фильмами может похвастаться ваша студия?
2011-01-06
[quote=Shaibanihan] Какими фильмами может похвастаться ваша студия? [/quote] У нас пока только один законченный проект и он скоро должен выйти в прокат. На данный момент делаем второй мультфильм.
2011-08-19
хороший урок, с припозданием поставил 5/5 несмотря на все неровности... ну и немного критики, странно что никто не высказался... но думаю автору будет полезно 1. делать такой сетап с 3 цепочками костей это древний олдскул, так щя никто не делает, все можно сделать с одной и риг будет быстрее 2. что за ElbowFix , зачем она нужна? все ее возможности в анимации с лихвой реализует FK, только утяжеляешь риг, а риг должен быть легкий по максимуму, без ненужных фишек 3. IK для кисти это даже хуже ElbowFix) совершенно ненужная вещь опять добавляющая путаницы аниматору и бесполезная 4. вот что стоит добавить это скейл костей по отдельности, это незаменимая вещь при создании силуэта 5. создание стретча на нодах дивайд и нодах условий это write only метод, тоесть если кто-то будет дорабатывать за тобой риг - он тебя проклянет тк в мае ужасный гиперграф и фиг поймешь что ты там насоединял, чтобы было быстро, читабельно и исправимо - загнать все на питоне в одну ноду 6. тут все так только с точностью до наоборот "На обычном языке это звучит так: если Скалирование-по-оси-Х будет меньше,чем minSquash, то вернуть минимальное скалирование ( minSquash, 1/minSquash ), иначе вернуть реальный скейл ( нод multiplyDivide )" 7. Мне он очень нравится, наверное потому что я его сам и придумал ( вроде бы не встречал аналогий, хотя способ гениален ) ... ну какбе плохо искал ты в инете)) но велосипеды тоже поощряются... у тебя упрощенная версия нормального способа, который ну совсем не секрет и юзется оч давно, да и другого я не встречал, на нормальном риге с нормальным оттянутым от сустава локтевым контролом твой укороченый способ не сработает... за такой контрол в локте аниматоры могут наложить проклятье) 8. "Для чего данная группа? А вот для чего: выделите armFK3 и эту группу и выберите Constrain->Point ( без Maintain offset ) и Constrain->Orient ( C Maintain offset! ) " - тут совершенно пофигу с Maintain offset или без или перент ваще сделать а так молодца канешно!)
2011-08-19
[quote=ыых] 1. делать такой сетап с 3 цепочками костей это древний олдскул, так щя никто не делает, все можно сделать с одной и риг будет быстрее [/quote] Ежели можно было бы быстрее сделать - отлично. Можете подсказать решение с одной цепочкой? [quote=ыых] 2. что за ElbowFix , зачем она нужна? все ее возможности в анимации с лихвой реализует FK, только утяжеляешь риг, а риг должен быть легкий по максимуму, без ненужных фишек [/quote] Лично мне не очень понятно каким образом ФК реализует возможности ElbowFIX. Как вы будете фиксировать локоть в режиме ФК, если, скажем, персонаж поставил его на стол? [quote=ыых] 3. IK для кисти это даже хуже ElbowFix) совершенно ненужная вещь опять добавляющая путаницы аниматору и бесполезная [/quote] Что вы имеете в виду? [quote=ыых] 4. вот что стоит добавить это скейл костей по отдельности, это незаменимая вещь при создании силуэта [/quote] В общем да, такую штуку забыл добавить в урок. Принудительное скалирование на каждый сустав. [quote=ыых] 5. создание стретча на нодах дивайд и нодах условий это write only метод, тоесть если кто-то будет дорабатывать за тобой риг - он тебя проклянет тк в мае ужасный гиперграф и фиг поймешь что ты там насоединял, чтобы было быстро, читабельно и исправимо - загнать все на питоне в одну ноду [/quote] Мой взгляд на этот вопрос: 1. На базовых нодах FPS вполне хороший. 2. В студии мы программируем наши сетапы и нам нет необходимости разбираться в уже сгенерированном риге - вместо этого мы смотрим код. 3. Не в моем стиле делать собственные ноды для тех случаев, когда можно обойтись стандартными возможностями. [quote=ыых] 7. Мне он очень нравится, наверное потому что я его сам и придумал ( вроде бы не встречал аналогий, хотя способ гениален ) ... ну какбе плохо искал ты в инете)) но велосипеды тоже поощряются... у тебя упрощенная версия нормального способа, который ну совсем не секрет и юзется оч давно, да и другого я не встречал, на нормальном риге с нормальным оттянутым от сустава локтевым контролом твой укороченый способ не сработает... за такой контрол в локте аниматоры могут наложить проклятье) [/quote] Мы используем данный способ и проблем с переключением нет. Аниматоры не ругаются. [quote=ыых] 8. "Для чего данная группа? А вот для чего: выделите armFK3 и эту группу и выберите Constrain->Point ( без Maintain offset ) и Constrain->Orient ( C Maintain offset! ) " - тут совершенно пофигу с Maintain offset или без или перент ваще сделать [/quote] Без Maintain Offset можно было бы делать, если бы вы были точно уверены, что у вас одинаковая ориентация у FK и IK контрола. В общем случае Maintain Offset нужен.
2011-08-19
Тоже с запозданием немного. 5/5... И тоже чуток замечаний. На мой естественно взгляд. "Скрываем лишние атрибуты: у armFK1 оставляем только каналы rotate, у armFK2 только rotateY...." - Лишние атрибуты в контролах я не только скрываю, но и лочу. А то манипулятором даже скрытые атрибуты можно случайно подергать. IK/FK я по крайней мере предпочитаю на одной цепочке. Все же проще и не менее функционально. Режим ElbowFix - интересно ( как раз сейчас делаю один сетап, попробую). Я бы добавил еще один режим. IK c динамической кривой. Режим "безвольно болтающейся руки". Часто в таком режиме двигаются руки, если перс оглядывается назад.
2011-08-19
ко мне можно и на ты, я не так стар и уважаем) по 1. все просто до безобразия- начиная вроде с 2008 маи в икхендле есть атрибут ikBlend 2. чтобы делать юзерфрендли риги нужно начать самому анимировать [quote] Как вы будете фиксировать локоть в режиме ФК, если, скажем, персонаж поставил его на стол?[/quote] не совсем понял в чем проблема, именно в случае когда персонаж поставил локоть на стол используется FK, локоть недвигается пока не начшешь двигать плечевую кость, а предплечьем можно махать свободно, 2 случай когда ИК удобней ФК - свободные руки в походке или замах рукой, а любые опирания на кисть или попыики попасть кудато кистью- ИК... с ногами ФК нужен наверное только при позе нога на ногу, ну и не говорю уже что нет снапа из этого ElbowFix в IK, вобщем как по совместительству аниматор я не вижу применения этой фищки 3. переключатель ИК -ФК на кисти нафиг не нужен, это просто не удобно- чтобы поставить кисть в позу тебе надо будет ее повернуть в одной плоскости твистом, а чтоб наклонять в другой плоскости за ик контрол тягать... нафига?? все отлично крутится в ФК 5. по поводу того что делать вместо экспрешенов нодами это круто и быстро считается , не спорю, но если собирать что-то большое и навороченое - это нереально тк всегда есть процесс отладки и испытания идей и последующих изменений, в гуде да -замечательный граф для нод , но в мае это ад, поэтому чтобы совместить плюсы кода и скорость скомпиленых нод - лучше делать свои ноды на питоне, на питоне это уже не так геморно как на С++ 7. добрые аниматоры у вас, но я какбы просто делаю замечания как сделать лучше, дальше уже дело риггера, между локтем и полвектор контролом всегда должно быть свободное пространство тк при сдвиге локтя назад он просто флипится и аниматору надо его постоянно оттягивать в то время как анимировать он должен его по назначению те для поднятия и опускания локтя , а не для убирания глюков... но тут конечно твой снап ИК к ФК не сработает... хотя он не сработает и из-за системы в одну цепочку, но в таком варианте снап легко реализуется ) оставляю на самостоятельный R&D, там ничего космического нет) Ты наверняка видел риг Victora Vinyals - с точки зрения аниматора это эталонный картунный риг, разве что нет скейла отдельно по костям, на него и ровняйся, у него кстати на 1 цепочке конечности
2011-08-19
2 случай когда ИК удобней ФК - свободные руки в походке или замах рукой - тут наоборот ФК удобней ИК
2011-08-19
[quote]Я бы добавил еще один режим. IK c динамической кривой. Режим "безвольно болтающейся руки". Часто в таком режиме двигаются руки, если перс оглядывается назад.[/quote] аниматоры такое очень не любят, теже плечи, которые всегда поднимаются с руками нельзя автоматизировать, будут ругать))
2011-08-19
Ыых, ElbowFix нужен, как я понимаю, когда локоть стоит на столе, а двигается не только предплечье, но и тело. С FK тело не подвигаешь - локоть сдвинется.
2011-08-19
Klich согласен, такой экзотический вариант может произойти, типа перс раскачивает тело и одновременно обмахивает себя газетой и это при упертом локте, НО скорее всего в седующую секунду потребуется IK чтобы встать а переключалка без снапа, чтобы сделать снап нужно будет учитывать , что плечевая кость скорее всего будет застретчена тк отслеживать это трудно... вобщем конечно имеет право быть фишка для этого редкого случая, но это надо доводить до ума без снапа это нерабочий вариант тк прийдется подгонять при переключении, а это практически тоже самое , что на 3 взмаха аккуратно поправить ИК чтоб локоть оставался на месте ...
2011-08-19
[quote]по 1. все просто до безобразия- начиная вроде с 2008 маи в икхендле есть атрибут ikBlend[/quote] Мы данный режим еще давно забраковали - оказалось неудобно и не особенно функционально. Если есть файл с хорошим ригом руки по этой технологии - пришли, пожалуйста. Интересно посмотреть на некоторые моменты. Описать их просто трудно. [quote]3. переключатель ИК -ФК на кисти нафиг не нужен, это просто не удобно- чтобы поставить кисть в позу тебе надо будет ее повернуть в одной плоскости твистом, а чтоб наклонять в другой плоскости за ик контрол тягать... нафига?? все отлично крутится в ФК [/quote] Ну переключатель кинематик можно вынести куда-то еще. Это не так принципиально. В наших сетапах, скажем, общие атрибуты для всех кинематик весят на дополнительном контроле-флажке: переключение кинематик, принудительное скалирование и т.д. У каждого контрола есть менюшка и через нее очень даже удобно переключать паренты или кинематики - работай хоть в ИК, хоть в ФК. [quote]7. добрые аниматоры у вас, но я какбы просто делаю замечания как сделать лучше, дальше уже дело риггера, между локтем и полвектор контролом всегда должно быть свободное пространство тк при сдвиге локтя назад он просто флипится и аниматору надо его постоянно оттягивать в то время как анимировать он должен его по назначению те для поднятия и опускания локтя , а не для убирания глюков... но тут конечно твой снап ИК к ФК не сработает... хотя он не сработает и из-за системы в одну цепочку, но в таком варианте снап легко реализуется ) оставляю на самостоятельный R&D, там ничего космического нет)[/quote] Свободное пространство между локтем и контролом добавляется просто - это уже дополнение. В уроке не получилось рассказать обо всех прям тонкостях - некоторые вещи я упустил, некоторые я только позже узнал как делать. Главное тут - технология. Вот, к примеру, на нашем рабочем сетапе все это сделано и работает без глюков. [quote]Ты наверняка видел риг Victora Vinyals - с точки зрения аниматора это эталонный картунный риг, разве что нет скейла отдельно по костям, на него и ровняйся, у него кстати на 1 цепочке конечности [/quote] Прямо так и скажу, что наш сетап отнюдь не хуже сетапа Витьки. Да и у него там в общем-то стандартные возможности. [quote]Ыых, ElbowFix нужен, как я понимаю, когда локоть стоит на столе, а двигается не только предплечье, но и тело. С FK тело не подвигаешь - локоть сдвинется. [/quote] Правильное уточнение. Локоть фиксируется независимо от положения тела.
2011-08-20
ладно, не буду спорить, каждый сам решает, я так понял тяжестью рига вы не заморачиваетесь, у Виктора в риге не стандартые возможности, а максимально оптимизированные , есть все что нужно и нечего лишнего, ну кроме скейла костей , хотя я думаю он мог бы еще кучи фигни прилепить, типа шоб круто было... я видел перевешанные риги где реально использовалось 2/3 возможностей а оставшаяся треть просто ела фпс ... + кажый аниматор знает , что будет фазовка, и чем меньше атрибутов он заанимирует тем больше счастья ему будет
2011-12-12
По моему проще все руками сделать, чем вникать во все премудрости данного скрипта. Хотя тому, кто умеет видимо просто. Очень много времени нужно на понимание написанного!
2011-12-12
[quote=m.r.k.] По моему проще все руками сделать, чем вникать во все премудрости данного скрипта. Хотя тому, кто умеет видимо просто. Очень много времени нужно на понимание написанного! [/quote] Описывать сложные технические вещи так,чтобы было понятно даже самому начинающему сетаперу - целое искусство. Попробуйте объяснить начинающему музыканту как сыграть Чакону Баха. Тут примерно также. Если не понятно - не заморачивайтесь, придет время - разберетесь. ПС: По-моему, описывать все действия словами намного более заморочно и непонятно. Умение программировать и понимать код - неотъемлемая часть разработки сетапов.
2017-06-05
Спасибо отличный урок! Тяжеловато разбираться изза обилия скрипта, но в целом все понятно, почерпнул массу новой информации!
RENDER.RU