目录

三维数学 - 四元数

# 三维数学 - 四元数

# 什么是四元数

  • Quaternion 在3D图形学中代表旋转,由一个三维向量(X,Y,Z)和一个标量(W)组成
    • 旋转轴为V,旋转弧度为θ,如果用四元数表示,分量为:
      • $x = sin(θ/2)*V.x$
      • $y = sin(θ/2)*V.y$
      • $z = sin(θ/2)*V.z$
      • $w = cos(θ/2)$
  • X、Y、Z、W范围是 -1 ~ 1
  • API: Quaternion qt = this.transform.rotation

# 四元数相乘

  • 两个四元数相乘可以组合旋转效果
  • 例如:
Quaternion rotation1 = Quaternion.Euler(0,30,0) * Quaternion.Euler(0,20,0);

Quaternion rotation2 = Quaternion.Euler(0,50,0);

//以上两式相等!
1
2
3
4
5

# 缺点

  1. 难于使用,不建议单独修改
  2. 存在不合法的四元数

# 补充

this.transform.Rotate(x,y,z)其实也是四元数

实际开发中,最常用的是欧拉角,一旦遇到死锁则换为四元数相乘,解决死锁问题

//绘制物体前方10米30度的线,物体旋转时也会一并旋转
private void Update()
{
    Debug.DrawLine(transform.position, vect);
    if (Input.GetMouseButtonDown(0))
    {
        vect = transform.position +Quaternion.Euler(0,30,0)*this.transform.rotation* new Vector3(0,0,10);
    }
}

//transform.position是物体自身所在的世界坐标
//Quaternion.Euler*Vector3,前者代表旋转角度,后者代表世界坐标

//this.transform.rotation * new Vector3(0,0,10)
//这个语句的意思是0 0 10向量跟着当前物体旋转而一并旋转

//Quaternion.Euler(0,30,0)*this.transform.rotation* new Vector3(0,0,10);
//这个语句意思是向量旋转30°

//transform.position +Quaternion.Euler(0,30,0)*this.transform.rotation* new Vector3(0,0,10);
//向量移动到当前物体的位置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

# 欧拉角 -> 四元数

API: this.transform.rotation = Quaternion.Euler(0,10,0)

# 四元数 -> 欧拉角

Quaternion qt = this.transform.rotation
Vector3 euler = qt.eulerAngles
1
2

# 轴角旋转

Quaternion.AngleAxis("角度","沿哪个轴");
1

# 注视旋转

if(GUILayout.Button("Look")){
	Vector3 dir = obj2.position - this.transform.position;
	this.transform.rotation = Quaternion.LookRotation(dir);

	//上述代码与this.transform.LookAt(obj2)效果一样,都是一瞬间望过去
}
1
2
3
4
5
6

# 缓慢注释旋转

if(GUILayout.RepeatButton("缓慢旋转")){
	Quaternion qt = Quaternion.LookRotation(obj2.position-this.transform.position);
	this.transform.rotation = Quaternion.Lerp(this.transform.rotation,qt,0.1f);
}
1
2
3
4
最近更新
01
基本知识
07-18
02
卷积神经网络识别图像
07-18
03
损失函数
07-18
更多文章>