Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Профессиональная_3D_анимация._Риггинг_и_деформа...doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
2 Мб
Скачать
☆

Глава 2

ИК-решатели и их применение

Несмотря на то, что создание фото-реалистичной анимации действительно стало вехой в компьютерной анимации, многие другие продукты созданы с использованием наследия двумерной мультипликации для создания более причудливых существ. Одна из самых ценных идей традиционной двумерной анимации – сжатие (squash) и растяжение (stretch). Идея состоит в том, что по мере деформации персонажа его объем не меняется. Если нога персонажа растягивается, то она становится тоньше. Чтобы воссоздать в 3D стиль 2D анимации, важно наделить 3D персонажа этим качеством.

Построение узлов растяжения и сжатия

Для начала организуем простое управление сжатием и растяжением. Эту управляющую систему можно применить ко всем узлам мультипликационного персонажа. Она дает аниматору возможность пропорционально изменять объем персонажа.

Самый распространенный способ растяжения в компьютерной анимации – оперирование неоднородным масштабом (non-uniform scale) сочленений или объектов в сборке персонажа. В Maya это особенно просто, потому что независимое масштабирование узлов сочленений устанавливается автоматически. Это позволяет аниматору осуществлять локальное управление масштабом объекта, не деформируя другие части иерархии (рис. 2.1).

@Рис. 2.1. Эффекты компенсации масштаба. В иерархии слева компенсация отключена. В иерархии справа компенсация масштаба не допускает влияния масштаба одного из сочленений на подчиненные ему сочленения

Традиция использования неравномерного масштаба вполне логична и естественна. Однако движки некоторых игр могут не поддерживать неравномерный масштаб. В этих обстоятельствах можно подогнать его с помощью управления перемещением и равномерным масштабом нужных узлов.

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

В этом примере мы собираемся использовать стандартный иструмент Maya joint-orient (ориентация суставов), который предполагает, что параметр scaleX управляет уменьшением масштаба величины сочленения. Чтобы соотнести эти атрибуты, мы адаптируем формулу объема к атрибутам масштаба. Объем определяется по следующей формуле:

a * b * c = Объем,

где a, b и c – длина, ширина и высота соответственно. Мы заинтересованы не в самом объеме, а в том, как изменение одного из множителей размера объекта должно быть компенсировано другими множителями, чтобы объем остался неизменным. Так как другие атрибуты будут равны, мы можем упростить формулу следующим образом:

a * b * b = Объем

a * b2 = Объем

Мы будем управлять a (параметр scaleY), так что нам нужно определить значение других двух атрибутов. В этом примере объем равен единице. Для каждого значения мы получим следующее:

b = sqrt(1/x)

Эта формула не показывает фактический объем объекта, это зависит от его геометрии. С ее помощью мы пытаемся оперировать постоянным множителем размера. Если мы представим объект как куб, длины сторон которого равны 1, то в результате этих операций получим объем, равный 1.

Следующие упражнения иллюстрируют, как использовать эти формулы и utility-узлы для добавления сочленению свойства сжатия/растяжения:

1. На боковом виде изобразите ногу с сочленениями. Не беспокойтесь насчет применения ИК на этом этапе: мы перейдем к ней позже, в этой главе. Назовите сочленения LHip, LKnee, LAnkle, Lball и LToe соответственно. Нога должна быть похожа на ту, что на рисунке (рис. 2.2).

2. Выделите сочленение LHip. В Attribute Editor (Редактор атрибутов) выберите пункт меню Attributes Add Attribute (Атрибуты  Добавить атрибут).

3. В окне Add Attribute введите stretch в поле Attribute Name (Имя Атрибута) Убедитесь, что Data Type (Тип данных) установлен на float. В поле Minimum (Минимум) введите значение 0.1, а в поле Default (По умолчанию) – значение 1. Важно понимать, что управление растяжением – это множитель размера, на который потом будут делиться другие значения узла. В Maya жесткая система узлов, так что во избежание ошибок старайтесь не допускать ситуаций, когда придется делить на ноль.

@Рис. 2.2. Иерархия сочленений ноги

