Для определения координат выбранной точки в мировой системе координат можно, конечно, воспользоваться MEL-командами pointPosition или xform, однако применение MEL-команд в данной ситуации абсолютно неоправданно - с их использованием мы потеряем интерактивность работы, поэтому придется воспользоваться несколько иными приемами.

Создадим десять дополнительных локаторов orientLO,…, orientL9 и с помощью Point Constraint прикрепим эти локаторы к костям backJ, backJ_1,…, backJ_9.

За счет Point Constraint созданные локаторы будут намертво прикреплены к сочленениям костей, оставаясь при этом в исходной мировой системе координат, и атрибуты translateX, trans-lateY, translateZ этих локаторов и будут координатами сочленений в мировой системе координат.

Разность координат пары локаторов, прикрепленных к визуальному «началу» и «концу» каждой кости, и даст нам необходимый вектор направления этой кости, который мы будем использовать в качестве ориентации Up Vector.

Итак, командой createNode создаем ноду plusMinusAverage (по умолчанию она получит имя plusMinusAveragel) и не забудем установить операцию Substract.

На входы этой ноды подаем координаты двух локаторов: на первый вход - координаты «конца» (локатора orientL.1), а на второй вход координаты «начала» (локатора orientLO).

Для этой цели можно воспользоваться простыми MEL-командами:

createNode plusMinusAverage;

connectAttr -f orientLI .translate plusMinusAveragel ,input3D[0]; connectAttr -f orientLO.translate plusMinusAveragel .input3D[1];

Tеперь осталось с помощью Aim Constrait направить кость Ы на backJ_1, выбрав в качестве Aim Vector направление продольной локальной оси X (вектор <<1,0,0>>), в качестве Up Vector

- направление локальной оси Z (вектор <<0,0,1>>), то есть World Up =«Vector», и в качестве World Up Vector - результат вычитания координат локаторов, то есть выход ноды plusMinusAveragel.

Для остальных костей (Ь2,…,Ь9) поступаем аналогично.

Потестировав полученную конструкцию, убедимся, что теперь перья не только следуют движениям управляющего локатора, но и всегда направлены на звенья дополнительной «заднекромочной» цепочки. Кроме того, перья при этом еще и скручиваются в соответствие с разностью ориентаций передней и задней кромок крыла (файл wing15.ma).

Осталось совсем немного - заставить заднюю кромку крыла реагировать на наши манипуляции с управляющим локатором.

Для этого на всю «заднекромочную» цепочку костей навесим IK Spline Handle, постаравшись минимизировать число контрольных точек сплайновой кривой (их должно получиться всего четыре, и этого вполне хватит для реализации задуманного нами управления).

Точки возникшей кривой для IK Spline Handle объединяем в кластер.

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

Руководствуемся при этом общим правилом - чем ближе «к телу», тем вес меньше.


⇐ вернуться назад | | далее ⇒