Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция 6. Анимация.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
8.01 Mб
Скачать

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

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

«каким ухом смотреть вверх».

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

59 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. Управляющим объектом, как правило, выбирается локатор.