1.Transfrom中的Rotation中的x,y,z三个值就是对应着三个方向上的欧拉角
2.注意物体沿Y轴方向旋转时,是沿世界坐标系的Y轴旋转,而不是沿自身的Y轴旋转
3.一个物体三个方向上的欧拉角是用一个Vector3三维向量对象来表示的 --- (x,y,z)分别对应三个方向上的欧拉角1.接下来开始细数欧拉角的缺点:
1.三维向量Vector3类有三个值,可以分别表示x,y,z三个轴所对应的欧拉角
1.Vector3类中的x,y,z三个变量都是只读变量,不能够进行写入修改操作,如果想改变一个Vector3对象的x,y,z的话只能够通过向量的加减乘除(除只能与标量,乘则分为点乘和叉乘)
由于万向节死锁是使用欧拉角表示旋转时一个无法解决的问题,于是数学家们引入了四元数来替代欧拉角表示旋转
1.quaternion(四元数) --- 由四元数控制的旋转首先需要给定空间中的任意一个轴,然后还需要给定绕该轴旋转多少弧度,获得这两个数据之后才能够实现游戏物体绕轴旋转一定度数。
2.调用this.transform.rotation后就会返回一个四元数类的对象,该对象表示的就是当前游戏物体的旋转状态。
1.通过创建四元数来修改游戏物体的旋转状态的流程:
a.首先创建一个四元数对象,并用引用指向它
b.确定游戏物体要绕哪个轴旋转,旋转的弧度为多少 --- 轴的本质其实就是向量(起点为世界坐标系原点,所以创建轴其实就相当于创建一个Vector3类对象,这个对象所对应的向量就是我们旋转要绕的轴)
而旋转所需的弧度则可以通过先确定要转的角度,然后角度转弧度(Mathf.Deg2Rad)
c.设置表示新的旋转状态的四元数 --- 根据给定的公式和已经确定好的轴与弧度,将四元数所需的x,y,z,w四个数初始化好
d.将新的四元数赋值给this.transfrom.rotation,更新游戏物体的四元数,使其旋转状态发生变化
1.上面的这些步骤Unity都已经帮我们封装好了,最终封装的结果就是上面这样
调用Quaternion类中的静态方法Euler() --- 该方法需要传三个参数,分别是绕x轴,y轴以及z轴旋转的角度 --- 传好参数之后该方法就会将传过来的欧拉角转换为四元数并返回 --- 而使用四元数表示旋转就不会出现万向节死锁。
上面介绍的是四元数的运算规则:
1.两个四元数相乘能够组合旋转效果,比如第一个四元数能够旋转绕z轴旋转10°,第二个能够绕z轴旋转40°,相乘组合起来就能够绕z轴旋转50°1.需要注意的是:四元数的绕y轴旋转是绕物体本地坐标系的y轴旋转,而不是和欧拉角一样绕世界坐标系的y轴旋转
1.在实际开发中,到底是使用欧拉角还是使用四元数则是取决于具体的情况 --- 如果需求实现时不会出现万向节死锁就用欧拉角,如果会出现死锁的话就使用四元数
2.欧拉角和四元数可以互相转换 --- Unity提供了对应的转换方法 --- 在开发中视情况而定,是用欧拉角还是用四元数,或者是欧拉角转四元数再转欧拉角等等方法。
1.四元数的运算法则分为两大类 --- 分别是四元数与四元数相乘(前面有讲,主要是旋转叠加)以及四元数与向量相乘,接下来讲解的就是四元数与向量相乘
而四元数与向量相乘又分为两大类 --- 分别是与向量左乘和右乘
(PS:规定顺时针旋转角度为正,逆时针旋转角度为负)
在Untiy中向量的起点都是世界坐标系的原点,而向量在进行加减乘除的操作之后得到的向量依然是起点为世界坐标系原点的向量