文章目录
前言
在游戏开发中,旋转是非常重要的操作。例如,我们可能需要将玩家角色绕Z轴旋转来实现转向、将摄像机绕Y轴旋转来实现俯仰等。在UE5.2中,我们可以使用三个欧拉角Pitch、Yaw、Roll及FRotator来实现旋转。
一、三个欧拉角Roll、Picth、Yaw
UE 向开发者提供旋转物体的方式是三个欧拉角:Roll、Picth、Yaw。Roll 是滚动角,Pitch 是俯仰角、Yaw 是偏航角。通过这三个角就能控制物体的旋转,确定一个物体的朝向。
滚动角 Roll
Roll
表示物体围绕红色 X轴 旋转的角度,范围为-180到180度。
俯仰角 Pitch
Picth
表示物体围绕绿色 Y轴 旋转的角度,范围为-90到90度。
偏航角 Yaw
Yaw
表示物体围绕蓝色 Z轴 旋转的角度,范围通常无限制。
蓝图使用图示:
理论上的角度范围,Roll(翻滚角)、Pitch(俯仰角)、Yaw(偏航角) 的取值范围理论上可以是 任意实数(如 -720°、1080° 等)。
但 UE5 会通过 角度归一化(Angle Normalization) 自动将角度转换到 [-180°, 180°] 或 [-90°, 90°) 的等效范围内。
例如:设置 Yaw = 450° 会被转换为 90°(450° - 360° = 90°)。
二、实际应用
角色控制:
- Roll 通常不用于基础角色控制,但可用于特殊效果(如载具翻滚)。
- Pitch 控制视角垂直方向(如鼠标上下移动抬头看天或低头看地)。
- Yaw 控制角色水平旋转(如鼠标左右移动控制视角方向)。
摄像机:
- 组合使用 Pitch 和 Yaw 实现自由视角。
- Roll 可模拟手持摄像机的倾斜效果。
物理模拟:
- 飞行器(飞机、无人机)需要同时控制三个角度。
三、旋转类FRotator
FRotator
是 UE 用来封装三个欧拉角 Roll 、Picth、Yaw 的类。开发者经常需要与 FRotator 打交道,就像需要和表示物体位置的 FVector 打交道一样。
FRotator 是三个欧拉角Picth、Yaw、Roll的封装类
FRotator 有三个成员变量:Picth、Yaw、Roll,正好是三个欧拉角。因此,我们可以说 FRotator 是封装三个欧拉角 Picth、Yaw、Roll 的类。FRotator类还提供了一些方便的函数,例如Add、GetForwardVector、GetRightVector等。使用这些函数可以方便地进行旋转操作。
我们可以使用以下代码创建一个FRotator对象:
FRotator Rotation(0.f, 45.f, 0.f);
上述代码表示创建一个绕Z轴旋转45度(绕自身轴旋转,如原地转向)的FRotator对象。我们可以使用以下代码将一个Actor绕Z轴旋转45度:
Actor->SetActorRotation(Rotation);
除了SetActorRotation函数外,还有其他函数可以设置旋转。例如,我们可以使用以下代码将一个摄像机绕Y轴旋转:
Camera->SetWorldRotation(FRotator(45.f, 0.f, 0.f));
上述代码表示创建一个绕Y轴旋转45度(歪头旋转)的FRotator对象,并将摄像机的世界旋转设置为该FRotator对象。
FRotator 多用于对外接口,FQuat 多用于内部实现
在游戏引擎内部,通常使用四元数来表示旋转,因为四元数能轻易地串接旋转以及进行旋转插值。UE 也不例外。在 UE 内部,使用 FQuat
表示四元数,并用来进行旋转计算。但是四元数并不容易直观理解,在一点上不如欧拉角。为了平衡这一矛盾,UE 就多使用 FRotator 对外提供接口,而 FQuat 多用于实现 UE 内部的功能。换言之,游戏开发者多关注 FRotator,而引擎开发者更注重 FQuat。FRotator 与 FQuat 之间的关系,可以概括为 FRotator 多用于对外接口,FQuat 多用于内部实现,且二者之间可以相互转换。
使用FRotator类可以非常方便地进行旋转操作。例如,我们可以使用以下代码将一个Actor绕Z轴旋转90度:
FRotator Rotation(0.f, 90.f, 0.f);
Actor->SetActorRotation(Rotation);
除了使用FRotator类外,我们还可以使用旋转矩阵来进行旋转操作。在UE5.2中,我们可以使用FMatrix类来表示旋转矩阵。FMatrix
类包含一个3x3的矩阵,表示三个轴的旋转矩阵。
使用 FMatrix 类可以进行更加复杂的旋转操作。例如,我们可以使用以下代码将一个Actor绕任意轴旋转:
FVector Axis(1.f, 1.f, 0.f);
float Angle = 45.f;
FMatrix Rotation = FMatrix::MakeRotationAxis(Axis, FMath::DegreesToRadians(Angle));
Actor->SetActorTransform(FTransform(Rotation, Actor->GetActorLocation()));
在上面的代码中,我们使用FMatrix::MakeRotationAxis函数创建了一个绕任意轴旋转的矩阵,并将其应用到了Actor上。
总结
在UE5.2中,使用三个欧拉角Pitch、Yaw、Roll及FRotator可以非常方便地进行旋转操作。无论是实现玩家角色的转向、摄像机的俯仰还是其他旋转操作,都可以使用FRotator类轻松实现。我们可以使用FRotator类和FMatrix类来实现旋转操作。无论是简单的绕单个轴旋转,还是复杂的绕任意轴旋转,都可以通过这两个类来实现。