深入探索透视投影变换_第1页
深入探索透视投影变换_第2页
深入探索透视投影变换_第3页
深入探索透视投影变换_第4页
深入探索透视投影变换_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、深化探究透视投影变换-Twinsen 编写-本人水平有限,疏忽错误在所难免,还请各位数学高手、编程高手不吝赐教-email:透视投影是3D固定流水线的重要组成局部,是将相机空间中的点从视锥体 (frustum)变换到规章观看体(Canonical View Volume)中,待裁剪完毕后进行透视 除法的行为。在算法中它是通过透视矩阵乘法和透视除法两步完成的。透视投影变换是令许多刚刚进入3D图形领域的开发人员感到迷惑乃至神奇的一 个图形技术。其中的理解困难在于步骤繁琐,对一些基础学问过分依靠,一旦对 它们中的任何地方感到生疏,立即导致理解停止不前。没错,主流的3D APIs如OpenGL、D3D

2、确实把详细的透视投影细节封装起来, 比方gluPerspective(.)就可以依据输入生成一个透视投影矩阵。而且在大多数状况下 不需要了解详细的内幕算法也可以完成任务。但是你不觉得,假如想要成为一个 职业的图形程序员或嬉戏开发者,就应当真正降伏透视投影这个家伙么?我们先 从必需的基础学问着手,一步一步深化下去(这些学问在许多地方可以单独找到, 但我从来没有在同一个地方全部找到,但是你现在找到了)。我们首先介绍两个必需把握的学问。有了它们,我们才不至于在理解透视投影变 换的过程中迷失方向(这里会使用到向量几何、矩阵的局部学问,假如你对此不 是很熟识,可以参考向量几何在嬉戏编程中的使用系列文章)

3、。齐次坐标表示透视投影变换是在齐次坐标下进行的,而齐次坐标本身就是一个令人迷惑的概 念,这里我们先把它理解清晰。依据向量几何在嬉戏编程中的使用6中关于基的概念。对于一个向量v以及 基 oabc,可以找到一组坐标(vl,v2,v3),使得v = vl a + v2 b + v3 c (1)topright = near x tan(fov / 2)top = near x tan(fov/2)left = -rightbottom = -toptop = right / aspectright = top x aspectbottom = -topleft = -right上图中左边是在xz平面

4、计算视锥体,右边是在yz平面计算视锥体。可以看到左 边的第3步top=right/aspect使用了除法(图形程序员厌烦的东西),而右边第 3步right = top x aspect使用了乘法,这或许就是为什么图形APIs采纳yz平面的 缘由吧! 到目前为止已经完成了对透视投影变换的阐述,我想假如你始终跟着我的思路下 来,应当能够对透视投影变换有一个细节层次上的熟识。当然,很有可能你已经 是一个透视投影变换专家,假如是这样的话,肯定给我写信,指出我熟识上的不 足,我会特别感谢软。Bye!而对于一个点p,那么可以找到一组坐标(pl,p2,p3),使得p - o = pl a + p2 b +

5、p3 c (2)从上面对向量和点的表达,我们可以看出为了在坐标系中表示一个点(如p), 我们把点的位置看作是对这个基的原点。所进行的一个位移,即一个向量一一p- o (有的书中把这样的向量叫做税置应量一一起始于坐标原点的特别向量),我们在表达这个向量的同时用等价的方式表达出了点P:p = o + pl a + p2 b + p3 c (3)(1)(3)是坐标系下表达一个向量和点的不同表达方式。这里可以看出,虽然都是 用代数重量的形式表达向量和点,但表达一个点比一个向量需要额外的信息。假 如我写出一个代数重量表达(L 4, 7),谁知道它是个向量还是个点!我们现在把(1) (3)写成矩阵的形式:

