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