《Real-Time Rendering 4th Edition》读书笔记--简单粗糙翻译 第四章 变换 Transforms

写在前面的话:因为英语不好,所以看得慢,所以还不如索性按自己的理解简单粗糙翻译一遍,就当是自己的读书笔记了。不对之处甚多,以后理解深刻了,英语好了再回来修改。相信花在本书上的时间和精力是值得的。

———————————————————————————————

“What if angry vectors veer Round your sleeping head, and form. There’s never need to fear ,Violence of the poor world’s abstract storm.”—Robert Penn Warren

“若疯狂的矢量的运算,纠缠着你昏昏欲睡的大脑,掀起抽象世界的风暴,不要畏惧!干就完了!"   —王大伟

 

变换(Transform)是一种操作,针对的是点,向量或颜色值,以某种方式进行转换。对于计算机图形操作者而言,掌握变换极其重要。利用好这种操作,你可以对物体进行光照,对摄像机进行定位,重塑或者触发动画。你还可以把所有计算转换到同一坐标系下,可以用不同的方式把物体投影到一个平面上。

        线性变换满足向量加法和标量乘法:

        举个例子,f(x)= 5x,是将一个向量的每个元素都乘以5。为了证明这个是线性操作,4.1和4.2的两个条件都需要满足。4.2被称为是缩放变换(Scaling transform),因为它可以改变一个物体的大小(尺寸)。旋转变换(Rotation transform)也是一个线性变换,旋转变换会将一个向量绕着原点进行旋转。缩放变换和旋转变换,以及所有针对三元素向量的线性变换,都可以用一个3x3的矩阵表示。

        然而,3x3通常不够大。例如,f(x) = x + (7,3,2)不是一个线性变换,其中x是一个三元素向量,因为按照公式4.1来算,等号左边比等号右边多加了一个(7,3,2)。将一个固定的向量和另外一个向量相加的操作,称为平移。这是一个很重要的操作。通常我们会组合各种变换,例如,先缩小一个物体的一半,然后移动它到另外一个位置。如果使用3x3的矩阵形式来表达的话,不利于我们组合各种变换。

        利于一种仿射变换(Affine transform),通常用4x4的矩阵来存储,可以将线性变换和平移组装到一块。仿射变换通常是先进行线性变换,然后再进行平移变换。用齐次坐标来表示四元素向量,点和方向向量可以用同一种表达式。方向向量可以用表示,点可以用表示。所有的平移矩阵,旋转矩阵,缩放矩阵,反射矩阵和剪切矩阵都是仿射矩阵。

        本章从最基础的基本仿射变换开始。表4.1总结了大部分这些变换、符号、函数和属性。其中,正交矩阵的转置矩阵就是其逆矩阵。

表4.1 本章中讨论的大部分变换的总结

       变换可以说是操作几何图形的基本工具。大多数图形API是允许用户设置任意矩阵的,以及一些含有很多矩阵操作的库。然而,还是很值得去理解这些库和API后面的矩阵操作。知道一个API功能的使用只是个开始,了解后面矩阵操作才会使得你走的更远。例如,知道正交矩阵的逆矩阵就是它的转置矩阵,会让你的代码更简单更快速。

4.1 基本变换

        本节主要介绍一些最为基本的变换,例如平移,旋转,缩放, 切变(Shearing)刚体变换( rigid-body transform)法线变换(normal transform),求逆计算等。我们从最简单的平移变换开始。
 

4.1.1 平移

        平移矩阵T作用于将一个物体从一个位置移动到另外一个位置。这个矩阵根据向量 平移一个物体。 T表示如公式4.3.
 下图4.1是一个平移矩阵的实例。可以看到,将点 相乘,会生成一个新点 ,这就是平移。注意向量 和T相乘是没有用的,因为方向向量是不会被平移的。但是,点和方向向量都会受到仿射变换其他部分的影响。平移矩阵的逆矩阵
 