4. Выделите узел LHip. Используйте меню Display Component Display Local Rotation Axis (Показать  Показать элементы  Локальные оси вращения), чтобы отобразить ориентацию сочленения. Чтобы обеспечить управление растяжением, вы должны будете определить, какой множитель уменьшает длину сочленения. Если вы применяете установки по умолчанию инструмента Joint, то сочленение должно сориентироваться так, чтобы ось Х была направлена вниз по длине кости.

Врезка. В Maya функция ориентации сочленения направляет его на первое дочернее ему сочленение. В таких ситуациях, как с запястьем, ось может не ровняться основной массе руки. В этом случае редактируйте Local Rotation Axis, чтобы привести ось в нужное положение.

5. В Hypershade создайте узел multiplyDivide. Назовите его LHipInverse.

6. В Hypergraph соедините атрибут scaleX сочленения LHip с атрибутом inputX2 узла LHipInverse (рис. 2.3).

7. Отройте узел multiplyDivide в Attribute Editor и установите Operation на divide (деление). В первом поле Input1 введите значение 1.0. Щелкните на поле правой кнопкой мыши и выберите в контекстном меню пункт Lock Attribute (Заблокировать атрибут).

8. В Hypershade создайте еще один узел multiplyDivide. Назовите его LHipSquareRoot. Соедините атрибут outputX узла LHipInverse с атрибутом input1X узла LHipSquareRoot. Откройте Attribute Editor и установите Operation на power (степень). В первом поле Input2 введите 0.5. Щелкните на поле правой кнопкой мыши и выберите в контекстном меню пункт Lock Attribute.

9. Соедините outputX этого узла с параметрами scaleY и scaleZ сочленения LHip.

10. Наконец, откройте Connection Editor. Выделите LHip и нажмите на клавиши Reload Left (Перезагрузить левый) и Reload Right (Перезагрузить правый). Соедините атрибуты растяжения этого сочленения с атрибутом scaleX. Закончив, Вы увидите похожую на изображенную здесь схему узлов (рис.2.4).

@Рис. 2.3. Атрибут scaleX соединен с узлом multiplyDivide

Теперь, когда вы управляете параметром растяжения, два других множителя размера компенсируются, чтобы сохранить объем сочленения (рис. 2.5). Если вы повторите этот процесс для всех сочленений, то увидите скелет с полностью исполненными сжатиями и растяжениями на каждом сочленении. Однако повторять это скучно, так что мы сделали MEL-сценарий, позволяющий вам делать это повторно.

@Рис. 2.4. Законченная сеть узлов растяжения

@Рис. 2.5. Атрибут растяжения сочленения LHip

Чтобы применить скрипт, скачайте его с Web-сайта http://courseptr.com/downloads. Теперь выделите узел или группу узлов. Убедитесь, что у всех узлов одна и та же ось растяжения. В командной строке введите команду makeSandS, а за ней в кавычках ось растяжения. В этом примере, когда растяжение направлено по осиX, команда выглядит вот так:

makeSandS(“X”);

Выделив один из узлов, с которыми вы запустили этот сценарий, вы заметите, что теперь у него есть атрибут stretch. Отрегулируйте его значение, чтобы увидеть сжатие и растяжение узла. Вы также заметите, что атрибутам масштаба не могут быть назначены ключевые кадры. Эта небольшая часть сценария, создана с целью лучшей организации сцены. Так как атрибуты масштаба теперь не могут редактироваться непосредственно пользователем, хорошо бы убрать их из Channel Box.

Нужно также держать в уме, что в этом примере за минимальное значение растяжения было принято число .1. Это значение абсолютно произвольно, но вы наверняка обнаружите, что если выставить коэффициент растяжения меньше .1, то модель искажается слишком сильно, учитывая постоянность объема. Вы вольны установить минимум, исходя из нужд вашего проэкта.

Встраивание растяжения в систему ИК

Теперь, когда мы применили сжатие и растяжение в системе прямой кинематики – ПК (Forward Kinematics – FK), пора обратиться к ИК (Inversive Kinematics – IK). «Растягивающаяся ИК» («stretchy IK») – термин, часто используемый для описания такой системы, в которой сочленения, управляемые контроллером ИК, растягиваются вместе с перемещением контроллера за пределы уже установленной длины сочленения.

