乌啦呀哈呀哈乌啦!

欢迎光临,这里是喵pass的个人博客,希望有能帮到你的地方

0%

四元数

四元数的定义

四元数(Quaternion)是带有一个实部和三个虚部的一种扩展复数,有两种表达方式

  1. 标量形式

  2. 标量+向量形式

由于标量表达式中的 i,j,k 可以理解为相互正交的3个单位向量,于是四元数也可以表示为标量+向量的形式

四元数相关运算

存在qa,qb两个四元数

共轭(conjugate):

取逆(inverse):

取模(magnitude):

乘法:

四元数表示旋转

从二维平面复数的乘法中,我们可知:
表示某条射线的复数 和 表示旋转角度的复数,其乘积为该射线按旋转角度旋转后的射线所表示的复数,那么四元数可以理解为其在三维空间的拓展应用。
实际上,四元数是一种表示三维姿态的方法,其特点是紧凑、易于迭代、又不会出现奇异值。


Unity C#四元数代码实现旋转

从欧拉角转换为四元数
1
2
Vector3 eulerAngles = new Vector3(45f, 30f, 60f); // 欧拉角
Quaternion quaternion = Quaternion.Euler(eulerAngles); // 转换为四元数
从欧拉角转换为四元数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class RotateByQuaternion : MonoBehaviour
{
public float rotateSpeed = 300.0f; // 旋转速度

void Update()
{
// 如果用户按下鼠标左键,则旋转对象
if (Input.GetMouseButton(0))
{
// 获取鼠标移动的x和y量
float mouseX = Input.GetAxis("Mouse X") * rotateSpeed * Time.deltaTime;
float mouseY = Input.GetAxis("Mouse Y") * rotateSpeed * Time.deltaTime;

// 创建一个四元数,表示绕Vector3.up轴旋转mouseY度,绕Vector3.right轴旋转mouseX度
Quaternion rotation = Quaternion.AngleAxis(mouseY, Vector3.up) * Quaternion.AngleAxis(mouseX, Vector3.right);

// 应用这个旋转到游戏对象上
transform.rotation *= rotation;
}
}
}

Credits

利用四元数表示空间向量的旋转:https://blog.csdn.net/qq_42648534/article/details/124072859