Transforming Actors
How to modify the location, rotation, and scale of Actors in a Level.
Transforming an Actor in Unreal Engine refers to moving, rotating, or scaling it (in other words, adjusting the position, orientation, and / or size of the Actor). This page describes how to perform each of these actions, as well as some of the commonly used keyboard shortcuts when working with Actors.
There are two ways to transform Actors in the Unreal Editor:
In Unreal Engine, the vertical axis is the Z axis.
Manual Transformation
You can do manual transformation through the Transform section of the Details panel. When you select one or more Actors in the Level Viewport, you can view and edit their Location, Rotation, and Scale in this section. Where applicable, this section also contains Actor mobility settings.
The Transform section of an Actor’s Details panel, showing values for the Actor’s Location, Rotation, and Scale.
Each Transform property has numeric entry fields for the X, Y, and Z axes. You can type specific values directly into these fields to adjust the selected Actors, or click inside a field and drag your mouse up or down to adjust that field’s value.
If more than one Actor is selected, and their Location or Rotation has multiple values, the relevant fields will display Multiple Values. In this case, if you enter a number it will overwrite that value for all selected Actors. Note that this may cause the Actors to overlap.

With multiple Actors selected, one or more Transform fields can have multiple values, as this example illustrates.
To reset an Actor’s Location, Rotation, or Scale to their default values after you’ve made changes, click the Reset to Default button (
).
You can lock the Scale fields by clicking the Lock Scale button (
). When locked, the values for each axis (X, Y, and Z) change in unison, which allows for uniform scaling and prevents distortion.
Transform properties default to relative coordinate space, which means the transform occurs relative to the Actor’s parent. You can toggle between relative and world transforms by clicking the dropdown arrow next to a property label. World transforms occur relative to world coordinates instead of the Actor’s parent. For more information, see the World and Local Transformation Modes section on this page.
Interactive Transformation
You can do Interactive transformation directly inside the Level Viewport, using a visual tool called a gizmo. Sometimes, a gizmo can also be called a widget; in Unreal Engine, these terms mean the same thing.
A gizmo is made up of several parts that are color-coded according to which axis they affect:
Red represents the X axis.
Green represents the Y axis.
Blue represents the Z axis.
You can use transformation gizmos to move, rotate, or scale Actors.
Gizmos are more intuitive to use, but they can be less precise than entering coordinates manually. Use grid snapping for precise positioning when using gizmos. For more information, refer to the Actor Snapping page.
The gizmo takes different forms depending on what type of transformation is being performed: translation, rotation, or scale. You can choose which type of gizmo you want to use by clicking its icon in the Level Viewport toolbar, which is located in the upper-right section of the viewport, or by using keyboard shortcuts.

The Level Viewport toolbar is located in the upper-right section of the viewport. Click the image for full size.

Left to right: Shortcuts to the Selection, Translation, Rotation, and Scaling gizmos in the Level Viewport toolbar.
With one or more Actors selected, you can toggle between the different types of gizmos by pressing the Space Bar on your keyboard.
You can toggle the visibility of transformation gizmos on and off from the Main Toolbar’s Settings menu by enabling or disabling the Show Transform Widget option.
Translation Gizmo
The Translation gizmo is a set of color-coded arrows pointing down the positive direction of each axis in the world. Use it to move an Actor along an axis, a plane, or freely.
Click an arrow and drag an arrow to move the selected Actor along that axis.

Translating a cube along a single axis.
To move an Actor along two axes simultaneously, click the square at the point where the two axes meet, then drag to move the Actor along the plane defined by the two axes (XY, XZ, or YZ).

Translating a cube along two axes (a single plane).
To move the Actor freely along all three axes, click and drag the white sphere at the point where all three axes intersect. You can also use the mouse wheel to move the Actor nearer or farther.

Translating a cube along all three axes.
Duplicating an Actor Using the Translation Gizmo
To duplicate an Actor, hold down the Alt key, then click and drag a Translation gizmo arrow. This creates and moves a duplicate of the selected Actor, leaving the original unchanged at the starting position.