图4.1 左图中的方块通过平移矩阵T(5,2,0)变换后,x轴方向平移了5个单位,y轴方向平移了2个单位。
 
        需要注意的一点,计算机图形行业经常会看到矩阵的平移向量保存在最下面一行。比如DirectX就这么使用。因为这些向量和矩阵都是以行优先存储的,在本书中,我们以列优先存储。这些都是单纯表现形式不同而已, 矩阵在内存中,16个数字中的最后4个都是3个平移数值再加上一个1。
 

4.1.2 旋转

        旋转变换是指用一个指定的角度绕着一个穿过原点的轴来旋转一个向量(位置或方向)。和平移变换一样,是属于刚体变换,它保存了点间距离,不会导致左右两边交换。这两种变换在计算机图形领域的定位物体和定向物体上非常有用。 方向矩阵( orientation matrix )是作用于摄像机视口或作用于物体的旋转矩阵,用来定义它们在空间的方向,例如,朝上或朝前。
 
        在2D中我们很容易计算出旋转矩阵,假设我们有一个向量,V = (Vx,Vy),我们可以写V = (Vx,Vy) = (rcosθ,rsinθ)。如果逆时针旋转这个向量 φ 度,可以得到u = (r cos(θ + φ), r sin(θ + φ))。如下:

        在3D领域中,通常用Rx(φ), Ry(φ), and Rz(φ)来表示旋转矩阵,分别表示沿着x,y,z轴进行旋转。如下公式4.5-4.7:

如果将上述4x4矩阵的最下行和最右lie删掉,变成一个3x3的矩阵, 可见这个3x3矩阵的对角线之和和旋转轴无关,是一个常数,

旋转矩阵的效果见于图4.4。旋转矩阵有两个特征,一是它绕着i轴(x,y,z)旋转,二是i轴上所有点保持不变。注意,旋转矩阵也可以用来表示绕任意轴的旋转矩阵,可以利用上面三个旋转矩阵组合得到绕任意轴的旋转矩阵,这些将在4.2.1和4.2.4中进一步讲到。

        所有的旋转矩阵的行列式都为1,并且是正交矩阵。这就使得任意数量的旋转变换都可以级联在一起。可以通过来表示旋转矩阵的逆矩阵,绕着同一个轴进行反方向旋转。

        例子:绕点旋转。假设围绕z轴旋转,旋转的中心点为P,如图4.2所示。因为围绕P旋转,所以P不动。变换第一步是平移物体,利用平移矩阵T(-p)将p平移到原点处,然后旋转物体,利用旋转矩阵进行旋转操作,最后利用平移矩阵T(P)将物体移回到原始位置。最终结果为

注意上式的矩阵顺序。
 
图4.2 围着P点进行旋转。
 

4.1.3 缩放

        缩放矩阵将一个物体以Sx,Sy,Sz的比例分别对x轴,y轴,z轴进行缩放。这意味着缩放矩阵可以放大或缩小物体。缩放因为Si,,越大,对应轴向的缩放比例越大。如果缩放因子为1,那么该方向不会进行缩放。4.10为缩放矩阵:

图4.4 展示了缩放矩阵的作用。如果Sx=Sy=Sz,称为统一变换(uniform),否则称为非统一变换(nonuniform)。有时候也称为各向同性(isotropic)和各向异性(anisotropic)。逆矩阵

        当使用齐次坐标系时,还有一种方式表示统一缩放矩阵,就是利用矩阵位于(3,3)(右下角)的值。这个值会影响齐次坐标系中W值,进而通过W值影响到点的每个轴向的变换,对统一缩放矩阵的方向无效。如下两种方式表示:

        和S矩阵相比,S'必须是齐次操作。这可能会比较低效,因为齐次操作中引入了除法,如果右下角的值为1,则不需要进行除法。当然,有些系统是不会去判断是否值为1,因为这样可减少额外的消耗。

        如果S中一个元素或者三个元素为负数时,则称为反射矩阵(reflection),或者称为镜像矩阵(mirror)。如果只有两个元素值为-1,则会物体被旋转π。注意,一个旋转矩阵乘以一个反射矩阵,结果仍然是一个反射矩阵。例如:

        反射矩阵通常需要进行特殊处理。例如,反射矩阵处理一个逆时针三角形后,会变成一个顺时针三角形。这个顺序的变化可能会导致错误的光照和隐面消除。为了检测出是否为一个反射矩阵,可以先算出左上3x3的行列式。如果行列式为负,则该矩阵是反射矩阵。如4.12所示,0·0 -(-1)·(-1) = -1。

        例子:沿着一个特定方向进行缩放。标准缩放矩阵只针对x,y,z轴进行了缩放,如果需要做一个 特定方向上的缩放,需要进行复合变换。假设需要沿着正交坐标系进行缩放,则第一步是先构建出F矩阵,如下

        有了F矩阵,则变换就是先把标准坐标系下的坐标转换到新坐标系下,然后进行缩放变换,最后把坐标转移回来。公式如下

