欧拉角和四元数理解

欧拉角和四元数理解

方位、方向、角位移:

  • 方位:描述的是物体的朝向。要确定一个方位(orientation),却至少需要需要三个参数。
  • 方向:“方向”和“方位”并不完全一样。向量有“方向”但没有“方位”,因为让向量自转,但向量却不会有任何变化。只要用两个数字(例如:极坐标),就能用参数表示一个方向(direction)。
  • 角位移:我们描述物体位置时并不是绝对坐标,而是描述相对于给定参考点的位移。同样,描述物体方位时,也不能使用绝对量。
  • 方位是通过与相对已知方位(通常称为”单位”方位或”源”方位)的旋转来描述的。旋转的量称作角位移。在数学上描述方位就等价于描述角位移。

欧拉角

什么是欧拉角?

用一句话说,欧拉角就是物体绕坐标系三个坐标轴(x,y,z轴)的旋转角度。

欧拉角将方位(角位移)分解为绕三个互相垂直轴的旋转。任意三个轴和任意顺序都可以,但最有意义的是使用笛卡尔坐标系并按一定顺序所组成的旋转序列。

最常用的约定是所谓的”heading-pitch-bank”约定。它的基本思想是让物体开始于”标准”方位–就是物体坐标轴和惯性坐标轴对齐。在标准方位上,让物体作heading、pitch、bank旋转,最后物体到达我们想要描述的方位。

相关概念的解释

笛卡尔坐标系这个就不做过多解释了,直接上百度百科。

heading-pitch-bank,分别物体表示绕Y轴X轴和Z轴的旋转。

惯性坐标轴,惯性参照系(inertial frame of reference) 牛顿运动定律在其中有效的参考系,又称惯性坐标系,简称惯性系。这个定义我并不能看懂。关于更通俗的一种说法是这样的。

为了简化世界坐标系到物体坐标系的转换,人们引入了一种新的坐标系,称作惯性坐标系.意思是在世界坐标系到物体坐标系的”半途”.

惯性坐标系的原点与物体坐标系的原点重合,但是惯性坐标系的轴平行于世界坐标系的轴.

为什么引入惯性坐标系?因为从物体坐标系转换到惯性坐标系只需要旋转,从惯性坐标系到世界坐标系只需要平移.分开考虑这两件事比糅合在一起容易的多。

欧拉角分类

欧拉角可分为两种情况:

1,静态:即绕世界坐标系三个轴的旋转,由于物体旋转过程中坐标轴保持静止,所以称为静态。

2,动态:即绕物体坐标系三个轴的旋转,由于物体旋转过程中坐标轴随着物体做相同的转动,所以称为动态。

对于分别绕三个坐标轴旋转的情况,下述定理成立:

物体的任何一种旋转都可分解为分别绕三个轴的旋转,但分解方式不唯一。如:

假设绕y轴旋转为heading,绕x轴旋转为pitch,绕z轴旋转为bank,则先heading45°再pitch90°等价于先pitch90°再bank45°。

万向锁问题

对于动态欧拉角,即绕物体坐标系旋转。(静态不存在万向锁的问题)无论heading和bank为多少度,
只要pitch为±90°(即绕第二个轴的旋转),就会出现万向锁现象。

为了对这一现象有一个感性的认识,请拿起自己的手机(没有?不会吧)和一支笔(用作旋转轴),
亲手做如下的几个旋转。
首先确定手机的物体坐标系朝向,为了方便记忆,我们假设z轴与手机屏幕垂直(手机平放于桌面)指向上方,
手机较短的一条边为x轴,较长的一条边为y轴(方向由手机尾部指向头部),物体坐标系的原点是手机左下角的顶点。(注意旋转顺序为zyx)
绕z轴旋转任意角度(注意x和y轴也跟着一起旋转),再绕y轴旋转90°,再绕x轴旋转任意角度。通过多次尝试,
你会发现一个共同点:z轴永远是水平的,通俗的说,手机永远也不会立起来!本来我们以为手机会指向任何方向,但实际上手机好像是被锁在桌面上,只能指向水平的某个方向,这个现象就称为万向锁。
而如果绕y轴旋转不等于90°(1°也好89°也好),只要选择适当的绕x和z的角度,就可以让手机指向三维空间中的任何一个方向,手机是自由的,也就不会遇到万向锁现象。

