Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ponimayka1

.pdf
Скачиваний:
136
Добавлен:
07.06.2015
Размер:
37.11 Mб
Скачать

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

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

Типы констрейнов. Их общие и уникальные атрибуты

Сейчас я бы хотел пробежаться по всем типам констрейнов и обозначить примерные области их применения. Затем, как обычно, последует описание их внутреннего устройства и вопросы совместимости констрейнов. Сейчас я бы хотел еще раз обозначить, что абсолютно все констрейны имеют атрибуты, определяющие вес, и многие из них позволяют задавать смещение (offset) относительно положения по умолчанию. Эти параметры можно задавать еще при создании констрейна, воспользовавшись, очевидно, Option Box для соответствующей операции или отредактировать позднее.

Point Constraint

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

Orient Constraint

Разворачивает управляемый объект так же, как управляющий. Если управляющих объектов несколько, повороты управляемого объекта равны усредненным величинам поворотов управляющих объектов. Используется часто в дополнении к Point Constraint, чтобы заставить объекты не только двигаться, но и поворачиваться синхронно.

Здесь необходимо уточнить разницу между констрейнами и объединением объектов в иерархию. Если вы назначите один объект в качестве «родителя» (parent) для другого с помощью операции Edit=>Parent, подчиненный объект тоже будет перемещаться и поворачиваться, вместе с «родительским». Однако важно помнить, что в этом случае подчиненный объект поворачивается вокруг пивота родителя, а не вокруг своих локальных осей, В случае, когда вы «прибили» один объект к другому с помощью констрейнов (и, возможно, задали некоторое смещение (offset), управляемый объект будет поворачиваться вокруг своего центра вращения, а не вокруг пивота управляемого объекта.

591

Примечание. Атрибут offset в случае с Orient Constraint очень полезен и позволяет избежать разворота локальных осей управляемого объекта для достижения нужной ориентации.

Scale Constraint

Этот редко используемый констрейн позволяет привязывать масштаб одного объекта к размеру других.

Смешивание анимации - старый добрый подход

До того, как в MAYA появились методы смешивания анимации (animation blending), констрейны были единственным и очень надежным способом смешивания и даже монтажа анимации. Я мог бы порекомендовать использовать этот метод и сейчас, в силу его абсолютной предсказуемости.

Представьте себе, что у вас есть самолет, заходящий на посадку на палубу авианосца, который раскачивается на волнах несильного шторма. Нарисовать кривую, по которой будет двигаться самолет, от начала и до конца невозможно, тем более если корабль раскачивается на волнах океана, анимированного с помощью MAYA Fluids. В этом случае проще сделать две анимации по пути: заход на посадку и пробежка по посадочной полосе. Причем сделать эти две анимации надо для двух кривых и двух простых объектов—болванок». Одна болванка заходит на посадку, а вторая начинает двигаться по палубе незадолго до того как первая достигнет конца своего пути. После этого нужно лишь выбрать обе болванки, затем самолет и создать сначала Point Constraint, а затем Orient Constraint. При этом самолет «Зависнет» между двумя болванками. Затем нужно проанимировать веса этих болванок так, чтобы самолет сначала заходил на посадку, то есть двигался по первой кривой (вес первой болванки единица, второй - ноль), а затем плавно

«перепрыгивал» на палубу (вес первой ноль, второй - единица).

Основная идея такого подхода заключается в том, что самолет не анимируется сам по себе. Анимируются простые вспомогательные объекты. Их число равно количеству «анимаций», которые мы хотим «состыковать». После того, как эти объекты санимированы, основная модель привязывается к ним с помощью констрейнов. Затем анимируются веса таким образом, чтобы обеспечить плавный переход от одной анимации к другой. Еще раз повторюсь: основной объект не анимируется! Анимируются лишь управляющие объекты и их степень влияния на этот объект.

Вторым примером может служит знаменитое устройство руки персонажа для переключения между прямой и инверсной кинематиками. Вместо одной руки (с каждой стороны, естественно) персонажу дается целых три. Первая содержит IK Handle и анимируется инверсной кинематикой, вторая анимируется прямой кинематикой, а третья никак не анимируется, а «болтается» между первыми двумя с помощью системы констрейнов. Именно третья рука несет на себе скининг, мышцы и остальные элементы. В те моменты когда для анимации нужна только прямая или только инверсная кинематика, веса устанавливаются соответствующим образом. Анимация весов, позволяет сделать переход от одного типа кинематики к другому плавным. Сейчас в MAYA имеются специальные средства для смешивания типов кинематики, однако такой подход универсален и применим не только к анимации рук или костей скелета.

На сегодняшний день MAYA обладает средствами смешивания разных типов анимации непосредственно на самом объекте, без привлечения вспомогательных «болванок». Об этих средствах я поговорю позже. Однако переключение между анимированными управляющими объектами с помощью констрейнов по-прежнему является надежным методом «стыковки» анимаций.

Parent Constraint

Иногда возникает задача: временно «припарентить» один объект к другому, не меняя, однако, при этом существующей иерархии в сцене. Это может понадобиться для согласованной анимации родительского и подчиненного объекта, как единого целого.

592

Для этих целей существует Parent Constraint. Он привязывает один объект к другому (или к другим, что важно!), но точно так же, как если бы была выполнена операция Edit=>Parent.

В отличие от вышеперечисленных констрейнов, управляемый объект может иметь свои собственные перемещения и повороты, при этом он дополнительно наследует перемещения и повороты управляющего объекта. Он движется в точности так же, как объект, иерархически подчиненный своему родителю, однако никакой новой иерархии в сцене не появляется. Кроме того, при создании в Option Box можно задать, будет ли распространяться такое поведение на перемещения и на повороты или только на выбранные атрибуты. Для Parent Constraint опция Main­ tain Offset (сохранить смещение) по умолчанию включена, чтобы сохранить взаимное расположение объектов при создании констрейна, поэтому управляемый объект не «перескаивает» в новую позицию.

Внимание! Очень важно понимать одно существенное различие между Parent Constraint и операцией Edit=>Parent. Внешне результат «припарентивания» совершенно одинаковый. Однако в случае применения констрейна в Channel Box для подчиненного объекта будут высвечиваться абсолютные перемещения и вращения объекта. В случае обычного «припарентивания» эти координаты будут локальными (то есть относительно родительского объекта) и не будут меняться, когда родительский объект перемещается в пространстве.

Данный констрейн очень удобен, когда ваш персонаж хочет что-нибудь схватить или положить. В тот момент, когда надо что-то взять, нужный предмет следует прикрепить к руке с помощью Parent Constraint. Расстояние между предметом и рукой сохранится. Далее, следует проанимировать вес, чтобы до момента хватания он был равен нулю, а после - единице.

Aim Constraint

Это один из самых популярных констрейнов. Он позволяет «нацеливать» один объект на другой (или на другие). Как обычно, достаточно выбрать объект-цель, затем управляемый объект и выполнить Constrain=>Aim. После этого управляемый объект будет все время смотреть на объектцель.

Сейчас самое время уточнить, что это значит: «смотреть на». Представьте себе, что вы лично получили указание свыше типа «повернитесь к солнцу». Наверняка вы повернетесь к нему лицом, ибо для вас лицо - это, скажем так, направление по умолчанию. Повернуться к солнцу можно было бы и спиной и боком, если бы в полученном свыше указании было бы уточнение, «чем» повернуться к солнцу.

Однако повернувшись к солнцу лицом, вы понимаете, что смотреть на него можно в разных положениях: например, наклоняя голову вправо или влево или даже встав на голову - тем не менее вы все равно продолжаете оставаться «лицом к солнцу». Чтобы однозначно зафиксировать положение вашей головы в трехмерном пространстве, вы должны получить дополнительное уточняющее указание типа «смотреть на солнце макушкой вверх» или «смотреть на солнце и наклонить голову вправо, чтобы левое ухо смотрело вверх». Таким образом вам нужны два указания: «чем» смотреть на солнце и «чем» смотреть вверх, для того, чтобы однозначно повернуть голову.

593

Попробуем посмотреть на солнце в MAYA. Очевидно, что солнце - это сфера (для любителей фантастики и пришельцев, это может быть куб). Лицо это очевидно, конус. На нем есть нос, (Желающие фотореализма могут небыстро смоделировать реалистичное лицо). Создав сферу и конус (полигональные для определенности), немного растяните конус по оси X, для контроля расположения локальных осей, и отодвиньте его вверх по оси Y.

Теперь посмотрим конусом на солнце.

Выберите сферу, затем конусовидное лицо и выполните Constrain=>Aim.

Конус тут же развернется и будет «смотреть» на сферу.

Подвигав сферу, в этом нетрудно убедиться.

Разберемся теперь, КАК и ЧЕМ конус смотрит на сферу. Возможно, вы ожидали, что он будет смотреть на нее «носом», то есть верхушкой, однако мы же не сформулировали при создании констрейна, чем именно надо смотреть на сферу. Поэтому конус смотрит на нее «боком», а точнее говоря, своей локальной осью X (в чем нетрудно догадаться, включив манипулятор Scale Tool). Для конуса ось X является «лицом по умолчанию».

Ксчастью, необязательно все переделывать заново, поскольку, как обычно, все параметры, задаваемые в Option Box при создании констрейна, можно разыскать в Attribute Editor в виде его атрибутов.

Выберите конус, откройте Attribute Editor.

Разыщите там закладку pCone_aimConstraint1 и поглядите на ее атрибуты.

594

Наряду с традиционным атрибутом offset, там присутствует атрибут Aim Vector (вектор, которым прицеливаются). Он установлен в (1,0,0), что в переводе на человеческий язык означает «локальная ось X».

Задайте для Aim Vector значения (0,1,0), определяющие локальную ось Y конуса. Теперь конус развернулся и смотрит на сферу своей макушкой, то есть своей локальной осью Y.

Борьба с переворачиванием

Вроде бы задача решена, однако осталась неоднозначность в том, как конус повернут вокруг оси «прицеливания». По аналогии с разворотом лица к солнцу, мы никак не определили, «каким ухом смотреть вверх».

За то, какой локальной осью смотреть вверх, отвечает атрибут Up Vector. Установите его в (1,0,0), и конус, продолжая смотреть макушкой на сферу, развернется так, чтобы его локальная ось X стремилась максимально смотреть наверх.

5 9 5

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

Будет гораздо лучше, если вы будете знать, как расположены локальные оси прицеливаемого объекта, заранее, перед созданием констрейна. Это избавит вас от неожиданных сюрпризов.

Некоторые пытливые умы наверняка столкнутся с ситуацией, когда конус начнет «перекручиваться». Поместите сферу в начало координат, а конус расположите точно над ней.

Если перемещать сферу вдоль оси X, то при прохождении начала координат, конус над сферой быстро «прокручивается» вокруг линии «нацеливания». Чтобы это лучше увидеть, оттащите одну или несколько вершин на краю конуса, чтобы сделать его несимметричным.

Это вовсе не глюк и не ошибка. В данном случае MAYA делает ровно то, что от нее просят. Разберем ситуацию поподробнее.

Медленно перемещайте сферу по горизонтали и следите, как расположена локальная ось X конуса (можно для наглядности выбрать конус и включить отображение локальных осей: Display=>Component Display=>Local Rotational Axes).

Конус, в соответствии с полученными указаниями, пытается направлять свою локальную ось X вертикально вверх. Когда сфера проходит через начало координат, эта локальная ось становится почти горизонтальной и в какой-то момент «переворачивается» на 180 градусов, чтобы упорно продолжать смотреть наверх. Все это совершенно корректно и предсказуемо.

Дело в том, что в некоторый момент локальная ось Y конуса смотрит строго вниз. В этот момент направление прицеливания становится параллельным вертикали. Получается, что конус должен одновременно смотреть вниз осью Y и вверх осью X. (Если конус находится снизу от сферы, получается, что он должен смотреть вверх обеими локальными осями, X и Y.). С точки зрения математики возникает особая точка, или сингулярность, а с точки зрения «нормальных людей» возникает вопрос: как этого избежать, как заставить конус не прокручиваться?

Именно в этом конкретном случае, когда направление прицеливания конуса проходит через вертикаль, надо просто использовать для ориентации вместо направления вверх направление вбок. До сих пор мы предполагали, что локальная ось X должна смотреть вверх, не задумываясь, а почему, собственно, «вверх». Оказывается, за направление, к которому стремится ось, заданная через атрибут Up Vector, отвечает атрибут World Up Vector. По умолчанию он равен (0,1,0), то есть определяет направление «вверх».

Измените значение World Up Vector на (0,0,1). Конус станет смотреть своей локальной осью X «вбок», вдоль направления мировой оси Z. Чтобы вернуться к предыдущей ориентации, но

596

с данным значением World Up Vector, надо очевидно изменить атрибут Up Vector на (0,0,1), чтобы конус смотрел «вбок» своей осью Z.

Теперь конус не «прокручивается», когда сфера проходит через начало координат. Таким образом, при использовании Aim Constrain вы должны также держать в уме будущее возможное расположение объектов и стараться избегать ситуации, когда ось «прицеливания» будет проходить через направление, заданное с помощью World Up Vector. Если нацеливаемый объект будет «рыскать» в поисках цели в горизонтальной плоскости, то в качестве «верха» вполне годится World Up Vector=(0,1,0). Если направление прицеливания в процессе анимации будет проходить через вертикаль, определите World Up Vector как направление, через которое никогда не пройдет линия прицела.

Примечание. Нельзя задавать одинаковое значение для атрибутов Aim Vector и Up

Vector.

В этом случае вы будете разворачивать объект одной и той же осью и «на

цель» и

«вверх».

Примечание. Атрибуты Aim Vector и Up Vector могут задавать не только локальные оси объекта с помощью «круглых» значений типа (0,1,0) или (1,0,0), но и могут определять произвольное направление «внутри» объекта, которым он должен смотреть с нужном направлении. Но это скорее экзотика, чем правило.

Предвижу вопросы о том, а как быть в произвольном случае, когда заранее не известно расположение цели и «целящегося» объекта. Для любителей самых общих случаев могу предложить следующее решение.

Вместо того, чтобы определять фиксированное направление «вверх» или «вбок» для ориентации объекта после прицеливания, можно создать дополнительный объект и дать указание целящемуся объекту смотреть одной из своих осей не вверх, а на этот объект. В гуманитарных терминах это прозвучит так «Смотреть лицом на солнце и при этом макушкой на зонтик (фонарь, самолет)».

Создайте с сцене с конусом локатор.

Наверняка его имя будет locatorl.

Выберите конус и в атрибутах pCone1_aimConstraint1 установите World Up Type=Object Up. Это значит, что вместо «верха» будет использоваться направление на некоторый объект.

Задайте имя этого объекта (locator1) в поле World Up Object.

После этого конус развернется своей локальной осью Z (определенной в Up Vector) в направлении локатора.

Задайте снова Up Vector равным (1,0,0), и конус развернется к локатору своей осью X, продолжая смотреть на сферу.

597

Таким образом, теперь у вас есть полное управление тем, как будет вести себя конус в процессе -слежения- за сферой. Вы можете контролировать, куда смотрит «лицо» конуса, а также, куда направлена его «макушка». В процессе анимации следует избегать ситуаций, когда сфера, конус и локатор оказываются на одной линии. Это несложно сделать, просто анимируя положение локатора.

Очень часто Aim Constraint применяется для ориентации камер или источников света в нужном направлении. При создании такой «следящей камеры» следует учитывать, что локальная ось Z для источников света и камер направлена «назад», поэтому в качестве Aim Vector для них следует выбирать (0, 0, -1), а в качестве Up Vector (0,1,0).

Подводя итог разговора про Aim Constraint, хочу напомнить, что вы должны безупречно представлять себе, как расположены локальные оси объекта. Вас не должна смущать запись типа (-1,0,0) для обозначения направления внутри объекта, противоположного локальной оси X. Вы также должны помнить, что объект может поворачиваться в сторону цели различными способами, поэтому необходимо уточнять, куда смотрит не только его «лицо», но и «макушка».

Совет. Атрибуты offset при использовании

Aim

Constraint

чудовищно удобны.

Мало

того,

что они позволяют анимировать небольшое собственное -рысканье-

объекта.

В

ситуации,

когда объект

-смотрит-

на

цель не

той локальной осью,

вместо возни

с переопределением Aim

Vector и

Up

Vector,

можно просто развернуть

(или

точнее

-довернуть-) объект нужной осью на цель,

добавив, -методом тыка-

90 (или

-90)

градусов

в соответствующее значение

для

атрибутов offset.

Geometry Constraint

Следующие три типа констрейнов согласуют объект не с положением или вращением управляющего объекта, а с его формой.

Первый из них, Geometry Constraint, позволяет «посадить» объект на поверхность или кривую и ограничить его движение только в пределах этой кривой или поверхности.

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

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

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

Normal Constraint

Данный констрейн позволяет развернуть объект так, чтобы он смотрел вдоль нормали к заданной поверхности. Управляемый объект только разворачивается вдоль нормали, но остается на месте и не перемещается на поверхность. Поэтому Normal Constraint и Geometry Constraint часто используют вместе.

Читая выражение «смотрел вдоль нормали», вы должны сразу понимать, что в этом случае необходимо задавать значения того, какой осью объект должен смотреть вдоль нормали и какой осью он должен смотреть наверх. Он имеет такие же атрибуты, как и Aim Constraint, и требует четкого понимания, как расположены локальные оси внутри управляемого объекта.

Совет. Атрибуты offset при использовании Normal Constraint удобны для разворота

598

о б ъ е к та нужной

локальной осью вдоль нормали.

Кроме того,

вы

можете

использовать

Normal Constraint для ориентации объекта

не только

вдоль

нормали,

но и вдоль

касательной

в поверхности. Ориентация объекта

в

касательной

плоскости также

может

настраиваться атрибутами

offset.

 

 

 

Tangent Constraint

ЭТОТ констрейн используется для ориентации объекта вдоль направления касательной к выбранной кривой. Он не работает с поверхностями в качестве управляющих объектов. Используется редко. Имеет атрибуты и идеологию, аналогичные Aim Constraint.

Совет. Гораздо проще

закрепить

и развернуть объект по касательной к кривой

с помощью анимации

по пути.

Закрепить объект на поверхности этим же

способом можно, создав кривую на поверхности (для сплайнов) или сдублировав

полигональное ребро.

Полученную кривую можно использовать для анимации по

пути, с сохранением

истории моделирования и принадлежности такой кривой к

поверхности.

 

Pole Vector Constraint

Констрейн с таким устрашающим названием предназначен для весьма специальных целей. Если вы создали цепочку из костей и сделали для нее IK Handle, то при сгибании такой цепочки (пусть это будет рука или нога), локоть (или колено) сгибается в каком-то, не всегда удобном направлении. Для того, чтобы четко определять, куда будут смотреть локти или колени согнутых с помощью инверсной кинематики конечностей, существует Pole Vector Constraint.

От том, что Pole Vector является атрибутом объекта типа IK Handle и задает плоскость, в которой двигается кинематическая цепочка из костей, читайте с разделах про скелетоны и инверсную кинематику.

Очевидно, что управляемым объектом в этом случае будет объект IK Handle, причем только с определенным типом вычисления инверсной кинематики, а именно Rotation Plane IK Handle. Управляющим объектом, как правило, выбирается локатор.

Совместимость констрейнов.

Использование нескольких констрейнов для одного объекта

Если не рассматривать Pole Vector и Scale Constraint, все остальные констрейны, очевидно, воздействуют на атрибуты translate или rotate, ограничивая, таким образом, перемещение или вращение объекта.

599

Судя по тому, как меняется цвет атрибутов в Attribute Editor или Channel Box для объектов с констрейнами, можно судить, на какие именно каналы воздействует тот или иной констрейн. Взрослые мальчики могут также взглянуть на дерево зависимостей в Hypergraph - для понимания того, как работают констрейны.

Очевидно, что если один констрейн ограничивает перемещения объекта (например Point Constraint), а другой ограничивает вращения (например, Orient, Aim или Normal), их можно без проблем применять к одному и тому же объекту. Наиболее часто используемые «пары»: Point + Orient, Geometry + Normal. Однако если вы уже ограничили вращения объекта с помощью Aim Constraint, вам не удастся также связать его повороты с любым из объектов с помощью Orient Constraint: ведь один атрибут не может иметь две входящие связи в дереве зависимостей.

Всегда помните, на какие атрибуты объекта воздействует создаваемый вами констрейн. Не пытайтесь дважды ограничивать одни и те же атрибуты.

Примечание. Любители общих случаев, возможно, захотят,

тем не менее,

связать

вращения

объекта сразу двумя констрейнами,

к примеру с

помощью Aim

Constraint

и Normal

Constraint.

В этом

случае могу посоветовать сделать две копии

объекта.

Первую ограничить с помощью Aim Constraint, вторую

-

с

помощью

Normal Con­

straint. Потом

выбрать обе

копии, затем сам объект

и

привязать

его

вращения

к копиям

с помощью

Orient Constraint.

Таким

образом,

ориентация объекта будет

представлять

собой

среднее

между

поворотами двух

его

копий.

С

помощью

соответствующих весов вы даже сможете анимировать индивидуальное влияние констрейнов Aim и Normal на ваш объект.

Следует особо отметить, что Geometry Constraint не воздействует напрямую на атрибуты translate, поэтому его можно использовать совместно, например, с Point Constraint (или другими способами анимации перемещений). В результате такого ограничения объект будет находиться на поверхности (определяемой Geometry Constraint), притом в позиции, ближайшей к точке в пространстве, задаваемой Point Constraint.

Удаление и добавление дополнительных управляющих объектов

В том случае, если объект находится под влиянием нескольких управляющих объектов и вы хотите не просто устранить влияние одного из объектов, обнулив его вес, но и совсем удалить этот управляющий объект из констрейна, следует воспользоваться соответствующим пунктом меню: Constrain=>Remove Target. Не забудьте сначала выбрать управляющий объект, а затем объект, на который он влияет. Ведь один объект может «принимать участие» в разных констрейнах и влиять на разные объекты.

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

Работа с весами.

Включение и выключение констрейнов. Rest Position. Исходная позиция

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

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

600

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]