Одно из свойств хорошей анимации – пространственные отношения между последовательными кадрами анимации. В традиционной анимации нога персонажа, совершающего прыжок, может растянуться перед приземлением. Такое чрезмерное растяжение создает визуальную продолжительность. В 3D размытие в движении зависит от его пространственной организации, но прелесть традиционной мультипликации – в умении преувеличивать.

Чтобы создать управляемую инверсной кинематикой систему растяжения, припишите сочленению Lknee параметр растяжения с помощью вышеписанных процедур или MEL-сценария makeSandS, или откройте файл sampleLeg.ma. Вы можете найти этот файл на сайте http://courseptr.com/downloads. Всем сочленениям системы ИК нужно добавить атрибут растяжения, как в следующем упражнении.

1. При помощи инструмента IKHandle перетащите ИК-манипулятор от сочленения LHip до LAnkle.

2. Создайте NURBS-окружность. Она будет служить контроллером сочленения. Используя точечную привязку (point snapping), разместите окружность на лодыжке.

3. Выделите ИК-манипулятор и прикрепите его к окружности.

Переключитесь на боковой вид. Создайте узел дистанции (distance node) с помощью меню Create Measure Tools Distance Node (Создать  Инструменты меры  Узел дистанции). Он должен называться distanceDimension1. Переименуйте его в LLegDistance. Узел дистанции берет данные о положении двух локаторов и вычисляет расстояние между ними. Локатор дистанции понадобится вам, чтобы управлять сжатием растяжением в системе ИК.

Выделите узел LHip и затем помощью клавиши Shift выделите первый локатор. Создайте точечный ограничитель (рис. 2.6).

Выделите контроллер ноги; затем помощью клавиши Shift выделите другой узел и создайте еще один точечный ограничитель.

Откройте редактор Hypershade и создайте узел multiplyDivide. Переименуйте его в LengthRatio.

Соедините атрибут distance узла LLegDistance с атрибутом inputX узла LengthRatio (рис. 2.7).

@Рис. 2.6. Создание узлов дистанции в системе ИК

Врезка. Важно, чтобы контроллер был объектом точечного ограничителя. Вы можете обнаружить, что ограничение ИК-манипулятора даст тот же результат. ИК-манипулятор немного непредсказуем, так как если его двигать за пределы сочленения, он попытается вернуться к конечному эффектору.

В окне моделирования создайте еще один инструмент измерения дистанции. Он не будет ничем управлять, а будет использоваться для измерения длины ног. Удерживая клавишу v и тем самым используя точечную привязку разместите локаторы на сочленениях LHip и LKnee, соответственно. Запишите результат измерения расстояния.

Расместите локаторы на сочленениях LKnee и LAnkle. Запишите этот результат. Вы можете удалить систему измерения (локаторы и их узлы дистанции), когда закончите.

Сложите результаты двух измерений и введите сумму в поле input2X узла LengthRatio (рис. 2.8). Заблокируйте это поле с помощью контекстного меню. Установите |Operation на divide.

Врезка. Очень важно, чтобы при вводе длины ноги в узел LengthRatio единицы измерения были согласованы. Если вы не гонитесь за точными размерами, то можете не использовать точное соблюдение величин.

@Рис. 2.7. Соединение узла дистанции и атрибута LegthRatio multiplyDivide-узла

Откройте окно Hypershade. Создайте узел с условием и назовите его LlegStretchCondition. Соедините атрибут output1X узла LengthRatio с атрибутом firstTerm узла LlegStretchCondition. Установите secondTerm узла с условием на 1. Заблокируйте этот атрибут с помощью контекстного меню. Установите атрибут Operation на greater than (больше чем).

Соедините атрибут LLegStretchCondition.output1X и атрибут stretch сочленений LHip и LKnee.

На этой стадии мы настроили растягивающуюся ИК. При перемещении окружности вы увидите, как ИК растягивается, стремясь к ней. Такая система – хорошее начало, и она вполне может удовлетворить нужды небольшого производства. Но у нее есть и недостатки.

