Unity 采用左手坐标系。在 Unity 中,可以使用欧拉角和四元数来表示旋转和方向。这两种表示方式是等效的,但具有不同的用途和限制。
通常,可使用变换组件来旋转场景中的对象,该组件以欧拉角的形式显示方向。但是,Unity 在内部将旋转和方向存储为四元数,这对于可能会导致万向锁的更为复杂的运动非常有用。
坐标系描述了对象在三维空间中的位置。Unity 采用左手坐标系:正 x 轴指向右侧,正 y 轴指向上方,正 z 轴指向前方。Unity 的左手坐标系意味着,当沿着正 z 轴观察时,从正 x 轴向正 y 轴的旋转方向为逆时针方向。
在变换组件坐标中,Unity 会显示带有矢量属性 Transform.eulerAngles X、Y 和 Z 的旋转。与法向矢量不同,这些值实际上表示围绕 X、Y 和 Z 轴的旋转角度(以度为单位)。
欧拉角旋转围绕三个轴执行三次单独的旋转。Unity 依次围绕 z 轴、x 轴和 y 轴执行欧拉旋转。这种旋转方式是外旋;当旋转发生时,原始坐标系不会改变。
要旋转游戏对象,可以在变换组件中输入每个轴的旋转角度值。要使用脚本来旋转游戏对象,请使用 Transform.eulerAngles。如果转换为欧拉角来进行计算和旋转,则可能会出现万向锁问题。
当 3D 空间中的对象失去一个自由度并且只能在两个维度内旋转时,称为万向锁。如果两个轴变得平行,则欧拉角会出现万向锁。如果未在脚本中将旋转值转换为欧拉角,则使用四元数应该可以防止万向锁。
如果确实遇到万向锁问题,使用 Transform.RotateAround 进行旋转可以避免欧拉角。也可以在每个轴上使用 Quaternion.AngleAxis 并将它们相乘(四元数乘法会依次应用于每个旋转)。
四元数提供了一种数学符号,用于 3D 空间中的空间方向和旋转的唯一表示。四元数使用四个数字来编码围绕 3D 空间中单位轴的旋转方向和角度。这四个值是复数,而不是角度或度数。您可以参阅四元数数学了解更多信息。
Unity 将旋转值转换为四元数进行存储,因为四元数旋转的计算效率高且稳定。Unity 编辑器不会将旋转显示为四元数,因为单个四元数不能表示围绕任何轴超过 360 度的旋转。
如果使用 Quaternion 类,则可以直接使用四元数。如果使用脚本来进行旋转,则可以使用 Quaternion 类和函数来创建和更改旋转值。可以将值作为欧拉角应用于旋转,但需要将它们存储为四元数以避免出现问题。
如要以自己喜欢的方式查看和编辑旋转,可以使用脚本在四元数和欧拉角之间进行转换:
Quaternion.Euler 函数。Quaternion.eulerAngles 函数。