3D图形:矩阵、欧拉角、四元数和方向的故事

学了近两周的3D图形,最想研究的。因为欧拉角和四元数,OpenGL ES的研究进度慢了下来。学完这一块,我就教你怎么用OpenGL ES做一个带旋转和公转的正立方体。效果如下。

在说矩阵、欧拉角和四元数与角位移的关系之前,先说一下方向、方位和角位移的区别。

现实生活中,我们很少区分“方向”和“方位”的区别(非路痴的观点)。例如,一个朋友来拜访你,但他可能会在一个公共汽车站下车。你去见他,却找不到他,急忙喊他“兄弟,你在哪个方向?”或者“兄弟,你在哪里?”如果不仔细品味这两句话,其实差别并不太大。一个痛苦的电话过后,你成功了,但你并不在乎“方向”和“取向”的区别。那么在几何上,两者有什么区别呢?

在这里,我会从书中偷一些例子。比如一个向量沿着自己的方向选择,不会改变它的任何属性,如下图所示,因为一个向量只有方向没有方位。

所以对于一个对象来说,情况就不一样了。如果一个物体面向某个方向,然后旋转,那么这个物体在空间上就会发生变化。如下图所示,当圆锥体旋转时,其空间位置会发生变化,即圆锥体的朝向会发生变化。

以上让我们大致了解了物体的方向和方位的区别,那么我们如何描述空间中的一个方位呢?这需要使用角位移。

先说一个类似的例子。我们如何描述一个物体在空间中的位置?需要把物体放在特定的坐标系中(看起来很粗糙)。举个例子,我们说在一个坐标系中,有一个点q r[0,0,1],这个点用自己的坐标系表示。如果放在其他坐标系中,当前的三个基向量可能会发生变化。这是因为参考点不同。至于基向量如何变化,我们需要3D图形中关于旋转矩阵的知识:矩阵和线性变换。这个不多解释了。比如下图中,向量p,Q,r Q,R组成的新坐标系,用原来的坐标系表示,如右图所示。

其实对于我们的开发来说,我们只需要知道方位可以用3×3矩阵来表示就可以了。该矩阵表示转换后的基向量。接下来说一下用矩阵表示角位移的优缺点。我就直接拿书上说的。难怪你要读官。

当然,我们用矩阵来表示角位移只是为了理解。接下来,我们来看看如何用欧拉角来表示方位。

