Приветствую, друзья, с Вами Будуев Антон. В данной статье мы разберем Blueprint-функции изменения угла поворота компонента в относительных координатах родительского элемента, а именно функции Add Relative Rotation и Set Relative Rotation в Unreal Engine (UE4, UE5).
Вскоре выйдет моя бесплатная книга по Blueprints для Unreal Engine в PDF формате. Как она выйдет, рекомендую её скачать, чтобы Вы детально изучили блюпринты Анрил Энджин.
Add Relative Rotation

Функция Add Relative Rotation в Unreal Engine используется для добавления вращения к компоненту относительно системы координат его родителя. Это значит, что заданное вращение будет добавлено к текущему относительному вращению компонента по осям (X, Y, Z) не мировой системы, а системы координат его родителя.
На рисунке ниже представлена мировая система координат, где ось Z всегда направлена строго вертикально снизу вверх. А также относительная родительская система координат для схематичного персонажа, который стоит на зелёном постаменте, являющемся родительским компонентом для персонажа. Причём постамент имеет наклон, вследствие чего его ось Z наклонена. Соответственно, если компоненту персонажа добавить вращение функцией Add Relative Rotation по оси Z, то вращаться он будет вокруг именно родительской оси Z, а не мировой. Далее на практическом примере мы реализуем такое вращение.

Если у компонента нет родителя, то вращение будет добавлено относительно мировой системы координат, так как мир является родительским по отношению к любому объекту, размещённому в нём.
Add Relative Rotation доступна в игровом движке Анрил Энджин только для компонентов Scene Component (или его производного класса) и используется для создания плавных анимаций или механик, где дочерний компонент должен постепенно поворачиваться относительно своего родителя, например, для дверей, окон, частей механизмов и так далее.
Параметры:
- Target (Scene Component, по умолчанию Self) — текущий компонент, для которого необходимо изменить значение вращения.
- Delta Rotation (rotator, по умолчанию X 0,0; Y 0,0; Z 0,0) — ротатор, представляющий дельту, которая будет добавлена к текущему вращению в рамках родительской системы координат.
- Sweep (bool, по умолчанию False) — необязательный параметр, который можно использовать для проверки столкновений при вращении компонента. Если установлено значение True, то вращение будет происходить с учетом столкновений с другими объектами. В случае возникновения такого события, вращение остановится, а информация о столкновении будет возвращена в параметре Sweep Hit Result. При значении False столкновения текущего компонента с любыми объектами будут проигнорированы. Внимание! На момент написания статьи для версии Unreal Engine 5.4 и ниже данный параметр не работает со всеми функциями изменения вращения.
- Teleport (bool, по умолчанию False) — параметр, определяющий, как будет перемещаться физика компонента. При значении True физика телепортируется в новые координаты в том же состоянии, в каком она была до вращения компонента. При значении False физика будет обрабатывать само вращение, из-за чего (при быстром повороте) могут возникнуть артефакты физики (неправильные, нереалистичные расчёты).
- Sweep Hit Result (structure) — возвращаемый параметр. Структура, возвращающая результаты столкновения компонента с другим объектом при включенной опции Sweep. Так как структура сложная, её можно разделить нодой Break Hit Result.
Rotator (ротатор) — это структура, описывающая вращение объекта в трёхмерном пространстве. Она состоит из трёх значений:
— Roll: поворот вокруг оси X (крен).
— Pitch: поворот вокруг оси Y (наклон вверх/вниз).
— Yaw: поворот вокруг оси Z (поворот влево/вправо).
Также в Unreal Engine существуют и другие функции, добавляющие дельту для вращения, например:
- Add Local Rotation — добавляет к значениям текущего вращения компонента дополнительные значения в рамках собственной локальной системы координат компонента.
- Add World Rotation — добавляет к значениям текущего вращения компонента дополнительные значения в рамках мировой системы координат.
Текущая же рассматриваемая функция Add Relative Rotation — добавляет к значениям текущего вращения компонента дополнительные значения в рамках относительной системы координат родительского элемента этого компонента.
Set Relative Rotation

