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, работа с пивотами
5
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