![](/images/openglorg09/openglorg09-905.png)
Воплотим в жизнь основной принцип иерархической анимации: сейчас у юлы есть две ноды типа transform - собственно сам объект spin и группа axis. Поскольку нода axis находится по иерархии выше ноды spin, сначала будут выполнены все трансформации для группы axis, а затем к результату будут применены вращения объекта spin. Выберите группу axis и поставьте пять ключей на вращение в следующих кадрах.
Кадр 0: rotateX=30, rotateZ=0. Кадр 25: rotateX=0, rotateZ=-30. Кадр 50: rotateX=-30, rotateZ=0. Кадр 75: rotateX=0, rotateZ=30. Кадр 100: rotateX=30, rotateZ=0.
![](/images/openglorg09/openglorg09-906.png)
Подредактируем анимационные кривые. Откройте Graph Editor и нажмите «f».
![](/images/openglorg09/openglorg09-907.png)
Удалите «лишние» ключи на наклонных участках.
И включите отображение «бесконечности»: View=>Infinity.
Выберите обе анимационные кривые и задайте для них бесконечное циклическое повторение: Curves=>Post lnfinity=>Cycle.
Чтобы «повторы» гладко стыковались на границах, задайте «плоские» тангенсы для всех выбранных ключей: Tangents=>Flat.
![](/images/openglorg09/openglorg09-908.png)
Выделите слева в Graph Editor канал Rotate Z, чтобы увидеть только его анимационную кривую. Выберите первый и последний ключ на ней и выполните Tangents=>Spline, чтобы гладко состыковать начало и конец анимационной кривой.
![](/images/openglorg09/openglorg09-909.png)
Теперь ось юлы бегает по кругу.
Можно анимировать перемещения юлы по горизонтальной плоскости.
Для этого создадим еще один уровень иерархии для очередного «слоя» анимации. Выберите группу axis и снова группируйте ее саму с собой.
Полученную группу назовите deviation.
Заблокируйте и спрячьте все атрибуты deviation в Channel Box, за исключением translateX и translateZ.
![](/images/openglorg09/openglorg09-910.png)
Поставьте ключи на перемещение группы deviation.
Кадр 0: translateX=0, translateZ=0.
Кадр 50: translateX=0, translateZ=5.
Кадр 00: translateX=5, translateZ=5.
Кадр 150: translateX=5, translateZ=0.
Кадр 200: translateX=0, translateZ=0.
Отредактируем анимационные кривые.
Откройте Graph Editor и нажмите «f>>.
Выделите обе анимационные кривые и выполните Tangents=>Spline.
![](/images/openglorg09/openglorg09-911.png)
Чтобы сделать перемещения юлы более «жесткими», выберите два верхних ключа на кривой для translateZ, а затем выделите соседние тангенсы этих ключей.
![](/images/openglorg09/openglorg09-912.png)
Выполните Keys=>BreakTangents, чтобы «сломать» тангенсы и редактировать их независимо, с каждой стороны от ключа. Не забудьте включить Move Tool и потяните «сломанные» тангенсы вниз.
![](/images/openglorg09/openglorg09-913.png)
Выполните аналогичные действия с нижними ключами на красной анимационной кривой для translateX.
![](/images/openglorg09/openglorg09-914.png)
Поэкспериментируйте с ключами и различными видами интерполяции. Сохраните сцену (ula.ma).
Пытливые умы наверняка держат за пазухой едкий вопрос: зачем это городить такой «групповой огород», когда в принципе можно было бы обойтись одним объектом. Надо было бы просто задать нужный порядок поворотов (атрибут Rotate Order в Attribute Editor), а перемещения и вращения проанимировать независимо. Да, это так. Однако гораздо удобнее работать с несколькими объектами (хотя бы с точки зрения постановки ключей) и разделять анимацию на «слои». В данном примере каждая группа ответственна за определенный тип движения, и, выбрав ее, совершенно очевидно, какие атрибуты и как надо редактировать для корректировки анимации. В случае «экономии» и использования атрибутов одного объекта для общего движения, придется все время держать в голове, какие атрибуты отвечают за определенный тип анимации и переключаться в Graph Editor между «зарослями» анимационных кривых.