Функция Set Relative Rotation используется для установки поворота компонента относительно родительских координат. Это значит, что заданное вращение будет установлено как новое значение поворота компонента по осям (X, Y, Z) системы координат его родителя.
В отличие от рассмотренной ранее функции Add Relative Rotation, которая добавляет дельту к текущему повороту в рамках родительской системы координат, функция Set Relative Rotation полностью заменяет предыдущее значение поворота новым.
Если у компонента нет родителя, то новый поворот будет установлен относительно мировой системы координат, так как мир является родительским по отношению к любому объекту, размещённому в нём.
Параметры данной функции разбирать мы не будем, так как они полностью соответствуют тем, которые мы уже рассматривали выше, кроме одного — в текущей функции вместо параметра Delta Rotation используется ротатор New Rotation, позволяющий заменить старые значения углов поворота новыми значениями в рамках родительской системы координат.
Set Relative Rotation доступна только для компонентов Scene Component (или его производного класса) и в большинстве случаев используется для конкретной установки поворота объекта компонента относительно его родителя, например, при старте работы Актора в игре для правильной ориентации его внутренних компонентов относительно друг друга.

Практический урок в Unreal Engine: создаём вращение компонента относительно родителя функций Add Relative Rotation
- Создадим Blueprint класса Actor с именем BP_Actor.
- Добавим ему несколько компонентов Cube. Где компонент Cube (для наглядности я его покрасил в зелёный цвет) будет являться постаментом для персонажа, компонент Cube 1 — телом персонажа, а компонент Cube 2 — руками персонажа. Причём Cube является родительским элементом для Cube 1, а он, в свою очередь, является родительским для Cube 2.
- Разместим BP_Actor в игровом мире и добавим поворот компоненту Cube по оси X на —30 градусов, тем самым развернув его собственную локальную систему координат.
Разместим BP_Actor в игровом мире и добавим поворот компоненту Cube по оси X на —30 градусов - Для вращения персонажа Cube 1 в рамках родительской системы координат Cube (зелёный постамент), во вкладке Event Graph блюпринта BP_Actor по событию Event Tick разместим функцию Add Relative Rotation, в параметр Target которой, нодой Get Cube 1 подадим ссылку на компонент куба персонажа.
- Вращение компонента персонажа будем осуществлять только вокруг оси Z его родителя. Соответственно, по осям X и Y вращение должно оставаться неизменным, а по оси Z мы должны добавить вращение. Но просто так добавлять вращение в параметре Delta Rotation мы не будем, так как функция Add Relative Rotation у нас запускается по событию Event Tick и, следовательно, необходимо избежать зависимости от FPS.
- Чтобы сделать вращение независимым от частоты кадров (FPS) при использовании события Event Tick, необходимо учесть дельту секунд (Delta Seconds). Для этого в текущем блюпринте создадим новую переменную скорости Speed, тип которой будет float, и зададим ей значение по умолчанию 200. Затем умножим значение Speed на Delta Seconds, что позволит нам получить дельту, которую мы будем прибавлять к текущему значению угла поворота по оси Z.
- Получившееся значение дельты по оси Z перенаправим в параметр Delta Rotation, который предварительно разделим на 3 float-значения, кликнув по параметру правой клавишей мыши и выбрав опцию Split Struct Pin.
Таким образом, мы получим вращение компонента персонажа вокруг оси Z относительно родительской системы координат, где ось Z наклонена, а не вокруг мировой оси Z, которая направлена строго вертикально снизу вверх.
Скриншот

Код на BlueprintUE

Совет. Вскоре выйдет моя бесплатная книга по Blueprints для Unreal Engine в PDF формате. Как она выйдет, рекомендую её скачать, чтобы Вы детально изучили блюпринты Анрил Энджин.