万向锁的避免问题:限制旋转的角度范围
heading-pitch-bank
heading 绕Y轴 限制范围在±180°
pitch 绕X轴 限制范围在±90°
bank 绕Z轴

四元数

什么是四元数?

在计算机图形学中,四元数用于物体的旋转,是一种较为复杂,但是效率较高的旋转方式。在三种坐标变换:旋转,平移,缩放当中,旋转应该算是比较复杂的存在。平常我们接触的比较多的是矩阵变换和欧拉变换。
对于一个物体的旋转,其实我们只需要知道四个值:一个旋转的向量 + 一个旋转的角度。而四元数也正是这样的设计:

其中x,y,z 代表的是向量的三维坐标,w代表的是角度;同时我们也可以写成以下的形式方便我们计算和分析:
这里写图片描述
其实,四元数本质上是一个超复数,q = xi + yj + zk + w , i^2 = j^ 2 = k^2 = -1;
这里写图片描述
现在我们对四元数的概念应该有了一定的了解了,那么四元数是怎样体现在旋转上面呢?

四元数举例

现在我们先来看一个简单的例子:一个向量(1,1,0)绕Z轴(0,0,1)旋转90度,得到的旋转后的向量是多少?相信很多同学一看就知道答案:(-1,1,0)。
那我们用四元数来做应该怎么做呢?(注:绕某轴旋转是指面对某轴然后顺时针旋转)

这里简单的说一下利用四元数来做旋转的方式:
现在我们有一个向量:v1,要让它绕 v2 旋转 Θ 度,我们先把这个向量写成一个四元数:p = (v1, 0); 那么旋转的四元数则是:q = ( v2 * sin(θ/2) , cos(θ/2) ) ;旋转后的四元数为(得到的四元数实部为0,虚部为新的坐标):
这里写图片描述

四元数相关计算公式

相乘:
这里写图片描述
四元数的共轭:
这里写图片描述
取模:
这里写图片描述
取逆:
这里写图片描述
在使用四元数旋转之前要注意:
1、用于旋转的四元数必须是单位四元数(即模为1)
2、实际参与旋转的四元数有两个:p 和 p的逆

尝试训练:把点P(1, 0, 1)绕旋转轴u = (0, 1, 0)旋转90°,求旋转后的顶点坐标。首先将P扩充到四元数,即p = (P, 0)。而q = (u*sin45°, cos45°)。求p′=qpq−1的值。建议大家一定要在纸上计算一边,这样才能加深印象。最后的结果p` = ((1, 0, -1), 0),即旋转后的顶点位置是(1, 0, -1)。

四元数和欧拉角的特点

欧拉角

  • 优点:三个角度组成,直观,容易理解。
  • 优点:可以进行从一个方向到另一个方向旋转大于180度的角度。
  • 弱点:死锁问题。
    关于死锁的参考文章图文并茂讲解

四元数

内部由四个数字(在Unity中称为x,y,z和w)组成,然而这些数字不表示角度或轴,并且通常不需要直接访问它们。除非你特别有兴趣深入了解四元数学,你只需要知道四元数表示三维空间中的旋转,你通常不需要知道或修改x,y和z属性。

  • 优点:四元旋转不存在万向节锁问题。
  • 优点:存储空间小,计算效率高。
  • 弱点:单个四元数不能表示在任何方向上超过180度的旋转。
  • 弱点:四元数的数字表示不直观。

Unity中的四元数

关于Unity中的四元数API以及更多的四元数理解,查看下边的链接
https://www.jianshu.com/p/9c3f11eeda1f

你可能感兴趣的:(Shader,面试)