
Тема 1. Анимации поворотов: Rotation Movement Component, работа с пивотами.
Здравствуйте, эта первая лекция курса по процедурным анимациям в Unreal Engine 5. Процедурные анимации это в первую очередь анимации, которые автоматически изменяются в зависимости от каких-то нестатических данных. Например, анимация, которая зависит от положения игрока. Но мы будем изучать в целом создание анимаций в UE кодом — то есть всё анимации кроме импортированных анимации и скелетов. Это необходимая база для создания именно процедурных анимаций.
И тема первой лекции — анимации основные на поворотах. Это может быть поворот и всего актора, и отдельного его компонента, и вокруг своей оси, и вокруг вынесенного пивота, и независимые от FPS — про всё это расскажу и по итогу вы сможете сделать небольшую бесконечную интерактивную анимацию поворота.
Текстовое содержание лонгрида и лекция самостоятельны и по большей части дублируют друг-друга, поэтому можете выбрать удобный вам формат. Я рекомендую сначала для большей наглядности смотреть лекцию, а когда будут появляться вопросы во время выполнения задания или позже, читать документацию, так как в ней проще ориентироваться и в ней больше глубоких технических подробностей и ссылок.
Начну с основы — координат типа Rotator, которые используются в UE для контроля и изменения поворота всех объектов, акторов. По своей сути это почти тоже самое что и трёхмерная координатная сетка для локации (Location), только вместо трёх меры расстояния по трём направлениям от нулевой точки, в Rotator три меры угла поворота по трём осям объекта (Roll, Pitch и Yaw) от нулевого угла.


И это формирует несколько важных отличий:
Во-первых, каждое значение ограничено промежутком от -180° до 180°. Попробуйте повернуть любой объект на 360° — по факту ничего не поменяется, объект будет точно в таком же состоянии поворота. Поэтому и в коде значение 360° на самом деле тоже самое что и 0°. Как и -720° = 0°. А 225° = -45° — и с точки зрения геометрии это действительно одно и тоже, но с точки зрения алгебры это два разных числа. И движок записывает координаты поворота только в промежутке от -180° до 180°, однако напрямую об этом не говорит, поэтому стоит об этом знать, чтобы не было момента, когда вы думаете что вы записываете 225°, а на самом деле там -45°, вы это на что-нибудь умножаете, применяете — и получается вообще не то, что вы ожидали.