Во-первых, нет функции отключения растягивающейся ИК. Один из ключевых аспектов риггинга персонажа – знание того, что, какие бы настройки вы не сделали, кто-нибудь захочет избавиться от них. Хорошо бы по возможности наделить систему такой гибкостью, так что давайте рассмотрим растяжение ИК ноги как отдельную опцию.

@Рис. 2.8. Добавление длины костей в систему растяжения ИК ноги.

Отключение

Первый пункт повестки дня – отключение растяжения ИК-манипулятора. Давайте предположим, что некто анимирует шаги персонажа и хочет для управления ногой по своему усмотрению включать или выключать растяжение ИК.

  1. Выделите окружность Control.

  2. В Attribute Editor добавьте атрибут ikStretch. Установите минимальное значение 0, максимальное 1, значение по умолчанию 1.

Врезка. В этом случае растяжение ИК-манипулятора будет включено по умолчанию. В зависимости от нужд вашего производства или предпочтений аниматоров вы можете выставить значение по умолчанию на 0 или на “off”.

  1. В Hypershade создайте узел blendColors. Переименуйте его в LStretchyIKBlend.

  2. Выделите узел LStretchyIKBlend и узел LLegStretchCondition и отобразите их в Hypergraph. Соедините атрибут outColorR узла LLegStretchCondition и атрибут color1R узла LStretchyIKBlend.

  3. Выделите узел LStretchyIKBlend. В Channel Box установите атрибут color1R на 1. Заблокируйте его через контекстное меню.

  4. Соедините атрибут ikStretch объекта control и атрибут blender узла LStretchyIKBlend.

Теперь, если вы выделите окружность и переместите ее, нога растянется. Но если вы измените атрибут ikStretch, то нога примет положение между нормальной и растянутой. Это не только дает аниматору контроль над активностью растяжения, но также позволяет анимировать плавный переход от растянутого состояния к нерастянутому.

Это хороший уровень гибкости, но все же когда-нибудь аниматоры точно захотят окончательно отключить систему ИК и анимировать непосредственно сочленения. Так же они, несомненно, захотят контролировать параметры растяжения. Отключить ИК легко, для этого в Maya у всех ИК-манипуляторов есть параметр ikBlend. Мы бы хотели сделать следующее: отключить ИК, растяжение ИК-манипуляторов, создать смешивание растяжений с ПК сочленениями.

Это потребует некоторой переработки уже сделанного. Создав растяжение на ИК-манипуляторе, мы прицепили к нему параметр растяжения всех затронутых сочленений. Чтобы в дальнейшем контролировать сочленения с Прямой Кинематикой, нам понадобится другая система. Вспомните, когда создавалось управление растяжением каждого сустава, оно соединялось непосредственно с параметром scaleX сочленения. Это тот scaleX, который управляет действиями сжатия и растяжения. Чтобы создать смешивание, узел blendColors должен скользить между атрибутом stretch и параметром scaleX.

  1. Выделите узел control и откройте Attribute Editor. Создайте новый атрибут под названием ikBlend с минимальным значением 0, максимальным 1, по умолчанию 1.

  2. В Hypershade создайте узел blendColors. Переименуйте его в LHipFKBlend.

  3. Соедините атрибут outputR узла LStretchyIKBlend с атрибутом color1R узла LHipFKBlend.

  4. Соедините атрибут stretch узла LHip с атрибутом color1R узла LHipFKBlend.

  5. Выделите сочленение LHip. В Channel Box разбейте соединение, идущее к атрибуту stretch. Соедините атрибут stretch с атибутом color2R узла LHipFKBlend.

  6. Соедините outputR узла LHipFKBlend и scaleX сочленения LHip.

  7. Проделайте эти операции с сочленением LKnee.

Теперь, когда аниматор управляет атрибутом ikBlend, Maya может не только переключать ориентацию сочленений между ИК и ПК, но и смешивать растяжение уже созданных сочленений с любым анимированным ПК сочленением обладающим растяжением.

Сжатие и растяжение сплайновой ИК