4.1.4 切变

        有一种变换叫切变变换,例如,在游戏中利用切变变换可以扭曲整个游戏场景以制造一种迷幻效果,或者扭曲物体的外观。有6个基本切变矩阵,分别为

。第一个下标表示的是切变矩阵改变的坐标,第二个下标表示的是切变变换使用的坐标。如公式4.15所示,表示的是切变矩阵,很明显可以从下标中找到参数s,x表示的是第0行,z表示的是第2列,则S位于第0行和第二列的交叉处。

        将和点P相乘得到新点P'。图4.3展示了一个方块切变变换后的效果。(i 不等于j)的逆矩阵为其反方向的切变矩阵,

 

图4.3 单位方可的切变效果。y轴和z轴没有变化,x轴的值变成了原值加上s乘以z值(x = x + s * z),正方形发生了倾斜。这种变换不会改变面积,图中虚线面积是一样的。
 
        如公式4.16所示,有两个下标表示表示被第三个坐标切变。两种切变有关系: ,其中用作第三个坐标的索引。需要注意的是切变矩阵的行列式始终等于1,它不会改变体积,正如图4.3所示。
 

4.1.5 变换结合

        由于矩阵乘法中的不可交换性,矩阵的顺序很重要,在变换串联的时候也是基于顺序的。

        假设有两个矩阵,S(2,0.5,1)和Rz(π/6)。S表示将x坐标乘以2,y坐标乘以0.5,z坐标不变,R表示沿着z轴(右手坐标系中,垂直平面指向外面的轴)逆时针旋转 π/6。如图4.4所示,两种顺序进行串联得到的结果不同。

图4.4 矩阵相乘顺序不同的例子。上面表示的是,先进行旋转然后再缩放。下面表示的是,先进行缩放,然后再进行旋转。可见结果不同,有矩阵的不可交换性

        串联矩阵的作用在于提高效率,举个例子,一个游戏场景中有几百万个顶点,在场景中的全部物体都需要进行缩放,旋转,然后平移。如果将每个顶点分别和这三个变换矩阵进行变换,不如将三个变换矩阵串联成一个矩阵,然后用来和顶点做变换处理。则串联后的矩阵为。注意,这里的顺序。首先进行的是缩放变换,所以S出现在最右侧。所以有,其中P表示的是需要变换的顶点。基本上TRS是图形系统中最为常见的顺序。

        值得注意的是,因为矩阵是顺序串联在一起的,所以可以对其进行分组计算。例如在进行刚体运算的时候,可以将TR进行结合,所以有TRSp=(TR)(Sp)。可见矩阵串联满足结合定律。

4.1.6 刚体变换

        当一个人抓住一个实物,例如桌子上的一支笔,从一个地方移动到另外一个地方,例如衬衫的口袋里,只有实物的方向和位置发生了变化,实物的形状没有任何变化。这样的变换,只是结合了旋转和平移,被称为刚体变换。它的特性是保持了物体本身的长度、角度和对称性。

        用T(t)表示平移矩阵,R表示旋转矩阵,X表示刚体矩阵,那么有

        X的逆矩阵有。也就是说计算X的逆矩阵,只需要转置R左上的3x3矩阵,平移矩阵T改变符号,然后将两个新矩阵按与原相乘的相反顺序相乘。还有一种计算X的逆矩阵,首先用下面的公式4.18表达X。