6、这里(a,b,c,o)是坐标基矩阵,右边的列向量分别是向量v和点p在基下的坐标。 这样,向量和点在同一个基下就有了不同的表达:3。向量的第4个代数重量是 0,而3。点的第4个代数重量是1。像这种这种用4个代数重量表示3D儿何概 念的方式是一种齐次坐标表示。“齐次坐标表示是计算机图形学的重要手段之一,它既能够用来明确区分向量和 点,同时也更易用于进行仿射(线性)几何变换。 一一F.S. Hill, JR这样,上面的(1,4, 7)假如写成(147,0),它就是个向量;假如是(147),它 就是个点。下面是如何在一般坐标(Ordinary Coordinate)和齐次坐标(HomogeneousC

7、oordinate)之间进行转换:从一般坐标转换成齐次坐标时,假如(x,y,z)是个点,那么变为(x,y,z,l);假如(x,y,z)是个向量,那么变为(x,y,z,0)从齐次坐标转换成一般坐标时,假如是(x,y,z),那么知道它是个点,变成(x,y,z);假如是(x,y,z,O),那么知道它是个向量,仍旧变成(x,y,z)以上是通过齐次坐标来区分向量和点的方式。从中可以思索得知,对于平移T、 旋转R、缩放S这3个最常见的仿射变换,平移变换只对于点才有意义,由于一 般向量没有位置概念,只有大小和方向,这可以通过下面的式子清晰地看出:X y Zr T r 1 o o 1 o o 1 o o1 o

8、 o o而旋转和缩放对于向量和点都有意义,你可以用类似上面齐次表示来检测。从中 可以看出,齐次坐标用于仿射变换特别便利。此外,对于一个一般坐标的点P=(Px,Py,Pz),有对应的一族齐次坐标(wPx, wPy, wPz,w),其中W不等于零。比方,P(l, 4, 7)的齐次坐标有(1,4,7, 1)、(2,8,14, 2)、(-0.1,-0.4, -0.7, -0.1)等等。因此,假如把一个点从一般坐标变成齐次坐 标,给x,y,z乘上同一个非零数w,然后增加第4个重量w;假如把一个齐次坐 标转换成一般坐标,把前三个坐标同时除以第4个坐标,然后去掉第4个重量。由于齐次坐标使用了 4个重量来表达

9、3D概念,使得平移变换可以使用矩阵进行, 从而如FS Hill, JR所说,仿射(线性)变换的进行更加便利。由于图形硬件已 经普遍地支持齐次坐标与矩阵乘法,因此更加促进了齐次坐标使用,使得它好像 成为图形学中的一个标准。简洁的线性插值这是在图形学中普遍使用的基本技巧,我们在许多地方都会用到,比方2D位图 的放大、缩小,Tweening变换,以及我们即将看到的透视投影变换等等。基本 思想是:给一个x属于a, b,找到y属于c, d,使得x与a的距离比上ab长度 所得到的比例,等于y与c的距离比上cd长度所得到的比例,用数学表达式描 述很简洁理解:x - a _ y - c b - a d - c

10、这样,从a到b的每一个点都与c到d上的唯一一个点对应。有一个x,就可以 求得一个y。此外,假如X不在a b内,比方xb,那么得到的y也是符合yd,比例仍旧不变,插值同样适用。透视投影变换好,有了上面两个理论学问,我们开头分析这次的主角一一透视投影变换。这里 我们选择OpenGL的透视投影变换进行分析,其他的APIs会存在一些差异,但 主体思想是相像的,可以类似地推导。经过相机矩阵的变换,顶点被变换到了相 机空间。这个时候的多边形或许会被视锥体裁剪,但在这个不规章的体中进行裁 剪并非那么简洁的事情,所以经过图形学前辈们的细心分析,裁剪被支配到规章 观看体(Canonical View Volum

11、e, CVV)中进行,CVV是一个正方体,x, y, z的范 围都是-1, 1,多边形裁剪就是用这个规章体完成的。所以,事实上是透视投影 变换由两步组成:1)用透视变换矩阵把顶点从视锥体中变换到裁剪空 间的CVV中。2) CVV裁剪完成后进行透视燎法(一会进行解释)。我们一步一步来,我们先从一个方向考察投影关系。eyex上图是右手坐标系中顶点在相机空间中的情形。设P(x,z)是经过相机变换之后的 点,视锥体由eye眼睛位置,np近裁剪平面,fp远裁剪平面组成。 N是眼睛到近裁剪平面的距离,F是眼睛到远裁剪平面的距离。投影面可以选择任何平行于近裁剪平面的平面,这里我们选择近裁剪平面作为投影平面。

12、设 PXN)是投影之后的点,那么有T= -N。通过相像三角形性质,我们有关系:同理,有:/ = 7 岁这样,我们便得到了 P投影后的点Pp,= ( -N 号-N 多-N )从上面可以看出,投影的结果Z,始终等于-N,在投影面上。实际上,Z,对于投影 后的F已经没有意义了,这个信息点已经没用了。但对于3D图形管线来说,为 了便于进行后面的片元操作,例如z缓冲消隐算法,有必要把投影之前的z保存 下来,便利后面使用。因此,我们采用这个没用的信息点存储z,处理成:p J ( -N 4-N v z )这个形式最大化地使用了3个信息点,到达了最原始的投影变换的目的,但是它 太直白了,有一点蛮干的意味,我感