Duplicating an Actor using the Translation gizmo.
Rotation Gizmo
The Rotation gizmo is a set of three color-coded arcs, each associated with one axis. When you drag one of the arcs, the selected Actor rotates around that axis. For this gizmo, the axis affected by any one of the arcs involved is the one perpendicular to the arc. For example, the arc aligned to the XY plane rotates the Actor around the Z axis.

Rotating an Actor using the Rotation gizmo.
When you hover the cursor over a particular arc, that arc turns yellow, indicating that you can drag it to rotate the Actor. When you start to rotate the Actor, the gizmo changes shape to show only the axis around which the Actor is being rotated. The amount of rotation is displayed in real time to help you gauge your progress.
Scale Gizmo
The Scale gizmo has handles that end in cubes. When you drag the gizmo by one of these handles, you scale the selected Actor only along the associated axis. The handles are color-coded by axis, similar to the Translation and Rotation gizmos.

Scaling an Actor along a single axis.
You can scale an Actor along two axes simultaneously in the same way you can use the Translation gizmo to move an Actor along a plane defined by two axes. Each axis is connected to each other axis with a line that forms a triangle. These triangles align with one of the three planes (XY, XZ, YZ). Dragging one of these triangles scales the Actor along both axes that define that plane. When the mouse hovers over one of these triangles, the associated handles turn yellow.

Scaling an Actor along a single plane.
You can also scale an Actor along all three axes, thus maintaining its original proportions. If you hover the cursor over the cube where all three axes meet, all three handles turn yellow. Dragging by that center cube scales the Actor proportionally.

Scaling an Actor proportionally.
World and Local Transformation Modes
When using the interactive transformation method, you can choose which reference coordinate system you want to use when performing the transformation. This means you can transform the Actor in accordance to either:
World space — that is, along the world axes, or
The Actor’s local space — that is, along its local axes.
The example below shows the difference between world and local space, using a Static Mesh Actor.


World space: The translation gizmo’s XYZ axes are the same as the world’s XYZ axes. Dragging along the Z axis moves the cube up and down in relation to the floor.
Local space: The translation gizmo’s XYZ axes use the cube’s local coordinates. Dragging along the Z axis also moves the cube up and down, but at an angle.
By default, the Unreal Editor starts out in world transformation mode. To switch to local transformation mode, click the Globe icon in the Level Viewport toolbar. The globe turns into a cube icon, indicating that you are now in local transformation mode. Click the cube to switch back to world coordinates.

The Globe icon indicates that transformations for the currently selected Actor use world space coordinates.
Adjusting an Actor’s Pivot Point
When transforming Actors, you typically perform your transforms from the base pivot of the Actor. If you have a transformation gizmo enabled, you can see the pivot point where the three axes of that gizmo intersect.
You can adjust the location of an Actor’s pivot temporarily by middle-clicking on the sphere in the center point of the Translation gizmo and dragging to move the pivot. You can then transform the object around the new pivot point.
The pivot point can be inside or outside an Actor.

