本文主要测试transform.localRotation
的使用,该属性一般使用四元数赋值,通过Quaternion
可以将欧拉角转化为四元数。`xxx.transform.localRotation = Quaternion.Eular(float x, float y, float z);
在三个立方体的场景中,有根节点立方体、父节点立方体和子节点立方体共三个。下面的测试中分别控制三个立方体,分别控制立方体的不同坐标维度的旋转角度。
第一部分:通过
localRotation
控制父节点立方体的转动
一.使用实例1
该实例只是简单表现localRotation
的使用方法,使得Cube1绕Z轴旋转45°。
【结论补充与分析】上述两个部分使用Rotation
控制Cube1(父节点)绕单一坐标轴做旋转。注意,上述语句与使用Rotate(new Vector3(x,y,z), Space.Self)
和Rotate(new Vector3(x,y,z), Space.World)
的结果一致。
二.使用实例2
该部分的实例都是通过localRotation
控制Cube1绕两个坐标轴做旋转。同时探究旋转轴的顺序和参考坐标系的问题。
先看结论:旋转轴的顺序是X-Y-Z,该旋转轴是父节点的本地坐标系。
(一)实例2-1
实例2-1使得Cube1绕z轴和y轴旋转
【结论分析】从上图联合控制的结果中分析可得,Cube1可以从以下方式获得:①如图0614456,绕世界坐标系正z轴旋转45°,绕世界坐标系正y轴旋转45°(顺序反之则不可);②如图0614231,绕世界坐标系正y轴(本地坐标系y轴)旋转45°,再绕旋转所得本地坐标系z轴旋转45°;注意,根据其他资料显示第1种是正确的。后面将做具体讲解。
(二)实例2-2
实例2-2使得Cube1绕x轴和y轴旋转
【结论分析】从上图联合控制的结果中分析可得,Cube1可以从以下方式获得:①如图69523所示,绕世界坐标系正x轴旋转-45°,绕世界坐标系正y轴旋转45°(顺序反之则不正确);③如图0614528,绕本地坐标系Y轴旋转45°,再绕旋转之后所得的本地坐标系X轴旋转-45°。
(三)实例2-3
实例2-2使得Cube1绕x轴和z轴旋转
【结论分析】从上图联合控制的结果来看,Cube1可以从以下方式得到:①如图0614756,绕世界坐标系Z轴旋转45°,然后再绕世界坐标系X轴旋转45°。由于时间关系,此处不再验证与本地坐标系的关系。直接甩结论。
初步结论:
transform.localRotation
控制旋转角度与本地坐标系无直接联系,其实与世界坐标系也无直接联系。上面三组实验,初步可以看出transform.localRotation
可以分解成绕世界坐标系的旋转,其实此处的世界坐标系与Cube1的父节点Cube0的本地坐标系相同。所以上述的所有结果都显示了与世界坐标系挂钩,下面我们将使Cube0发生一点旋转,以使得世界坐标系和Cube0的本地坐标系不再重合。同时,可以大致推断出旋转轴的顺序是Z-X-Y
。
三、使用实例3
在前面两个部分的实例当中,我们已经可以大致推断出localRotation的使用规律,即
- 旋转的参考坐标系是父节点的本地坐标系
- 旋转轴的顺序是Z-X-Y
后面的部分将着重进行验证
实例3-1
【结果分析】该实例绕x,y,z
分别做旋转,做分解之后与先绕z
,再绕x
,最后绕y
的结果是一致的。这与之前的结论是对应的。
第二部分:探究
localRotation
的使用注意事项
四、使用注意事项
localRotation
是transform
组件的一个属性。表现了该实例在父节点坐标系下的旋转情况。根据前面内容可以知道是按照Z-X-Y
的顺规绕父节点的坐标系进行的旋转。除此之外,我们还有其他的一些注意事项,下面将做简单介绍。
(一) 赋值边界
我们知道旋转角度存在周期性,旋转x
度和旋转x+360*k
的效果是一样的。那么在利用Quaternion.Eular(x,y,z)
将欧拉角转化为四元数给localRotation
赋值的时候是否有限制呢?
【结果分析】很多资料提到Rotate()
方法在使用的时候不要超过360°,我们发现在上面的测试中,角度值超过360度并不影响,只需要除以360取余数即可。
全文总述,明确结论
五、结论
transform.localRotation = Quaternion.Eular(x,y,z)
控制旋转的时候,按照Z-X-Y
的旋转顺规,且绕轴旋转的坐标轴是父节点本地坐标系的坐标轴- 利用上述语句进行控制的时候,对赋值的角度没有必须在(-360°,360°)的约束。