三维数学 - 四元数
# 三维数学 - 四元数
# 什么是四元数
- 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)$
- 旋转轴为V,旋转弧度为θ,如果用四元数表示,分量为:
- 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
2
3
4
5
# 缺点
- 难于使用,不建议单独修改
- 存在不合法的四元数
# 补充
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
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
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
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
2
3
4