In this example, the Static Mesh Actor rotates around an external pivot point.
The pivot jumps back to its original location as soon as you deselect that Actor. To make the pivot change permanent, after you adjust the pivot, right-click the Static Mesh and select Pivot > Set as Pivot Offset.
To reset the pivot to its default location, right-click the Static Mesh, then select Pivot > Reset Pivot Offset.
Keyboard Shortcuts
Below are some of the common keyboard shortcuts when working with Actors.
Control
Tool or Action
W
Selects the Move tool.
E
Selects the Rotate tool.
R
Selects the Scale tool.
V (hold down while using a translation gizmo)
Toggles vertex snapping.
Left-click and drag (on a transformation gizmo)
Moves, rotates, or scales the selected Actor, depending on the transformation gizmo that is currently active.
Middle-click and drag (on a pivot point)
Moves the pivot of the selected Actor.
Ctrl + W (on an Actor)
Duplicates the selected Actor at the same coordinates as the original.
Alt + Left-click and drag (on a translation gizmo)
Duplicates the selected Actor.
H (on an Actor)
Hides the selected Actor.
Ctrl + H
Shows all hidden Actors.
Shift + E (on an Actor)
Selects all matching Actors in the Level of the same type as the selected Actor.
Как повернуть игрока в нужную сторону ue4
Completing the CAPTCHA proves you are a human and gives you temporary access to the web property.
What can I do to prevent this in the future?
If you are on a personal connection, like at home, you can run an anti-virus scan on your device to make sure it is not infected with malware.
If you are at an office or shared network, you can ask the network administrator to run a scan across the network looking for misconfigured or infected devices.
Another way to prevent getting this page in the future is to use Privacy Pass. You may need to download version 2.0 now from the Chrome Web Store.
Cloudflare Ray ID: 71aebbe16eee0662 • Your IP : 82.102.23.104 • Performance & security by Cloudflare
Реализуем в Unreal поворот персонажа на месте
На первый взгляд, задача поворота персонажа на одном месте кажется простой. Мол, в чем проблема – отследить, когда игрок поворачивает камеру, и воспроизвести подходящую анимацию, в которой он переступает ногами. Но если копнуть чуть глубже, то вылезет неприятная проблема. Скорость движения мышки (или стика) не статична. Скорость может меняться, а еще игрок может на ходу менять направление поворота, двигать камеру рывками и т. п. Поскольку анимацию мы проигрываем не сразу, а плавно подмешиваем к предыдущей, то наша анимация поворота не будет успевать подстраиваться под меняющиеся условия. Я уж не говорю о том, что ноги вообще будут двигаться черт знает как.
Полный отказ от анимации поворота на месте часто встречался в старых играх и до сих пор сохраняется в индюхах. Однако существуют приемы, позволяющие решать проблему нестабильного поведения камеры. Например, во многих играх верхняя половина тела «прицепляется» к камере и неотрывно движется за ней. Когда камера отклоняется на заданный угол (например, 45 градусов) от ориентации нижней половины туловища, персонаж переставляет свои ноги.
Еще один подход заключается в использовании Root Motion. Можно сделать несколько анимаций для поворота на заранее заданные углы (45, 90, 135, 180 градусов) и проигрывать ту из них, которая соответствует смещению камеры. В результате, движение будет аккуратным и естественным, но у него есть два очевидных минуса. Во-первых, Root Motion отбирает управление у игрока, т.е. эта система не подходит для анимации в бою. Во-вторых, персонаж не может повернуться свободно на любой угол.
И есть еще один подход, который я подсмотрел на стриме на официальном канале Unreal Engine и слегка оптимизировал. О нем пойдет речь ниже.
Ведущий специалист по анимации Epic Games Джей Хосфельт продемонстрировал интересную идею: отказаться от нормального проигрывания анимации поворота и вместо этого каждому углу поворота камеры вокруг собственной оси сопоставить одну статичную позу. Т. е. движок не будет проигрывать анимацию поворота от ее первого кадра в последнему. Вместо этого игрок, двигая камеру от 0 до 360 градусов, будет выбирать один кадр, соответствующий текущему углу.
Если пока не понятно, то откройте любую анимацию в редакторе Blender или Maya, а потом попробуйте мышкой подвигать ползунок на шкале времени вперед и назад с разной скоростью. Вне зависимости от направления движения, персонаж будет аккуратно двигаться взад-вперед, и его скорость будет подстраиваться под скорость вашей руки.
В учебном стриме Хосфельт использует залупленную (т. е. позы персонажа в первом и последнем кадрах там совпадают) анимацию поворота на 360 градусов. Он анимировал рутовую кость, линейно (с одинаковой скоростью) поворачивая ее на те же 360 градусов, а потом обнулил анимацию этой кости. Потому что нужный угол будет задаваться камерой. В результате получилась анимация, в которой персонаж постоянно смотрит вперед, но перебирает ногами.
На самом деле, совсем не обязательно брать анимацию поворота на полные 360 градусов. Главное, чтобы она была залупленной, а угол и направление поворота могут быть любыми. Можно взять анимацию поворота на 90 градусов из популярного мокап-набора базовых анимаций на Unreal Marketplace от Kubold. В наборе есть ассет со «срезанной» анимацией рутовой кости и ассет, в котором она оставлена. Вам потребуется первый.
Если нет идеально подходящего ассета, то анимацию рутовой кости можно сбрасывать и в реальном времени. В этом случае потребуется сделать чуть побольше работы в анимационном блюпринте. Для примера готового проекта (ссылка в конце) я взял бесплатный ассет анимации из игры Paragon, который Epic Games выложила на маркетплейсе вместе с моделькой Шинби.
Начнем с того, что создадим проект UE5 на основе шаблона Third Person.
Поскольку мы хотим жестко привязать поворот игрока к камере, в параметрах класса Pawn нужно установить чекбокс Use Controller Rotation Yaw. Обычно альтернативой этому является использование компонента Character Movement, который будет поворачивать персонажа вслед за камерой не мгновенно, а с определенной скоростью Rotation Rate, но нам это не подходит.
Хотя нет: на самом деле, мы все-таки будем использовать Rotation Rate, но только во время бега, чтобы добиться более красивой анимации. Потому переключение режимов поворота мы поместим в событие Tick.
Когда игрок куда-нибудь бежит, он поворачивается вслед за камерой со скоростью, определенной в Character Movement. Когда он останавливается, его ориентация жестко привязана к камере. Теперь давайте перейдем в анимационный блюпринт и подумаем над тем, как должна работать наша система.
Когда игрок бежит, а потом останавливается, у него нет никакого поворота – он смотрит вперед и стоит прямо. Когда он начинает поворачивать камеру после остановки, нам нужно посчитать угол поворота и «перевести» его в номер кадра в анимационном ассете. Грубо говоря, для 90-кадровой анимации с поворотом на 90° при повороте игрока на 1° нужно показывать кадр №1, при повороте на 2° – кадр №2 и т. д. Только нам придется указывать не номер кадра, а время, соответствующее этому кадру.
В Event Graph перейдем к единственному переопределенному событию Blueprint Update Animation. Для начала запомним DeltaTime в переменной, чтобы его было удобно использовать для интерполяции, и сохраним ссылку на родительский объект персонажа.
Ах да, я переименовал блюпринт ThirdPersonChracter в BP_TPCharacter. Потому что хочу и могу.
Еще я добавил ноду Sequence, а в конце шаблонного кода (где мы извлекаем значения IsInAir и Speed из объекта OwnerCharacter) я оттуда же выгрузил MovementInput в одноименную переменную внутри анимационного блюпринта.
Всё, что относится к повороту персонажа на месте, я решил запихать в отдельный Collapsed Graph.
Вначале надо сделать то, о чем говорилось выше. В каждом тике независимо от условий мы сохраняем текущую ориентацию персонажа вокруг вертикальной оси в переменную Character World Yaw, а когда персонаж движется (бежит или прыгает), сохраняем ее еще и в Character World Yaw Base. После остановки мы сможем простым вычитанием узнать отклонение камеры от направления «вперед».
Теперь давайте создадим переменную Rotate Frame, в которой будет храниться кадр (а точнее, время в анимации), соответствующий текущему углу поворота. Когда персонаж начинает двигаться, нам надо обнулить это значение, но не мгновенно, а плавно, чтобы при переходе от одной анимации к другой не было резкого скачка. Для этого используем интерполяцию FInterp To к нулю.
На скриншоте использована скорость 12, но ее стоит уменьшить до 6-8. Смысл следующий. Представьте, что персонаж начинает двигаться, когда он имеет определенный поворот (Rotate Frame > 0). В стейт-машине начинается плавный переход от состояния Idle в состояние Run. Если Rotate Frame резко обнулится, то точно так же резко изменится состояние Idle, которое все еще является частично видимым. Мы не хотим допустить резкого скачка анимации, поэтому сбрасываем значение Rotate Frame плавно.
Прежде чем вычислять Rotate Frame, давайте откроем нашу анимацию и найдем ее длительность в секундах. У меня ассет с поворотом на 90 градусов имеет длительность 1,3 секунды. Это значение я сохраню в переменную Turn Sequence Length. А угол поворота (т. е. 90⁰) сохраню в Turn Sequence Angle. При замене используемого ассета можно будет просто подкорректировать значения этих переменных, не меняя формулу.
Теперь у нас есть все необходимое. Осталось найти разницу между Character World Yaw и Character World Yaw Base и перевести ее из градусов поворота в секунды анимации.
Поскольку мы проводим операцию с углами, которые находятся в диапазоне от -180⁰ до 180⁰, для правильного расчета разности нам потребуется использовать функцию Normalize Axis.
Сначала мы находим угол поворота камеры относительно сохраненного «нулевого» положения вперед. Если он отличен от нуля, то вычисляем время. Формула выглядит следующим образом:
Угол поворота (Delta) делим на максимальный поворот в нашей анимации (у меня это 90⁰). Мы получаем долю анимации.
Например, 45° → 0,5 (середина анимации), а 90° → 1 (конец).
45° → 0,5 → 10,5. И 90° → 1 → 11.
45° → 10,5*1,3 = 13,65 секунд (без лишних периодов было бы 0,65). И 90° → 11*1,3 = 14,3 секунд (или искомые 1,3).
Для 45° мы получим время 0,65 секунд, а для 90° – ноль, что эквивалентно 1,3 с (анимация-то у нас зациклена, и первый кадр равен последнему).
Time = [((Delta / TurnSequenceAngle) + 10) * TurnSequenceLength] % TurnSequenceLength
Обратите внимание, что эта формула написана для анимации, в которой персонаж поворачивается вправо. Если мы хотим использовать анимационный ассет с поворотом влево, то нам потребуется отматывать его в противоположную сторону:
Time_left = [((1 — Delta / TurnSequenceAngle) + 10) * TurnSequenceLength] % TurnSequenceLength
Теперь давайте перейдем в Anim Graph и откроем стейт-машину Default, управляющую перемещением персонажа. В ней одно состояние Idle/Run с бленд-спейсом управляет и анимацией покоя, и анимацией перемещения персонажа. Нас это категорически не устраивает.
Чтобы разделить Idle/Run на Idle и Run, нам нужно знать, когда персонаж движется, а когда стоит. Но мы уже сохранили нужное значение в переменную Movement Input.
В стейте Run без изменений останется тот BlendSpace1D (Idle ↔ Walk ↔ Run), который раньше находился в Idle/Run, а вот новый стейт Idle нужно сделать с нуля.
Для начала перетащим туда нашу анимацию поворота. Кликнем по ней правой кнопкой мыши и выберем в контекстном меню пункт Convert to Single Frame Animation. Затем к входящему параметру Explicit Time присоединим переменную Rotate Frame.
Если сейчас запустить проект, то мы увидим две проблемы, и обе будут проявляться при остановке мыши. Во-первых, наша анимация стала статичной. Персонаж не «дышит», не покачивает руками, а замирает в одной позе, как в какой-нибудь ААА-игре 2002 года или в инди-шедевре 2022 года. Во-вторых, при повороте камеры одна из его ног может зависнуть в воздухе.
С первым пунктом разобраться легко. Давайте откроем дефолтную Idle-анимацию персонажа, создадим ее дубликат и в настройках превратим его в аддитивную анимацию:
Additive Anim Type = Local Space
Base Pose Type = [оригинальный анимационный ассет, который мы продублировали]
А затем наложим эту анимацию на анимацию поворота в Idle (state):
С ногами ситуация сложнее. В оригинальном видеотуториале Джей Хосфельт предлагает создать дублирующую анимацию вращения, в которой ноги постоянно будут волочиться по поверхности, и переключаться между ней и нормальной анимацией в зависимости от того, двигает ли игрок камеру в настоящий момент.
Этот подход имеет право на существование, но, в обобщенном случае, предполагает избыточную работу. Если персонажу предстоит передвигаться не по ровной горизонтальной поверхности, то ему потребуется какой-то дополнительный алгоритм позиционирования ног и туловища (foot placement), задача которого заключается как раз в том, чтобы в реальном времени ставить ноги на неровную поверхность. Обычно для этого делается трассировка мира под подошвы ног, чтобы определить расстояние до поверхности, а потом применяется некоторая инверсная кинематика, чтобы установить на эту поверхность ноги.Если мы собираемся использовать такую систему (например, реализованную через Control Rig), то нам не нужна вторая анимация с волочащимися по земле ногами. Достаточно переключаться между нормальной анимацией поворота и нашей системой foot placement.
Позиционирование ног – тема отдельного, и немаленького туториала. Вот в этом уроке (осторожно, 3 часа) рассказывается – увы, без весьма необходимых подробностей – о реализации подобной системы в через Control Rig. Предложенное решение не является совершенным, но его можно улучшить и добиться весьма неплохих результатов.
Для упрощения задачи, мы используем метод с двумя анимациями. Если вам лень самостоятельно отредактировать анимацию поворота, то вот здесь можно скачать модификатор (animation modifier), который сделает это прямо в редакторе UE5. Создайте дубликат анимации поворота, подключите плагин и далее следуйте инструкциям с гитхаба.
Итак, у нас есть две анимации. В одной персонаж переставляет ноги, а во второй с той же скоростью волочит их по земле. Чтобы переключаться между ними, нужно знать скорость вращения камеры, нормализованную от 0 до 1 (0 – показываем анимацию с ногами на земле, 1 – показываем нормальную анимацию поворота). Проще всего будет сохранить текущее значение Input Axis в блюпринте персонажа.
Это все еще стандартный блюпринт персонажа от третьего лица (BP_TPCharacter), в котором обрабатывается ввод с мыши и с контроллера. В обоих случаях входящее значение сохраняется в переменной Turn Rate. Оно будет находиться в диапазоне от -1 (поворот влево) до 1 (поворот вправо).
Теперь вернемся в анимационный блюпринт, откроем созданный нами Collapsed Graph с названием Turn In-Place и прочитаем значение переменной Turn Rate из BP_TPCharacter. Нам нужно взять это значение по модулю (потому что направление поворота не важно) и слегка сгладить при помощи достаточно быстрой интерполяции.
How to rotate an Actor towards a Location in Unreal Engine
I’ve been experimenting with AI Controllers and my Unreal Guys walking towards random locations in the game world. As such I needed a way for them to turn smoothly towards said random locations before they starting to walk. Thankfully I found out about the Find Look At Rotation node. It was exactly the missing piece to this brainteaser.
Here’s how I made my Unreal Guys turn towards a new location:

This is a custom event on my character. It’s called from my custom Behaviour Tree Node, passing in a new Vector called New Location. First I’ll grab my capsule component’s World Location and use the Find Look At Rotation node to get where (or what) my character should be looking (at). This node needs the new location to give us a Rotation value. I’ll break that struct and access the Z rotation.
I’ll also grab my current World Rotation and find out where my character is currently looking at. Again the Z rotation is all I need to proceed. We need to find a way to interpolate between these two values, then continuously update the Z rotation until we reach the new value. At that point, we’re looking towards where we’re going to walk next.

To interpolate these values, I’m using a combination of Timeline and Lerp Node. The Timeline will give us a float value between 0 and 1 interpolated over one second. When plugged into the Lerp Node, it’ll interpolate between two values of the same kind and give out the interpolated value (in our case, the Z rotation). We’ll use that to make ourselves a new Rotator, which will then update our current World Rotation.

Lerp nodes are very flexible. It stands to reason that the breaking/making rotations could be avoided, since the Lerp can deal with blending two rotators. I’ve tried this too, but it leads to weird results on the characters. I’d advise against it. It would make for a neater Blueprint though – check it out:

On a personal note, I was quite surprised that with my limited knowledge of Unreal Engine, I managed to work out this rather complex equation. I’m beginning to understand how Unreal Engine thinks