Вроде бы задача решена, однако осталась неоднозначность в том, как конус повернут вокруг оси «прицеливания». По аналогии с разворотом лица к солнцу, мы никак не определили, «каким ухом смотреть вверх».
За то, какой локальной осью смотреть вверх, отвечает атрибут Up Vector. Установите его в (1,0,0), и конус, продолжая смотреть макушкой на сферу, развернется так, чтобы его локальная ось X стремилась максимально смотреть наверх.
Таким образом, чтобы однозначно задать прицеливание одного объекта на другой с помощью 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. Чтобы вернуться к предыдущей ориентации, но с данным значением World Up Vector, надо очевидно изменить атрибут Up Vector на (0,0,1), чтобы конус смотрел «вбок» своей осью Z.