Идею управления растяжением ИК-манипуляторов можно применить и для управления сжатием и растяжением системы сплайновой ИК. ИК-манипулятор с растягиванием сравнивает линейную протяженность до объекта ИК с длиной костей, составляющих ногу. Результирующее число используется как фактор масштабирования, входящий в атрибут растяжения соответствующего сочленения. Этот метод можно применять и к сплайновой ИК. Все, что нужно, – это способ измерения длины сплайна в его исходном и деформированном положениях. В Maya информация о линейной протяженности кривой NURBs хранится в узле curveInfo. С его помощью можно создать новый коэффициент растяжения сочленений в сплайновой ИК.

В следующем упражнении длина кривой будет использована для управления растяжением в системе сплайновой ИК.

  1. Начните с новой сцены.

  2. Протяните ряд сочленений так, чтобы они образовали позвоночник.

  3. С помощью инструмента splineIK создайте сплайновый ИК-манипулятор (spline IK handle) от основания joint1 до вершины позвоночника.

  4. Теперь к каждому сочленению добавьте параметр растяжения. Если вы пользовались стандартным Maya инструментом Draw Joints (Тянуть Сочленения), то они должны растягиваться вдоль оси X. Если нет, то через меню Display Component Display Local Rotation Axis (Показать  Показать компонент  Локальная ось вращения) определите, вдоль какой оси должно тянуться сочленение. Чтобы создать растяжение для каждого сустава, примените сценарий makeSandS.mel.

Врезка. Чтобы выделить все сочленения в ряду, вы можете использовать команду Select со следующими параметрами: Select -r -hi {название сочленения}

  1. Выделите NURBS-кривую, которая управляет splineIK. В командной строке введите следующую команду:

arclen -ch 1;

  1. Эта команда создает узел curveInfo и соединяет его с кривой.

  2. Откройте Hypergraph пока выделена кривая, и отобразите входящие и исходящие соединения. Вы должны увидеть, соединение узла curveInfo с кривой.

  3. Выделите узел curveInfo и отройте Attribute Editor. Там есть поле под названием Arc Length (Длина дуги). Скопируйте оттуда число: это длина кривой, и она понадобится, чтобы создать коэффициент длины для управления растяжением.

  4. Откройте редактор Hypershade. Создайте multiplyDivide-узел и назовите его curveLengthRatio. В поле input2X введите исходный параметр Arc Length, о котором говорилось в предыдущем пункте. Заблокируйте его через контекстное меню.

  5. Выделите узел curveLengthRatio и узел curveInfo, удерживая клавишу Shift. Отобразите их в Hypergraph. Соедините атрибут arcLength с атрибутом input2X узла curveLengthRatio.

  6. Выделите все узлы в системе ИК. Удерживая клавишу Shift, выделите NURBS-кривую, которая управляет системой, и отобразите их в Hypergraph. Соедините outputX узла curveLengthRatio с атрибутом растяжения каждого узла.

Выделите NURBS-кривую, которая управляет системой. Нажмите F8, чтобы войти в режим редактирования компонентов. Выделяйте каждую из управляющих точек и при помощи команды Deform Create Cluster (Деформировать  Создать rластер) создайте кластер для каждой управляющей точки на кривой.

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

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

  1. В Hypershade создайте узел blendColors. Переименуйте его в ikStretchScale.

  2. Выделите узел ikStretchScale и, удерживая клавишу Shift, узел curveLengthRatio. Отобазите входящие и исходящие соединения в Hypergraph.

  3. В Hypergraph соедините outputX curveLengthRatio и атрибут input1R узла ikStretchScale.

  4. Выделите узел ikStretchScale и откройте Attribute Editor. Установите атрибут color2R на 1. Заблокируйте его через контекстное меню.

  5. Соедините outputR узла ikStretchScale с атрибутом stretch каждого из сочленений.

Врезка. Если вы потеряли узел curveLengthRatio, его всегда можно добавить в список выделения MEL-командой «выделенный объект -add curveLengthRatio». Другой способ найти узел – выделить кривую, которая управляет системой ИК, и отобразить входящие и исходящие соединения в Hypergraph. Вы сможете найти узел curveLengthRatio, проследив соединения.

На этом этапе атрибут смешивания узла ikStretchScale управляет растяжением сочленений в системе ИК. Установка смешивания на 0 при установленном на 1 растяжении ИК-сочленений отключает растяжение. Установка же смешивания на 1 включает растяжение.