4.2 特殊矩阵转换和操作
本节将介绍或扩展若干实时图形学的基本矩阵转换和操作。首先我们介绍欧拉转换(及其提取参数),它是描述朝向的直观方式。然后涉及从一个单独的矩阵中获取一组基本转换。最后,扩展旋转为绕着任意轴进行。
4.2.1 欧拉转换
该转换是一种构建朝向自己(如相机)的矩阵、或某特定方向的实体的直观方式。它的名称来自于瑞士伟大的数学家莱昂哈德.欧拉(1707-1783)。
图 4.6 欧拉转换的描述方式。显示的是默认视图方向,目光沿着-z轴,头朝向y轴。
首先,必须建立某种默认的视图方向。最经常使用的是目光沿着-z轴,头朝向y轴,如图4.6所示。欧拉转换是三个矩阵(即图4.6中的旋转矩阵)的相乘。更正式地说,转换矩阵E可用公式4.17表示(实际上,矩阵的顺序有24种,此处我们选择的是最常用的一种):
E(h, p, r) = Rz(r)Rx(p)Ry(h) (4.17)
E是旋转的串联,因此,它显然也是正交的。因此,它的逆可以表示为:E-1 =ET = (RzRxRy)T =RyTRxTRzT(当然,直接地使用E的转置更容易)。
欧拉角h,p,r表示head,pitch和roll(有时,它们也被叫做rolls,如,head是y-roll,pitch是x-roll。另外,head有时也被叫做yaw,如在飞行模拟中)的执行顺序和绕对应轴进行旋转的弧度。该转换是直观的,因此容易以外行的语言进行讨论。比如,改变head的角度将使观察者摇头(“no”),改变pitch则点头,改变roll则让头向两边倾斜。与其说绕着xyz轴旋转,不如说改变了head,pitch和roll。注意,该转换不仅可用于相机,还可用于任何对象或实体。这些转换可以使用世界空间或相对于本地参照系中的全局坐标来执行。
使用欧拉转换时,可能会碰到万向节锁。它发生于旋转使一个自由度丢失时。举个例子,假设转换的顺序是xyz,其中,我们绕着y轴旋转π/2。当我们执行了y轴的旋转后,本地z坐标轴将和原x轴重合。此时,再执行绕着z轴的旋转就是多余的(PS:我不知道读到此处的你能不能理解,反正我是研究了N久才明白。此处,我在具体解释一下。假设绕x和z轴旋转的角度分别为10°和20°,绕y轴旋转90°不变;按xyz的顺序依次执行。首先执行绕x轴旋转10°,按照图4.6中的示意图,就是将头低下10°。接着绕y轴旋转90°,此时,你的后背将对着+x方向(而对于你自己而言,你的后背永远是+z,所以说你的本地z坐标轴和原坐标轴x重合了)。此时,你继续绕着z轴(注意,此z轴和图4.6中标出的-z轴相反,它可不是你的后背所代表的+z轴)旋转20°,结果是又将头低下了20°。最终的结果是头低下了10+20=30°,后背朝向了+x轴。这个结果,和绕x直接旋转30°,再绕y旋转90°结果相同。因此,才会说最后的一个绕着z轴的旋转是多余的)。
另一种观察自由度丢失的方式将p=π/2带入欧拉矩阵E(h,p,r):
看到没有,最终的结果是,矩阵仅依赖于(r+h),无论r和h的值是什么,只要它们的和相同,则最终的结果就相同。
在模型系统中,欧拉角通常表示为x/y/z的顺序;在这同时,绕着本地坐标轴或以其他顺序进行旋转也是可行的。比如,在动画中使用z/x/y的顺序,而z/x/z同时用于动画和物理。它们都是有效的指定三个旋转的方式。最后的那个顺序z/x/z,对某些应用来说可能更具优势(因为仅当绕着x旋转π弧度(半旋转)时才会发生万向节锁)。就是说,根据毛球定理,万向节锁是不可避免的,没有什么完美的次序能够避免它。
欧拉角对小角度的改变或观察者朝向有益,但它也有一些严格的限制。首先很难组合使用两套欧拉角。比如,它们之间的插值并不是简单地对各个角度进行插值。事实上,两个不同的欧拉角可能代表相同的方向,因此,任何插值都不应当有旋转。这些是使用替代方向表示法如四元组(本章稍后谈论)的部分原因。