Совместим пивот созданного нами кластера с положением контрольного управляющего локатора IWingControl.
С помощью констрейнов Point и Orient намертво прикрепим наш кластер к управляющему крылом локатору (файл wing17.ma).
Потестируем полученный результат. В принципе основная цель достигнута: и передняя и задняя кромкакрыладвижутсясогласованно,обеадекватнореагируютнаманипуляциисконтрольным управляющим локатором крыла. Деформации перьев при этом вполне удовлетворительные. В качестве последнего штриха добавим пару-тройку управляющих поведением крыла атрибутов, которые кажутся совершенно необходимыми для комфортной работы аниматора.
Во-первых, позволим перьям «растопыриваться», то есть раздвигаться друг относительно друга. Для того, чтобы раздвинуть перья, достаточно отмасштабировать звенья «заднекромочной» цепочки. Если мы хотим равномерно раздвигать перья крыла, мы должны пропорционально отмасштабировать эти самые звенья.
Итак, заведем дополнительный атрибут (назовем его wide) на управляющем крылом локаторе IWingControl. Естественно, это должен атрибут типа Float, и желательно сделать его keyable:
Возможен альтернативный способ: добавить атрибут с помощью простой MEL-команды: addAttr -In wide - keyable true -at double IWingControl ; Свяжем в Connection Editor этот атрибут с масштабированием вдоль локальной оси X кости BackJ:
Это же можно сделать MEL-командой connectAttr f IWingControl.wide BackJ.scaleX; Однако, как мы видим, при изменении атрибута wide масштабируется только кость BackJ, а все дочерние кости «заднекромочной» цепочки остаются неизменными. Дело в том, что у каждой кости есть специальный атрибут Segment Scale Compensate, который отвечает за то, чтобы дочерние кости не наследовали масштабирование своих родителей, который по умолчанию установлен в значение True.
Отожмем галку у атрибута Segment Scale Compensate для всех звеньев «заднекромочной» цепочки и отметим, что теперь при изменении атрибута wide контрольного локатора крыла все перья «растопыриваются» согласованно:
При wide =0.5 имеем следующую картину:
При wide=1.3:
И наконец, крыло птицы достаточно эластично, и при маховых движениях задняя кромка гнется, отставая в своем движении от передней кромки крыла. Причем чем дальше от тела, тем такие изгибы больше (файл wing21.ma).
Каждое перо у нас управляется двумя костями - а# и b# с соответствующими номерами, и конечно, естественно реализовать гибкость или эластичность задней кромки крыла, управляя вращением костей b# относительно локальной оси Z (синяя окружность), однако атрибуты вращения этих костей не свободны, они подчиняются Aim Constraint, который мы вводили (если вы еще помните) для получения скручивающих деформаций перьев:
Как быть? Можно, конечно, воспользоваться технологией смешивания атрибутов (Blend Attributes) для двойного управления поворотами костей Ы,…, Ь9, но после небольшого раздумья нетрудно найти и более простое решение.
Дело в том, что реально Aim Constraint для костей b# влияет только на вращение кости вдоль локальной продольной оси (оси X), а вращения по остальным осям остаются нулевыми, поскольку и кости b# и кости а# направлены на одни и те же объекты. Различия только в Up векторах. Поэтому у дочерних (по отношению к звеньям а#) костей b# вращения по осям Y и Z всегда будут нулевые, а значит, эти атрибуты вращения можно освободить от влияния Aim Constraint без ущерба для общей функциональности. Что мы и сделаем.