13、觉我们最终的结果不应当是它,你说呢?我 们开头结合CVV进行思索,把它写得在数学上更优雅全都,更易于程序处理。 假入能够把上面写成这个形式:那么我们就可以特别便利的用矩阵以及齐次坐标理论来表达投影变换:o o b Oa I-1 一 o N o o N o o o规范化。留意在把变成哈,看到了齐次坐标的使用,这对于你来说已经不生疏了吧?这个新的形式不仅 到达了上面原始投影变换的目的,而且使用了齐次坐标理论,使得处理更加法律-Nx/z-Ny/z-(az+b)/z 1/的一步我们是使用齐次坐标变一般 坐标的规章完成的。这一步在透视投影过程中称为透为集法(PerspectiveDivision),这是

14、透视投影变换的第2步,经过这一步,就丢弃了原始的z值(得 到了 CVV中对应的z值,后面解释),顶点才算完成了投影。而在这两步之间(Ny j az+b /的就是CVV裁剪过程,所以裁剪空间使用的是齐次坐标/,主要缘由在 于透视除法会损失一些必要的信息(如原始Z,第4个-Z保存的)从而使裁剪变 得更加难以处理,这里我们不争论CVV裁剪的细节,只关注透视投影变换的两 步。就是我们投影矩阵的第一个版本。你肯定会问为什么要把z写成 az + b有两个缘由:1) P的3个代数重量统一地除以分母-z,易于使用齐 次坐标变为一般坐标来完成,使得处理更加全都、 iWj 效。2)后面的CVV是一个x,y,z的范

15、围都为-1, 1的规 章体,便于进行多边形裁剪。而我们可以适当的选az + b择系数a和b,使得z 这个式子在z=-N的时候值为-1,而在z = -F的时候值为1,从而在z 方向上构建CVV。接下来我们就求出a和b:F + N F - N-2FN F - N这样我们就得到了透视投影矩阵的第一个版本: 使用这个版本的透视投影矩阵可以从Z方向上构建CVV,但是x和y方向仍旧 没有限制在-1,1中,我们的透视投影矩阵的下一个版本就要解决这个问题。o o b Oa t1 o N o o N o o o投影矩阵verl为了能在x和y方向把顶点从Frustum情形变成CVV情形,我们开头对x和y 进行处理

16、。先来观看我们目前得到的最终变换结果:/ -Nx/z / -Ny/z -(az+b)/z J我们知道-Nx/z的有效范围是投影平面的左边界值(记为left)和右边界值(记-left-leftright - left为 right),即left, right, -Ny / z 那么为bottom, top。而现在我们想把-Nx / z 属于 left, right映射到 x 属于-1, 1中,-Ny / z 属于bottom, top映射到 y 属于-1, 1中。 你想到了什么?哈,就是我们简洁的线性插值,你都已经把握了!我们解决掉它:x - (-1)1 - M)- bottom y - (-1

17、) z _ top - bottom i - (-i)2Nx / -Z right + left x =right - left right - left2Ny / -ztop - bottomtop + bottomtop - bottom那么我们得到了最终的投影点:/2Nx /-zright +left/right -leftright -leftpj =2Ny/-ztop +bottomtop - bottomtop -bottom(az+b)/z下面要做的就是从这个新形式动身反推出下一个版本的透视投影矩阵。留意到 az+b /是z /经过透视除法的形式,而P,只变化了 x和y重量的形式

18、, az+b和-z是不变的,那么我们做透视除法的逆处理一一给F每个重量乘上-z,得 到top + bottom+ btop - bottomright + left +zright 一 left而这个结果又是这么来的:right - leftright - left2Ntop + bottom0 top - bottom top - bottom00TF + N-2FNM就是最终的透视变换矩阵。相机空间中的顶点,假如在视锥体中,那么变换后 就在CVV中。假如在视锥体外,变换后就在CVV外。而CVV本身的规章性对 于多边形的裁剪很有利。OpenGL在构建透视投影矩阵的时候就使用了 M的形 式。留意到M的最终一行不是(0 0 0 1)而是(0 0-1 0),因此可以看出透视变换不 是一种仿射变换,它是非线性的。

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论