其中表示旋转矩阵的第一列,表示旋转矩阵的第一行。注意表示的是一个3x1的列向量,每个元素值都为0。所以X的逆可以表达为

        例子:摄像机的方向。图形学中一个常见的操作是旋转摄像机的朝向,使之对准一个方向。这里使用函数gluLookupAt()(来自OpenGL Utility库,简称 GLU)。尽管这个函数如今不怎么使用了,但是这个需求还是很常见。假设摄像机位于c,需要摄像机对准I,并给定了世界空间向上的向量u',如图4.5所示。需要计算一个基坐标系{r,u,v}。首先计算出视觉方向,从摄像机指向目标对象的归一化向量。摄像机朝向所对应的朝右方向有。u'通常不能表示摄像机朝上向量,最终的向上向量还是通过计算,v和r叉积得到,由于v和r都已归一化,则u也是归一化的,并相互垂直。接下来构造摄像机的变换矩阵M,首先将摄像机的位置归零,然后改变基坐标系,将r对应为(1,0,0),u对应为(0,1,0),v对应为(0,0,1)。

图4.5 已经摄像机位于点c,目标位于点I,世界空间向上向量为u',求摄像机指向i的变换矩阵。
        
        注意,4.20中需要将平移矩阵T放在最右侧,因为先进行平移。
 

4.1.7 法线变换

        矩阵可用于点、线、三角形及其他几何体的变换,同样矩阵也可以用于三角形的切线的变换。但是又一点需要记住,矩阵不能用来变换表面(或顶点)的法线。图4.6展示了如果用矩阵变换法线的后果。

图4.6 左图是原始几何图形,一个三角形及其法线,中间图表示的是原始三角形沿着x轴缩放0.5倍,法线经过相同变换后的结果,右图表示的是正确的法线结果。 
 
        计算法线变换,不使用三角形等使用的变换矩阵,取而代之的是其逆转置矩阵由于法线在经过变换后长度不一定为1,需要进行归一化处理。这种方法正常是有效的,但是有时候是不需要取逆的。逆矩阵是用伴随矩阵除以原始矩阵的行列式得到的,有时候行列式为0,即不存在逆矩阵。
 
        计算一个4x4矩阵的伴随矩阵是昂贵的,且通常是不需要的,因为平移是不会影响到法线,此外,大部分模型变换都是仿射的,并没有改变齐次坐标系下的w值,不会进行投影变换。在这些情况下,法线变换的计算通常是是计算矩阵左上的3x3伴随矩阵。
 
         甚至有时候左上角的伴随矩阵也不需要计算,变换矩阵由平移矩阵、旋转矩阵和统一缩放矩阵(无拉伸或挤压的)。平移是不会影响法线的。统一缩放矩阵只影响法线的长度,剩下的只有旋转矩阵。转置矩阵是正交矩阵,其转置矩阵就是其逆矩阵,所以逆转置矩阵就是其本身。这种情况下,法线转换可直接用原始矩阵。
 
        有时候归一化操作是不需要的。只有在平移和旋转在一起操作时,法线长度经过变换后会改变。如果使用了统一缩放,则直接用统一缩放因子处理就好。例如,一个物体被放大5.2倍,那么直接只需要把变换后的法线除以5.2即可归一化,或者将变换矩阵的左上的3x3矩阵除以5.2,即生成了一个已归一化的法线矩阵。  
        注意, 法线变换并不是作用于对三角形的面法线,面法线经过三角形的三条边叉乘得到,始终垂直于表面。切向量也不同于法向量,切向量是直接通过原始矩阵计算得到的。
 

4.1.8 求逆运算

        在许多情况下,例如,在坐标系切换的时候,根据变换的有用信息,可使用下面三个方式求矩阵的逆矩阵:
 
        · 如果矩阵是单个变换矩阵或一系列简单变换矩阵的组合,那么可以简单通过颠倒这些矩阵的顺序并依次求其逆矩阵的方式得到,例如,如果 , 那么
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值