big

Тема 1. Анимации поворотов: Rotation Movement Component, работа с пивотами.

Здравствуйте, эта первая лекция курса по процедурным анимациям в Unreal Engine 5. Процедурные анимации это в первую очередь анимации, которые автоматически изменяются в зависимости от каких-то нестатических данных. Например, анимация, которая зависит от положения игрока. Но мы будем изучать в целом создание анимаций в UE кодом — то есть всё анимации кроме импортированных анимации и скелетов. Это необходимая база для создания именно процедурных анимаций.

И тема первой лекции — анимации основные на поворотах. Это может быть поворот и всего актора, и отдельного его компонента, и вокруг своей оси, и вокруг вынесенного пивота, и независимые от FPS — про всё это расскажу и по итогу вы сможете сделать небольшую бесконечную интерактивную анимацию поворота.

Текстовое содержание лонгрида и лекция самостоятельны и по большей части дублируют друг-друга, поэтому можете выбрать удобный вам формат. Я рекомендую сначала для большей наглядности смотреть лекцию, а когда будут появляться вопросы во время выполнения задания или позже, читать документацию, так как в ней проще ориентироваться и в ней больше глубоких технических подробностей и ссылок.

Loading...

Начну с основы — координат типа 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 можно будет посмотреть и изменить его настройки.

Loading...
Original size 626x439

Для того, чтобы посмотреть на анимацию можно либо запустить игру, либо включить симуляцию, чтобы не идти за игрового персонажа к нужному месту, а просто посмотреть на объекты.

Original size 716x666

Также помните что вы всегда можете сами попробовать поизменять любые параметры и настройки и посмотреть что получиться. Просто открывайте Details и читайте названия все параметров, их описания (появляются если задержать на них мышку), изменяйте их и смотрите на что это влияет.

В Rotating Movement Component основным параметром является Rotation Rate — это три значения, которые будут прибавляться к каждой оси Rotator объекта в секунду. По умолчанию стоит 0, 0, 180 — то есть в секунду объект будет разворачиваться на 180° по оси Yaw.

Помимо скорости также можно изменить точку, вокруг которой будет крутиться объект — пивот. Это настраивается параметром Pivot Translation. Так в том числе можно сделать объект с пивотом далеко за пределами его границы. Например, это может быть птица, летающая в воздухе по кругу.

Ну и давайте сделаем всё тоже самое кодом. Это не сильно сложнее, а при этом даёт гораздо большие возможности как для усложнения анимации поворота, так и для имплементации поворотов в процедурные анимации в дальнейшем.

Для начала умираем наш Rotating Movement Component и переходим в Event Graph.

Loading...

После чего переходим к ноде 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 блюпринта и запускаем симуляцию — объект будет крутиться вокруг своей оси.

Original size 1601x1081

И теперь он работает точно также как и 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, который мы только что подвинули.

Original size 1601x1081

И также нужно создать ещё одну переменную Rotation Rate, чтобы два вращения могли происходить с разной скоростью. И для наглядности давайте запишем туда другие данные.

После запуска симуляции в Viewport можем видеть что объект крутиться одновременно вокруг вынесенного пивота в одну сторону, и вокруг своей оси совсем в другую сторону. Через компонент Rotating Movement Component такое сделать нельзя — а с помощью кода можно делать сколько угодно таких компонентов, и как угодно ставить в зависимости эти компоненты друг от друга, и делать любую логику.

Например, давайте в завершение этого блока сделаем в этой системе динамично изменяющийся уже Rotation Rate и посмотрим что из этого выйдет. Сделаем анимацию вращение содержимого магического шара.

Loading...
Original size 1601x1081

Домашнее задание:

Вам необходимо заанимировать вращающуюся деталь окружения. Можно использовать как настроенный Rotating Movement Component, так и вращать с помощью кода.

Это может быть любая крутящиеся деталь окружения, например, ветряк, дверь, летающих ворон или даже солнце. Не обязательно делать для неё графику — оценивается только сама анимация, её логичность и естественность. Но хорошо будет, если вы будете выполнять это задание уже для одного из своих проектов.

Анимации поворотов: Rotation Movement Component, работа с пивотами
Project created at 21.07.2025
We use cookies to improve the operation of the website and to enhance its usability. More detailed information on the use of cookies can be fo...
Show more