Unity3D中的欧拉角使用(二) ——localRotation

本文主要测试transform.localRotation的使用,该属性一般使用四元数赋值,通过Quaternion可以将欧拉角转化为四元数。`xxx.transform.localRotation = Quaternion.Eular(float x, float y, float z);

在三个立方体的场景中,有根节点立方体、父节点立方体和子节点立方体共三个。下面的测试中分别控制三个立方体,分别控制立方体的不同坐标维度的旋转角度。

第一部分:通过localRotation控制父节点立方体的转动

一.使用实例1

该实例只是简单表现localRotation的使用方法,使得Cube1绕Z轴旋转45°。
Unity3D中的欧拉角使用(二) ——localRotation_第1张图片
Unity3D中的欧拉角使用(二) ——localRotation_第2张图片
【结论补充与分析】上述两个部分使用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轴旋转
Unity3D中的欧拉角使用(二) ——localRotation_第3张图片
Unity3D中的欧拉角使用(二) ——localRotation_第4张图片
Unity3D中的欧拉角使用(二) ——localRotation_第5张图片
【结论分析】从上图联合控制的结果中分析可得,Cube1可以从以下方式获得:①如图0614456,绕世界坐标系正z轴旋转45°,绕世界坐标系正y轴旋转45°(顺序反之则不可);②如图0614231,绕世界坐标系正y轴(本地坐标系y轴)旋转45°,再绕旋转所得本地坐标系z轴旋转45°;注意,根据其他资料显示第1种是正确的。后面将做具体讲解。

(二)实例2-2

实例2-2使得Cube1绕x轴和y轴旋转
Unity3D中的欧拉角使用(二) ——localRotation_第6张图片

Unity3D中的欧拉角使用(二) ——localRotation_第7张图片
Unity3D中的欧拉角使用(二) ——localRotation_第8张图片
【结论分析】从上图联合控制的结果中分析可得,Cube1可以从以下方式获得:①如图69523所示,绕世界坐标系正x轴旋转-45°,绕世界坐标系正y轴旋转45°(顺序反之则不正确);③如图0614528,绕本地坐标系Y轴旋转45°,再绕旋转之后所得的本地坐标系X轴旋转-45°。

(三)实例2-3

实例2-2使得Cube1绕x轴和z轴旋转
Unity3D中的欧拉角使用(二) ——localRotation_第9张图片
Unity3D中的欧拉角使用(二) ——localRotation_第10张图片
【结论分析】从上图联合控制的结果来看,Cube1可以从以下方式得到:①如图0614756,绕世界坐标系Z轴旋转45°,然后再绕世界坐标系X轴旋转45°。由于时间关系,此处不再验证与本地坐标系的关系。直接甩结论。

初步结论transform.localRotation控制旋转角度与本地坐标系无直接联系,其实与世界坐标系也无直接联系。上面三组实验,初步可以看出transform.localRotation可以分解成绕世界坐标系的旋转,其实此处的世界坐标系与Cube1的父节点Cube0的本地坐标系相同。所以上述的所有结果都显示了与世界坐标系挂钩,下面我们将使Cube0发生一点旋转,以使得世界坐标系和Cube0的本地坐标系不再重合。同时,可以大致推断出旋转轴的顺序是Z-X-Y

三、使用实例3

在前面两个部分的实例当中,我们已经可以大致推断出localRotation的使用规律,即
- 旋转的参考坐标系是父节点的本地坐标系
- 旋转轴的顺序是Z-X-Y

后面的部分将着重进行验证

实例3-1

Unity3D中的欧拉角使用(二) ——localRotation_第11张图片
【结果分析】该实例绕x,y,z分别做旋转,做分解之后与先绕z,再绕x,最后绕y的结果是一致的。这与之前的结论是对应的。

第二部分:探究localRotation的使用注意事项

四、使用注意事项

localRotationtransform组件的一个属性。表现了该实例在父节点坐标系下的旋转情况。根据前面内容可以知道是按照Z-X-Y的顺规绕父节点的坐标系进行的旋转。除此之外,我们还有其他的一些注意事项,下面将做简单介绍。

(一) 赋值边界

我们知道旋转角度存在周期性,旋转x度和旋转x+360*k的效果是一样的。那么在利用Quaternion.Eular(x,y,z)将欧拉角转化为四元数给localRotation赋值的时候是否有限制呢?
Unity3D中的欧拉角使用(二) ——localRotation_第12张图片
【结果分析】很多资料提到Rotate()方法在使用的时候不要超过360°,我们发现在上面的测试中,角度值超过360度并不影响,只需要除以360取余数即可。

全文总述,明确结论

五、结论

  1. transform.localRotation = Quaternion.Eular(x,y,z)控制旋转的时候,按照Z-X-Y的旋转顺规,且绕轴旋转的坐标轴是父节点本地坐标系的坐标轴
  2. 利用上述语句进行控制的时候,对赋值的角度没有必须在(-360°,360°)的约束。

你可能感兴趣的:(Unity,3D)