Например, для MAYA, угол по оси Y, равный значению 272 и -88 - одно и тоже, только вот первая цифра, уж поверьте, никак не понравится ни одному сетапщику в мире. Если не изменить порядок вращения кости, при переходе через значение -90 градусов, может возникнуть «щелчок» в прискиненной геометрии, если этот угол был использован в сетапе для вычисления twist-поворота и последующих деформаций.
Неизбежны щелчки только при повороте более 180 градусов. Но на это можно не обращать внимание, так как у нас нет ни одного сустава, который бы вращался столь сильно.
Посмотрите на рисунки. Как видите, даже цифры при сложении поворотов двух костей отличаются от значений исходной ball joint. Хотя ориентация конечных костей идентична! Можете легко проверить это, прицепив в первом кадре к balLjoint и twist_joint два одинаковых куба и проиграв анимацию.
В файле additional_arm_joints.mb в качестве более сложного примера продемонстрирован один из вариантов этой технологии для корректировки skin-деформации.
Дополнительные кости внутри геометрии. Обратите внимание на то, что в случае с запястьем, у Aim Constraint атрибут World Up Туре переключен в режим Object Rotation Up для того, чтобы привязать ир-вектор к ориентации кисти руки. Для этого в атрибут World Up Object нужно прописать имя этой кости. Это служит подобием якоря для Aim Constraint, и, таким образом, между кистью руки и дополнительной костью нет twist-вращения, что соответствует анатомии. Само twist-вращение распределяется между дополнительными костями от локтя до запястья.
Но полученный twist-угол может использоваться не только для вращении костей. Также вы можете его использовать для управления скручиванием в деформерах Twist и Wire, которые в некоторых случаях могут более успешно заменить Skin-деформер, особенно для cartoon-персонажей.
Для корректировки skin-деформации в локтях (а также в коленях и на сгибах пальцев) я рекомендую построить дополнительную кость и с помощью Orient Constraint привязать ее ориентацию к двум соседним костям, чтобы она всегда была развернута между ними. Эта кость будет подправлять область сгиба, если для нее толково настроить веса. К ней можно добавить еще одну кость, которую можно двигать, вращать и масштабировать относительно поворота первой, для более тонких манипуляций.
Совет. Не забудьте переключить параметр interpType в Orient Constraint в значение Shortest, для того чтобы в некоторых случаях избежать неправильного решения работы ноды.
В заключение хочется добавить, что для разделения сложных вращений можно, при желании, воспользоваться вместо Aim и Orient Constraint работой ikSCsolver. Пытливые умы в качестве разминки могут проделать эту работу сами.
MEL
или MAYA Embedded Language
Заранее предупреждаю: эстетствующие умы, имеющие аллергию на слова «программирование» и «скрипты», могут с отвращением и ужасом пропустить эту главу без ущерба для дальнейшего чтения. В последующих главах я не буду злоупотреблять многостраничными скриптами, отсылая читателя к этой главе. Так что решение спрятаться от MEL лежит целиком на вашей личной совести. Могу сказать лишь одно: если избегать MEL во всех его проявлениях, то рано или поздно это скажется на производительности и эффективности вашей работы. Кроме того вы лишаете себя возможности небрежно блеснуть перед коллегами модной фразой типа «я это делаю полностью процедурно, с помощью MEL».