很多人在大学可能会接触到矩阵,但是欧拉角可能接触的比较少,至少作为一个学物理的学生是这样的。一开始我觉得欧拉角很难理解,但是看了3D图形之后发现用欧拉角来表示方位会比矩阵更直观,更容易上手。我们来看看欧拉角的相关知识。(以下基本概念和书上的差不多,因为我觉得书上写一个就好了,所以我就写了。

首先,欧拉角的基本思想是将角位移分解为绕三个相互垂直的轴旋转三圈的序列。那么这三个互相垂直的轴是怎么定义的呢?其实任何三个轴,任何顺序都是可以的,但是最常用的是笛卡尔坐标系组成的,按照一定顺序的旋转序列。最常用的惯例是所谓的“航向-螺距-坡度”惯例。在这个系统中,方向被定义为航向角、俯仰角和倾斜角。其中,在左手坐标系中,我们定义航向角为绕Y轴旋转,俯仰角为绕X轴旋转,倾斜角为绕Z轴旋转。旋转法则遵循左手法则(详见《3D图形:矩阵与线性变换》中的旋转模块)。其基本思想是使物体从“标准”方位开始,即物体的坐标轴与惯性坐标轴对齐。让物体在航向、俯仰和倾斜旋转后达到最终的空间方位。

例如,下面显示了一个圆锥体。起初,它自己的坐标轴与惯性坐标轴重合。

然后我把航向角设为45。根据左手定则(通常使用,但不一定要保持右手或左手定则来确定每次旋转的正方向),会顺时针旋转。

那么物体的坐标系如下变化。圆锥体的坐标轴不再与惯性坐标轴一致,X轴和Z轴也相应发生了变化。当然,物体的空间方位也发生了相应的变化。

然后是俯仰和倾斜旋转,分别绕X轴和Z轴旋转,类似于航向旋转,最后得到圆锥体的最终空间方位。这里需要注意的是,旋转坐标轴是自己的坐标轴,无论是航向旋转,俯仰旋转,还是坡度旋转!不是惯性轴!

上面我们已经看到了“航向-俯仰-堤岸”约定系统是如何使空间方位发生旋转变化的。接下来,我们来看看其他关于欧拉角的约定。

接下来,我们来看看欧拉角的优缺点。揭示了欧拉角的弊端其实是万能锁的原因。

其实用欧拉角会出现一个很有意思的现象,就是万能锁。让我们来看看“头球-投球-倾斜”系统。如果俯仰角为90°,就会有事情发生。会发生什么?如果航向角和倾斜角相同,那么你会发现物体的最终方位是相同的。这怎么可能呢?这就比较尴尬了。其实类似于这种旋转,当俯仰角为90°时,物体少了一个旋转轴。也就是说,当俯仰角为90°时,那么坡度为0°。航向只有一个旋转轴起作用,是傻逼圆吗?没问题,下面我想分享一个视频。我觉得这个视频会比文字更生动。请自行研究。

看完了用矩阵和欧拉角表示方位,我们再来看看四元数。当一个新的四元数概念出现在我眼前的时候,我就在想,是不是因为有四个数,所以叫四元数。事实上,四元数实际上是由一个标量分量和一个3D矢量分量组成的,以表达方向。四元数的两种记法如下:[ω,ν],[ω,(x,y,z

复数真的很久没用了。我们从高中开始接触简单复数。现在简单说一下复数。其实我也顺便复习了一下。

第一,复数是a+bi的形式,其中I?=-1,其中A称为实部(实部),B称为虚部(虚部)。对于复数的运算,我们主要讲复数的模,可以很好的表示2D中的旋转变换。让我们先看看上面提到的2D环境中的旋转矩阵。

然后,我们来看一个例子。假设一个复数v = (x,y)旋转θ度得到V’,如下图所示。

为了完成这个旋转,我们需要引入第二个复数q = (cosθ,sinθ),现在旋转后的复数V '就可以通过复数相乘计算出来了。计算过程如下。

v = x +yi

q = cosθ+isθ

v ' = VQ =(x+yi)(cosθ+isinθ)=(xcosθ-ysinθ)+(xsinθ+ycosθ)I

旋转矩阵的效果与上述2D环境中的效果相同,但形式不同。

上面说了这么多,那么四元数和复数有什么关系呢?其实一个四元数[w,(x,y,z)]定义了复数w +xi +yj +zk,也就是说一个四元数包含一个实部和三个虚部。

其实四元数的出现是有故事的,所以我只是把书搬到这里,作为枯燥学习中的放松时刻(其实是自然而然发生的)。事实上,爱尔兰数学家Hamilton一直想把复数从2D扩展到3D。起初他认为3D中的复数应该有一个实部和两个虚部,后来他没有创造出这么有意义的一个实部和两个虚部的复数,000000000106在去听讲座的路上,他突然意识到应该有三个虚部而不是两个。他在布鲁姆桥上刻下了这种新的复合型步行者的方程,四元数就这样诞生了。方程式如下。

我?= j?= k?= -1

ij = k,ji = -k

jk = i,kj = -i

ki = j,ik = -j

矩阵和欧拉角的情况我们已经知道了。现在我们来看看四元数是如何表示角位移的。在3D环境下,任何角位移都可以理解为绕某个轴旋转。《3D图形:矩阵与线性变换》中有一个绕3D任意轴旋转的公式(还记得最开始的那个验证过程吗,花了一天?公式如下所示,其中θ代表旋转角度,n代表旋转轴。因此,轴-角度对(n,θ)定义了一个角位移:绕n指定的轴旋转θ.

四元数的解释其实就是角位移的轴角对。但是n和θ并没有直接放入四元数。它们的形式如下。

那么问题来了,为什么不直接放到四元数里呢?这是有原因的,我会在接下来的四元数相关运算中解释。现在才知道四元数的解释其实是角位移的轴角对模式。

& lt/b & gt;

写完这篇文章,终于对矩阵,欧拉角,四元数,角位移,方位有了一个大概的了解。总的来说,我觉得真的很无聊,但是我坚持下来了。希望朋友们也能坚持读下去。如果不了解或者有疑问,可以和骚董讨论。我会在下一篇《3D图像》中继续研究四元数,但只是四元数运算相关的知识。希望大家继续关注。

最后,你应该附上:& gt门户的Pdf版本