U2L5-2——四元数的概念

四元数是简单的超复数,由实数加上三个虚数单位组成,主要用于在三维空间中表示旋转
四元数原理包含大量数学相关知识,较为复杂
比如:复数、四维空间等等
因此此处我们只对其基本构成和基本公式进行讲解

必备知识点:四元数相乘代表旋转四元数

本章代码关键字

1
2
3
4
new Quaternion(,,,)    //按照四元数Q = [cos(β/2), sin(β/2)x, sin(β/2)y, sin(β/2)z]格式填入,构造绕n轴(三维向量)旋转β度的四元数
Quaternion.AngleAxis(,) //以轴角对初始化四元数的方法,更简单更好
Quaternion.Euler(,,) //欧拉角转四元数
quaternion.eulerAngles //四元数转欧拉角

四元数的构成

一个四元数包含一个标量和一个3D向量
[w,v][w,v], ww为标量,vv为3D向量:[w,(x,y,z)][w, (x,y,z)]
对于给定的任意一个四元数: 表示3D空间中的一个旋转量
注意:我们一般不会直接通过四元数的 w,x,y,z进行修改(你很难通过w,x,y,z反推这个四元数是什么)

简单来说,四元数的构成就是是:
假设绕 nn 轴(三维向量)旋转 ββ 度,旋转方向遵循左手螺旋
四元数Q=[cos(β/2),sin(β/2)n]Q = [cos(β/2), sin(β/2)n]
四元数Q=[cos(β/2),sin(β/2)x,sin(β/2)y,sin(β/2)z]Q = [cos(β/2), sin(β/2)x, sin(β/2)y, sin(β/2)z]

轴-角对

在3D空间中,任意旋转都可以表示为:
绕着某个轴旋转一个旋转角得到
注意:该轴并不是空间中的x,y,z轴 而是任意一个轴

Unity里的四元数

Quaternion​是Unity中表示四元数的结构体,有两种初始化方法:

按照定义初始化

四元数Q=[cos(β/2),sin(β/2)x,sin(β/2)y,sin(β/2)z]Q = [cos(β/2), sin(β/2)x, sin(β/2)y, sin(β/2)z]

1
2
3
4
5
6
Quaternino q = new Quaternion(sin(β/2)x, sin(β/2)y, sin(β/2)z, cos(β/2))
//绕x轴旋转60度
Quaternion q = new Quaternion(Mathf.Sin(30 * Mathf.Deg2Rad), 0, 0, Mathf.Cos(30 * Mathf.Deg2Rad));
//创建一个立方体
GameObject obj = GameObject.CreatePrimitive(PrimitiveType.Cube);
obj.transform.rotation = q;

以上的方法并不常用!(计算太复杂)最好使用下面的方法!

轴角对构造初始化

四元数Q = Quaternion.AngleAxis​(旋转角度, 绕的是哪个轴)

1
Quaternion q2 = Quaternion.AngleAxis(60, Vector3.right);    //第一个参数旋转度数,第二个参数旋转的轴

四元数和欧拉角相互转换

欧拉角转四元数

1
Quaternion q3 = Quaternion.Euler(60, 0, 0);

四元数转欧拉角

1
2
Quaternion q3 = Quaternion.Euler(60, 0, 0);
print(q3.eulerAngles);

四元数相乘代表旋转四元数

四元数相乘就是按照轴角对进行旋转,旋转方向遵循左手螺旋

1
2
3
4
5
void Update()
{
//四元数相乘代表旋转四元数
this.transform.rotation *= Quaternion.AngleAxis(1, Vector3.up); //绕着Y轴,每帧旋转1度
}