Unity 四元数与物体旋转

为什么要使用四元数

欧拉角是什么

由三个角度(x,y,z)组成
在特定坐标系下用于描述物体的旋转量
空间中的任意旋转都可以分解成绕三个互相垂直轴的三个旋转角组成的序列

欧拉角旋转约定——heading-pitch-bank
这是一种最常用的旋转序列约定——Y-X-Z约定
heading:物体绕自身的对象坐标系的Y轴旋转的角度
pitch:物体绕自身的对象坐标系的X轴旋转的角度
bank:物体绕自身的对象坐标系的Z轴,旋转的角度
Unity Transform面板中的物体角度就是用欧拉角表示的
欧拉角优缺点
优点:①直观、易理解 ②存储空间小(三个数表示)③可以进行从一个方向到另一个方向旋转大于180度的角度
缺点:①同一旋转的表示不唯一 ②万向节死锁

万向节死锁

当某个特定轴达到某个特殊值时,绕一个轴旋转可能会覆盖住另一个轴的旋转 ,从而失去一维自由度。Unity中X轴达到90度时会产生万向节死锁。

因为欧拉角存在一些缺点 ①同一旋转的表示不唯一 ②万向节死锁。 而四元数旋转不存在万向节死锁问题。因此在计算机中我们往往使用四元数来表示三维空间中的旋转信息。

四元数是什么

四元数的构成

(1)四元数概念
四元数是简单的超复数,由实数加上三个虚数单位组成,主要用于在三维空间中表示旋转。
四元数原理包含大量数学相关知识,较为复杂 比如:复数、四维空间等等。因此此处我们只对其基本构成和基本公式进行讲解,如想深入了解数学原理请从数学层面去查找资料了解它。

(2)四元数构成
一个四元数包含一个标量和一个3D向量 。
[w,v], w为标量,v为3D向量。可表示为[w, (x,y,z)]。
对于给定的任意一个四元数都可以表示3D空间中的一个旋转量。

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

对于给定旋转,假设为绕着n轴,旋转β度,n轴为(x,y,z) 那么可以构成四元数为
四元数Q = [cos(β/2), sin(β/2)n]
四元数Q = [cos(β/2), sin(β/2)x, sin(β/2)y, sin(β/2)z]
四元数Q则表示绕着轴n,旋转β度的旋转量

Unity中的四元数

(1)Quaternion
Quaternion是Unity中表示四元数的结构体
Unity中四元数初始化方法
在这里插入图片描述

//用计算原理 初始化一个围绕着轴(1,0,0)旋转60度的旋转量
Quaternion q=new Quaternion(Mathf.Sin(30*Mathf.Deg2Rad),0,0,Mathf.Cos*Mathf.Deg2Rad));
//用轴角对初始化
Quaternion q1=Quaternion.AngleAxis(60,Vector3.right);
//创建一个立方体
GameObject obj=GameObject.CreatePrimitive(PrimitiveType.Cube);
obj.transform.rotation=q1;

(2)欧拉角和四元数的转换
欧拉角转四元:Quaternion.Euler(x,y,z)
四元数转欧拉角
Quaternion q;
q.eulerAngles
3.2.3 四元数弥补的欧拉角的缺点
1. 同一旋转的表示不唯一。四元数旋转后,转换后的欧拉角始终是 -180~180度
2. 万向节死锁。通过四元数旋转对象可以避免万向节死锁

四元数的计算

(1)四元数相乘
q3 = q1 * q2
两个四元数相乘得到一个新的四元数,它代表两个旋转量的叠加,相当于旋转。
注意:旋转相对的坐标系 是物体自身坐标

//用轴角对的形式初始化要旋转的角度
Quaternion q=Quaternion.AngleAxis(20,Vector3.up);
this.transform.rotation*=q;//让物体绕着y轴旋转20度

(2)四元数乘向量
v2 = q1 * v1
四元数乘向量返回一个新向量。
四元数乘以向量,相当于把向量旋转相应的四元数
注意:四元数写在前面,向量写在后面,顺序是不能改变的

Vector3 v=Vector3.forward;
print(v);
v=Quaternion.AngleAxis(45, Vector3.up) * v;//让v绕着y轴旋转45度
print(v);

总结:
1.四元数构成——[cos(β/2), sin(β/2)x, sin(β/2)y, sin(β/2)z]
2.Unity中的四元数——Quaternion
3.四元数弥补了欧拉角的缺点—— 同一旋转的表示不唯一 、万向节死锁
4.四元数相乘——角度叠加
5.四元数乘向量——旋转向量

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值