transform.Rotate旋转顺序分析
本人在研究欧拉角旋转问题时,发现使用Transform.Rotate(Vector3 eulerAngles)方法,物体并不是按照z-x-y的顺序进行旋转。故采用了一些方法对其进行验证。详见下文:
一、Unity API Transform.Rotate方法官方说明
1、形式
形式1:public void Rotate(Vector3 eulerAngles);
形式2:public void Rotate(Vector3 eulerAngles, Space relativeTo = Space.Self);
2、描述
Applies a rotation of eulerAngles.z degrees around the z axis, eulerAngles.x degrees around the x axis, and eulerAngles.y degrees around the y axis (in that order).
应用一个旋转,绕z轴eulerAngles.z度,绕x轴eulerAngles.x度,绕y轴eulerAngles.y度(这样的顺序)。
If relativeTo is not specified or set to Space.Self the rotation is applied around the transform's local axes. If relativeTo is set to Space.World the rotation is applied around the world x, y, z axes.
如果relativeTo未指定或设置为Space.Self,则旋转围绕变换的局部轴应用。 如果relativeTo设置为Space.World,则旋转围绕世界x,y,z轴应用。
二、验证过程
1、transform.Rotate(Vector3 eulerAngles)方法
在Unity中Sence窗口中放置5个飞机模型,每个模型Transform的Rotation的x、y、x初值设为0。并为每个模型添加一个控制模型旋转的脚本,在脚本的start()方法中使用transform.Rotate(Vector3 eulerAngles)方法使每个模型按不同的顺序依次进行旋转。每个模型的旋转顺序角度和结果见下图。
为了方便观察,在脚本中使用Debug.DrawLine()画出了三条辅助线。其中,红线表示惯性坐标系X轴;蓝线表示惯性坐标系Z轴;绿线表示惯性坐标系Y轴。惯性坐标系的定义见文末。(每个模型惯性坐标系的相应轴指向是相同的,因为3D视角的问题,给人不一样的感觉。)
通过图1可以看出,模型2与模型5的旋转角度一样,可以推测,在Unity中使用transform.Rotate(Vector3 eulerAngles)方法对物体进行旋转时,其旋转顺序为y-x-z。为了进一步确认结果,我们先停止游戏播放,拿其中一个模型做测试,首先确认其Transform组件中Rotation的x、y、z都为0,然后按照y-x-z的顺序在Transform组件中调节Rotation的y、x、z值。在这个过程中可以发现,每次都是围绕物体自身坐标系的对应轴旋转相应角度。
2、transform.Rotate(Vector3 eulerAngles, Space.World)方法
在Unity中Sence窗口中放置5个飞机模型,每个模型Transform的Rotation的x、y、x初值设为0。并为每个模型添加一个控制模型旋转的脚本,在脚本的start()方法中使用transform.Rotate(Vector3 eulerAngles, Space.World)方法使每个模型按不同的顺序依次进行旋转。每个模型的旋转顺序角度和结果见下图。
图2
通过图2可以看出,模型4与模型5的旋转角度一样,可以推测出,在Unity中使用transform.Rotate(Vector3 eulerAngles, Space.World)方法对物体进行旋转时,其旋转顺序为z-x-y。为了进一步确认结果,我们先停止游戏播放,拿其中一个模型做测试,首先确认其Transform组件中Rotation的x、y、z都为0,然后按照z-x-y的顺序在Transform组件中调节Rotation的z、x、y值。在这个过程中可以发现,模型每次都是围绕物体惯性坐标系的对应轴旋转相应度数。
现在我们可以得出以下结论:
使用transform.Rotate(Vector3 eulerAngles)方法对物体旋转时,按照y-x-z的顺序围绕自身坐标系旋转。
使用transform.Rotate(Vector3 eulerAngles, Space.World)方法对物体旋转时,按照z-x-y的顺序围绕惯性坐标系(世界坐标系)旋转。
其他注意事项,在停止游戏后,确认某模型Transform组件中Rotation的x、y、z都为0后,不按y-x-z、z-x-y的顺序调节x、y、z的参数时,在同一轮调整中,x、y、z轴不一定一直都围绕自身或惯性坐标系旋转,有时甚至不清楚绕什么轴旋转。详见下表
表1
表格说明:“惯/物”表示可能围绕惯性坐标系相应轴旋转,也可能围绕物体坐标系(自身坐标系,下同)相应轴旋转,因为最开始时,惯性坐标系与物体坐标系重叠;“物”表示围绕物体坐标系相应轴旋转;“惯”表示围绕惯性坐标系相应轴旋转;“?”表示不清楚围绕哪个坐标系哪个轴旋转。
三、名词解释
惯性坐标系:原点和物体坐标系的原点重合,轴平行于世界坐标系轴的坐标系统。若想详细了解,请参考《3D数学基础:图形与游戏开发》等书籍。
图3 物体坐标系、惯性坐标系和世界坐标系