Пространственные преобразования (Spatial Transformations) в Unreal Engine — это фундаментальные операции, которые позволяют изменять положение, поворот и масштаб объектов в 3D-пространстве. Понимание этих преобразований необходимо для создания динамичных и интерактивных сцен. В Unreal Engine есть несколько способов работы с пространственными преобразованиями, как в Blueprints, так и в C++.
I. Основные типы преобразований:
Translation (Перемещение): Изменяет положение объекта в пространстве. Rotation (Поворот): Изменяет ориентацию объекта в пространстве. Scale (Масштабирование): Изменяет размер объекта.
II. Системы координат:
World Space (Мировое пространство): Абсолютная система координат, в которой определено положение всех объектов в сцене. Local Space (Локальное пространство): Система координат, связанная с конкретным объектом. Положение, поворот и масштаб объекта определяются относительно его локального пространства. Relative Space (Относительное пространство): Положение, поворот и масштаб одного объекта относительно другого.
III. Работа с преобразованиями в Blueprints:
Get Actor Location/Rotation/Scale: Получение текущих значений преобразований:
Get Actor Location: Возвращает положение объекта в мировом пространстве. Get Actor Rotation: Возвращает поворот объекта в мировом пространстве (в виде Rotator). Get Actor Scale 3D: Возвращает масштаб объекта.
Set Actor Location/Rotation/Scale: Установка новых значений преобразований:
Set Actor Location: Устанавливает положение объекта в мировом пространстве.
Sweep: Если включено, объект будет перемещаться, пока не столкнется с другим объектом. Teleport: Если включено, объект будет телепортирован в новую позицию, игнорируя столкновения.
Set Actor Rotation: Устанавливает поворот объекта в мировом пространстве. Set Actor Scale 3D: Устанавливает масштаб объекта.
Add Actor Local Offset/Rotation/Scale: Добавление смещения к текущим значениям преобразований в локальном пространстве:
Add Actor Local Offset: Добавляет смещение к положению объекта в его локальном пространстве. Add Actor Local Rotation: Добавляет поворот к ориентации объекта в его локальном пространстве. Add Actor Local Scale: Добавляет масштаб к размеру объекта.
Add Actor World Offset/Rotation/Scale: Добавление смещения к текущим значениям преобразований в мировом пространстве:
Add Actor World Offset: Добавляет смещение к положению объекта в мировом пространстве. Add Actor World Rotation: Добавляет поворот к ориентации объекта в мировом пространстве. Add Actor World Scale: Добавляет масштаб к размеру объекта.
Transform Variables: Переменные типа Transform позволяют хранить положение, поворот и масштаб в одном месте.
Make Transform: Создает переменную Transform из отдельных значений. Break Transform: Разбивает переменную Transform на отдельные значения.
IV. Работа с преобразованиями в C++:
Accessing Transforms:
GetActorLocation(): Возвращает положение актера в мировом пространстве (FVector). GetActorRotation(): Возвращает поворот актера в мировом пространстве (FRotator). GetActorScale3D(): Возвращает масштаб актера (FVector). GetTransform(): Возвращает полную трансформацию актера (FTransform).
Setting Transforms:
SetActorLocation(FVector NewLocation, bool bSweep = false, ETeleportType Teleport = ETeleportType::None): Устанавливает положение актера в мировом пространстве. SetActorRotation(FRotator NewRotation, bool bSweep = false, ETeleportType Teleport = ETeleportType::None): Устанавливает поворот актера в мировом пространстве. SetActorScale3D(FVector NewScale): Устанавливает масштаб актера. SetActorTransform(const FTransform& NewTransform, bool bSweep = false, ETeleportType Teleport = ETeleportType::None): Устанавливает полную трансформацию актера.
Adding Offsets:
AddActorLocalOffset(FVector Offset, bool bSweep = false, FHitResult* SweepHitResult = nullptr): Добавляет смещение к локальному положению. AddActorLocalRotation(FRotator Rotation, bool bSweep = false, FHitResult* SweepHitResult = nullptr): Добавляет поворот к локальному вращению. AddActorWorldOffset(FVector Offset, bool bSweep = false, FHitResult* SweepHitResult = nullptr): Добавляет смещение к мировому положению. AddActorWorldRotation(FRotator Rotation, bool bSweep = false, FHitResult* SweepHitResult = nullptr): Добавляет поворот к мировому вращению.
FTransform Structure:
FTransform Location: Вектор (FVector) для хранения положения. FTransform Rotation: Кватернион (FQuat) для хранения поворота. FTransform Scale3D: Вектор (FVector) для хранения масштаба.
V. Типы данных для поворота:
Rotator (FRotator): Представляет поворот в виде углов Эйлера (Pitch, Yaw, Roll).
Углы Эйлера могут вызывать проблему Gimbal Lock.
Quaternion (FQuat): Представляет поворот в виде кватерниона.
Кватернионы не подвержены Gimbal Lock и более эффективны для интерполяции поворотов.
Transform (FTransform): Хранит положение, поворот (в виде кватерниона) и масштаб.
VI. Полезные функции и узлы:
MakeRotator: Создает Rotator из углов Pitch, Yaw и Roll. MakeQuat: Создает Quat из углов Pitch, Yaw и Roll. RInterp To: Интерполирует поворот от текущего значения к целевому. VInterp To: Интерполирует значение вектора. FInterp To: Интерполирует значение float. UKismetMathLibrary::FindLookAtRotation: Возвращает Rotator, указывающий на заданную точку. UKismetMathLibrary::ComposeRotators: Комбинирует два Rotator. UKismetMathLibrary::InverseTransformLocation: Преобразует положение из мирового пространства в локальное. UKismetMathLibrary::TransformLocation: Преобразует положение из локального пространства в мировое. UKismetMathLibrary::InverseTransformRotation: Преобразует поворот из мирового пространства в локальное. UKismetMathLibrary::TransformRotation: Преобразует поворот из локального пространства в мировое. Transform To/From Local/World Space: используйте для преобразования из локального в мировое и наоборот.
VII. Рекомендации:
Choose the Right Coordinate System: Выберите подходящую систему координат для вашей задачи. Use Quaternions for Rotations: Используйте кватернионы для представления поворотов, чтобы избежать проблемы Gimbal Lock. Use Interp Functions for Smooth Transitions: Используйте функции интерполяции для создания плавных переходов между значениями преобразований. Optimize Performance: Оптимизируйте свой код для повышения производительности. Use Comments: Добавляйте комментарии к своему коду, чтобы было легче понимать, что происходит. Test Thoroughly: Тщательно тестируйте свой код, чтобы убедиться, что он работает правильно. Avoid unnecessary calculations: Избегайте вычислений без необходимости.
Понимание пространственных преобразований — важный навык для любого разработчика Unreal Engine.