Во-вторых, в отличие от Location тут первая и вторая оси (Roll и Pitch) зависят от поворота третьей (Yaw). Легче всего это понять попробовав покрутить любой объект в редактора, обращая внимание на то, как изменяются значения трёх чисел его Rotator во вкладке Details (Можно делать как на уровне, так в блюпринте). А также самому изменять эти значения и посмотреть как поворачивается от этого объект — это можно делать зажав мышку на значении и двигая её вправо для увеличения, и влево для уменьшения числа.
Согласен, всё это с ходу сложновато для понимания. И на самом деле чаще всего это знать не обязательно, есть прекрасный компонент для любого актора, который это всё автоматически просчитывает и делает простое линейное движение — Rotation Movement Component.
Чтобы его добавить на любой актор на уровне вам необходимо выделить актор, перейти к окошку Components, нажать Add и выбрать Rotation Movement Component. После чего он автоматически выберется и в окошке Details можно будет посмотреть и изменить его настройки.
Для того, чтобы посмотреть на анимацию можно либо запустить игру, либо включить симуляцию, чтобы не идти за игрового персонажа к нужному месту, а просто посмотреть на объекты.
Также помните что вы всегда можете сами попробовать поизменять любые параметры и настройки и посмотреть что получиться. Просто открывайте Details и читайте названия все параметров, их описания (появляются если задержать на них мышку), изменяйте их и смотрите на что это влияет.
В Rotating Movement Component основным параметром является Rotation Rate — это три значения, которые будут прибавляться к каждой оси Rotator объекта в секунду. По умолчанию стоит 0, 0, 180 — то есть в секунду объект будет разворачиваться на 180° по оси Yaw.
Помимо скорости также можно изменить точку, вокруг которой будет крутиться объект — пивот. Это настраивается параметром Pivot Translation. Так в том числе можно сделать объект с пивотом далеко за пределами его границы. Например, это может быть птица, летающая в воздухе по кругу.
Ну и давайте сделаем всё тоже самое кодом. Это не сильно сложнее, а при этом даёт гораздо большие возможности как для усложнения анимации поворота, так и для имплементации поворотов в процедурные анимации в дальнейшем.
Для начала умираем наш Rotating Movement Component и переходим в Event Graph.
После чего переходим к ноде Event Tick, это эвент, который запускается при расчете каждого следующего кадра в игре. То есть если в игре FPS 60, то всё подключённое на этой ноде будет производиться 60 раз в секунду.
Далее вызываем ноду Set Actor Rotation — она поворачивает актор (в данном случае этот актор) на значение, которое мы вставляем в эту ноду.
Для того, чтобы изменять поворот плавно, нужно чтобы входящая информация в эту ноду изменялась плавно. Поэтому мы берём нынешний поворот актора нодой Get Actor Rotation и ноду Combine Rotators. Эта нода по сути просто обычный оператор сложения (+), но только учитывает все те особенности координат типа Rotator, о которых я рассказал в начале лекции.
Далее подключаем Get Actor Rotation в Combine Rotators, а Combine Rotators в Set Actor Rotation. Второй вход в ноду Combine Rotators это тот угол, который будет прибавляться к повороту акторов в один тик. Дельта изменений параметра Rotation за один вызов ноды. Аналог Rotation Rate из Rotating Movement Component.
Для удобства настройки и большей читаемости стоит записать наш Rotation Rate в переменную. Для этого нажимаем на второй выход из Combine Rotators правой кнопкой мыши и выбираем Promote To Variable. После чего называем переменную Rotation Rate и записываем в неё какое-нибудь число, чтобы протестировать. Для чего переходим в Viewport блюпринта и запускаем симуляцию — объект будет крутиться вокруг своей оси.
И теперь он работает точно также как и Rotation Rate в Rotating Movement Component — если поставить 0, 0, 180, то объект будет поворачиваться в секунду на 180° по оси Yaw.
Но в отличие от Rotating Movement Component тут гораздо больше возможностей. Однако они и не вынесены списком настроек в Details, поэтому необходимо включать воображение и самому пробовать, тыкать и экспериментировать.
Например, так мы можем анимировать разные компоненты в одном блюпринте независимо друг от друга. Для этого давайте сначала снова вынесем пивот за пределы объекта — на этот раз для этого нужно открыть Viewport и отодвинуть от центра сам объект, Static Mesh, так как пивот всего актора в целом всегда находиться в координатах 0, 0, 0.
После чего нужно продублировать блок нод, который мы сделали ранее, заменить в нём ноды Get Actor Rotation и Set Actor Rotation на Get Relative Rotation и Set Relative Rotation, с подключенными к ним референса на компонент нашего объекта, Static Mesh, который мы только что подвинули.
И также нужно создать ещё одну переменную Rotation Rate, чтобы два вращения могли происходить с разной скоростью. И для наглядности давайте запишем туда другие данные.
После запуска симуляции в Viewport можем видеть что объект крутиться одновременно вокруг вынесенного пивота в одну сторону, и вокруг своей оси совсем в другую сторону. Через компонент Rotating Movement Component такое сделать нельзя — а с помощью кода можно делать сколько угодно таких компонентов, и как угодно ставить в зависимости эти компоненты друг от друга, и делать любую логику.
Например, давайте в завершение этого блока сделаем в этой системе динамично изменяющийся уже Rotation Rate и посмотрим что из этого выйдет. Сделаем анимацию вращение содержимого магического шара.
Домашнее задание:
Вам необходимо заанимировать вращающуюся деталь окружения. Можно использовать как настроенный Rotating Movement Component, так и вращать с помощью кода.
Это может быть любая крутящиеся деталь окружения, например, ветряк, дверь, летающих ворон или даже солнце. Не обязательно делать для неё графику — оценивается только сама анимация, её логичность и естественность. Но хорошо будет, если вы будете выполнять это задание уже для одного из своих проектов.