欧拉角
由三个角度(x,y,z)组成,在特定坐标系下用于描述物体的旋转量
通俗的说,空间中任意旋转都可以分解成绕三个互相垂直轴的三个旋转角组成的序列
旋转序列
heading-pitch-bank:
先转Y轴 按照惯性坐标系
再转X轴 按照物体坐标系
再转Z轴 按照物体坐标系
Quaternion q1 = new Quaternion(0,-Mathf.Sin(45*Mathf.Deg2Rad),0,-Mathf.Cos(45*Mathf.Deg2Rad));
获取欧拉角
Inspector调节的rotation就是欧拉角
transform.eulerAngles = new Vector3(1, 1, 1); //x,y,z的旋转角度
优点
直观,容易理解
万向节死锁
四元数
在3D空间中,任意旋转都可以表示绕着某个轴旋转一个旋转角得到
对于给定旋转,假设为绕着n轴,旋转θ度,n轴为(x,y,z),那么可以构建四元数:
- W=cos(θ/2)
- X=sin(θ/2)*cos(a)
- Y=sin(θ/2)*y
- Z=sin(θ/2)*z
- x,y,z在xyz方向上的偏移量(分量)
- 如果旋转没有分量a=0° cosa=1
- 公式可以简写:W=cos(θ/2)
- X=sin(θ/2)
- Y=sin(θ/2)
- Z=sin(θ/2)
Quaternion
Unity中用来表示四元数的结构体
轴角对
公式:
- W=cos(θ/2)
- X=sin(θ/2)
- Y=sin(θ/2)
- Z=sin(θ/2)
API
Quaternion.AngleAxis
Quaternion q=Quaternion.AngleAxis(90,Vector3.up); //第一个参数是角度,第二个参数围绕哪个轴旋转,旋转方向遵守左手定则
欧拉角和四元数的转换
欧拉角转四元数
Quaternion.Euler(x,y,z)
Quaternion q=Quaternion.Euler(0,90,0);//绕着Y轴旋转90°
四元数转欧拉角
q.eulerAngles
Vector3 angle=q.eulerAngles; //欧拉角是Vector3
负四元数
四元数q[x,y,z,w]
负四元数-q[-x,-y,-z,-w]
几何意义
q与-q所代表的旋转量是相同的
单位四元数
两个
-1[0,0,0]
1[0,0,0]
几何意义
表示没有旋转量的四元数
API
Quaternion.identity
四元数叉乘
四元数*四元数=四元数
几何意义
将两个四元数的旋转量进行叠加,等到一个新的四元数
Quaternion q1= Quaternion.AngleAxis(-30,Vector3.up); Quaternion q2= Quaternion.AngleAxis(-60, Vector3.up); Quaternion q3 = q1 * q2;
四元数*向量
四元数*向量=向量
几何意义
将向量按照四元数的旋转量旋转,得到一个新的向量
注:只能是四元数*向量,不能是向量*四元数
四元数插值
Quaternion.Slerp
几何意义
四元数插值计算得到的是form与to之间的插值旋转量
LookRotation
意义
任意一个物体在朝向世界的正前方,也就是Z轴方向,通过旋转使其物体朝向目标向量
LookRotation计算的就是旋转所需的旋转量