深入探索透视投影矩阵.

合集下载

透视投影矩阵 公式

透视投影矩阵 公式

透视投影矩阵:原理、公式与应用透视投影矩阵是计算机图形学中的核心概念,用于在三维空间中模拟人眼看世界的方式。

本文将详细阐述透视投影矩阵的原理、公式及其在各种应用中的作用。

一、透视投影矩阵的原理透视投影,又称远心投影,是计算机图形学中实现三维场景到二维屏幕映射的重要方法。

透视投影的原理与人眼看世界的方式相似:物体离观察者越远,它们显得越小。

这种投影方式能够产生近大远小的视觉效果,使得生成的图像更加逼真。

在透视投影中,观察者位于一个被称为“投影中心”的点,投影线从这个点出发,穿过三维场景中的物体,相交于一个被称为“投影平面”的二维平面。

投影线与投影平面的交点即为物体在二维屏幕上的像素位置。

通过这种方式,三维空间中的物体被映射到了二维平面上。

二、透视投影矩阵的公式透视投影矩阵的公式如下:M = [ m11 m12 m13 m14m21 m22 m23 m24m31 m32 m33 m34m41 m42 m43 m44 ]其中,mij(i, j = 1, 2, 3, 4)为矩阵的元素。

这个4x4的矩阵包含了透视投影所需的所有参数,如视场角(Field of View, FOV)、宽高比(Aspect Ratio)、近裁剪面距离(Near Clipping Plane Distance)和远裁剪面距离(Far Clipping Plane Distance)等。

通过设定这些参数,我们可以得到一个特定的透视投影矩阵。

这个矩阵随后将应用于三维场景中的每一个顶点,将其从视图空间变换到裁剪空间。

裁剪空间是一个中间坐标系,用于判断哪些顶点位于视锥体内,即哪些顶点最终会被绘制到屏幕上。

三、透视投影矩阵的应用1. 游戏开发:在游戏开发中,透视投影矩阵是实现3D游戏视觉效果的关键。

通过调整透视投影矩阵的参数,游戏开发者可以控制玩家的视野范围、游戏的视角效果等,从而营造出不同的游戏氛围和体验。

2. 电影制作:在电影特效制作中,透视投影矩阵也发挥着重要作用。

矩阵在数字图像处理中的应用研究

矩阵在数字图像处理中的应用研究

图像的复原与重建
利用矩阵分解方法(如低秩矩阵 恢复、稀疏表示等),可以从降 质或损坏的图像中恢复出原始图 像或重建高质量图像。
04
基于矩阵的数字图像增强技术
图像增强概述及目标
提高图像对比度
通过增强图像中不同区域间的灰度差异,使图像更加清晰。
消除噪声
减少图像中的随机噪声,改善图像质量。
突出边缘和细节
性和实用性。
02
数字图像处理基础知识
数字图像基本概念及特点
数字图像定义
数字图像是由离散的像素点组成的二 维数组,每个像素点具有特定的位置 和灰度或颜色值。
数字图像特点
数字图像具有离散性、可量化性、可 编辑性、可复制性和可压缩性等特点 。
数字图像处理基本方法
灰度化处理
将彩色图像转换为灰度图像, 减少计算量,同时保留图像的
实验结果与分析
数据集
采用公共图像数据集进行实验,如 MNIST手写数字数据集、CIFAR-10自
然图像数上的性能表现 ,并进行对比分析。
评估指标
使用准确率、召回率、F1分数等指标 评估特征提取与识别方法的性能。
结果分析
分析实验结果,探讨不同方法的优缺 点及适用场景,为后续研究提供参考 。
压缩目标
在保持图像质量的前提下,尽可能地 减少图像数据的存储空间,提高图像 传输和处理效率。
基于矩阵运算的图像压缩方法
矩阵分解
利用矩阵分解技术,如奇异值分解(SVD)、非负矩阵分解(NMF)等,将图像矩阵分解为多个子矩阵的乘积, 从而实现图像压缩。
矩阵量化
通过减少矩阵中元素的精度或采用量化表等方法,对图像矩阵进行量化处理,达到压缩的目的。
03
国内研究现状

透视投影矩阵

透视投影矩阵

透视投影矩阵
第一章什么是透视投影矩阵
透视投影矩阵是一种用于计算三维图形在二维屏幕上的投影的数学工具。

它的目的是模拟
人眼的视觉效果,即把远处的物体变得小一些,近处的物体变得大一些。

这样,我们就可
以在二维屏幕上看到一个有深度的三维图形。

第二章透视投影矩阵的基本概念
透视投影矩阵是一个 4x4 的矩阵,它的前三行用来表示投影的方向,第四行用来表示投
影的位置。

其中,最重要的参数是视点(也称为相机位置)和观察点(也称为目标位置)。

视点表示相机所在的位置,观察点表示相机正在观察的物体的位置。

还有一个重要的参数是上方向,它用来表示相机的方向。

第三章透视投影矩阵的计算
透视投影矩阵的计算涉及到三维向量的运算。

首先,需要计算出视线向量,它是从视点指
向观察点的向量。

然后,需要计算出上方向向量。

最后,需要计算出右方向向量。

这三个
向量是透视投影矩阵的基本元素,我们可以根据这三个向量来构造透视投影矩阵。

第四章透视投影矩阵的应用
透视投影矩阵在计算机图形学中有广泛的应用。

它可以用来实现 3D 游戏中的视角转换、图形变换和光照效果。

此外,透视投影矩阵还可以用来模拟不同的相机焦距效果,例如广角镜头和望远镜。

总的来说,透视投影矩阵是计算机图形学中不可或缺的重要工具。

世界坐标转屏幕坐标算法

世界坐标转屏幕坐标算法

世界坐标转屏幕坐标算法在进行世界坐标到屏幕坐标的转换时,需要考虑以下几个因素:1.相机视角:相机的位置和朝向会影响物体在屏幕上的投影。

一般来说,相机位于世界坐标的原点,朝向为负Z轴方向。

可以通过相机的位置和旋转矩阵来计算相机的视变换矩阵。

2.投影方式:常见的投影方式有正交投影和透视投影。

正交投影将物体在世界坐标中的坐标直接映射到屏幕坐标上,透视投影则根据物体与相机的距离进行透视变换。

一般来说,透视投影更符合真实世界的观察效果,因此在实际应用中更为常见。

下面介绍一种基于透视投影的算法,将世界坐标转换为屏幕坐标:1.定义相机位置和朝向:相机位置为(0,0,0),朝向为负Z轴方向。

2.定义透视投影参数:包括视角、近裁剪面和远裁剪面。

视角可以根据需要进行调整,近裁剪面和远裁剪面决定了可见范围的深度。

3.计算相机视变换矩阵:根据相机的位置和朝向,可以得到相机的视变换矩阵。

这个矩阵将把世界坐标系中的点变换到相机坐标系中。

4.计算投影矩阵:投影矩阵将相机坐标系中的点变换到裁剪坐标系中。

透视投影矩阵可以通过设置视角和近远裁剪面来计算。

5.计算屏幕变换矩阵:屏幕变换矩阵将裁剪坐标系中的点变换到屏幕坐标系中。

这个矩阵可以通过屏幕的宽度和高度来计算。

6.将世界坐标转换为屏幕坐标:将物体的世界坐标点乘以相机视变换矩阵、投影矩阵和屏幕变换矩阵,得到最终的屏幕坐标。

这个算法可以应用于单个物体的坐标转换,也可以应用于整个场景的渲染。

在实际应用中,还需要考虑光照、阴影、纹理等因素,以提高渲染效果的真实感。

总结起来,世界坐标转屏幕坐标算法主要包括相机视变换、投影变换和屏幕变换三个步骤。

这个算法是计算机图形学中实现物体在屏幕上的投影的基础,通过合理设置参数和矩阵计算,可以实现各种逼真的渲染效果。

透视投影矩阵深入原理剖析(转载)

透视投影矩阵深入原理剖析(转载)

透视投影矩阵深入原理剖析(转载)透视投影是3D固定流水线的重要组成部分,是将相机空间中的点从视锥体(frustum)变换到规则观察体(Canonical View Volume)中,待裁剪完毕后进行透视除法的行为。

在算法中它是通过透视矩阵乘法和透视除法两步完成的。

透视投影变换是令很多刚刚进入3D图形领域的开发人员感到迷惑乃至神秘的一个图形技术。

其中的理解困难在于步骤繁琐,对一些基础知识过分依赖,一旦对它们中的任何地方感到陌生,立刻导致理解停止不前。

没错,主流的3D APIs如OpenGL、D3D的确把具体的透视投影细节封装起来,比如gluPerspective(…)就可以根据输入生成一个透视投影矩阵。

而且在大多数情况下不需要了解具体的内幕算法也可以完成任务。

但是你不觉得,如果想要成为一个职业的图形程序员或游戏开发者,就应该真正降伏透视投影这个家伙么?我们先从必需的基础知识着手,一步一步深入下去(这些知识在很多地方可以单独找到,但我从来没有在同一个地方全部找到,但是你现在找到了J)。

我们首先介绍两个必须掌握的知识。

有了它们,我们才不至于在理解透视投影变换的过程中迷失方向(这里会使用到向量几何、矩阵的部分知识,如果你对此不是很熟悉,可以参考《向量几何在游戏编程中的使用》系列文章)。

齐次坐标表示透视投影变换是在齐次坐标下进行的,而齐次坐标本身就是一个令人迷惑的概念,这里我们先把它理解清楚。

根据《向量几何在游戏编程中的使用6》中关于基的概念。

对于一个向量v以及基oabc,可以找到一组坐标(v1,v2,v3),使得v = v1 a + v2 b + v3 c (1)而对于一个点p,则可以找到一组坐标(p1,p2,p3),使得p – o = p1 a + p2 b + p3 c (2)从上面对向量和点的表达,我们可以看出为了在坐标系中表示一个点(如p),我们把点的位置看作是对这个基的原点o所进行的一个位移,即一个向量——p – o(有的书中把这样的向量叫做位置向量——起始于坐标原点的特殊向量),我们在表达这个向量的同时用等价的方式表达出了点p:p = o + p1 a + p2 b + p3 c (3)(1)(3)是坐标系下表达一个向量和点的不同表达方式。

简单的ViewingFrustumCulling投影矩阵推导视锥体,清晰

简单的ViewingFrustumCulling投影矩阵推导视锥体,清晰

简单的ViewingFrustumCulling投影矩阵推导视锥体,清晰Viewing Frustum Culling是图形绘制流⽔线中,将不可见物体(即不在视锥体内的物体)提前剔除的操作。

在实践中,精确判断物体的可见性开销较⼤,因⽽通常⽤物体包围球或包围盒与视锥体(平截头体,View frustum)做相交测试,以此粗略判断物体是否可见。

进⼀步地,我们可以采⽤如下⽅式来⼤致判断⼀个球体与视锥体是否相交:球与视锥体相交的必要(⾮充分)条件是:其中⼼P与视锥体的6个⾯的符号距离(Signed distance)d均⼩于球的半径R。

注意对于⼀个平⾯aX + bY+ cZ + d = 0 ([a, b, c]为平⾯法线⽅向N,d为平⾯与原点的符号距离), ⼀个点P(x, y, z)与该平⾯的符号距离为ax + by + cz + d。

因此要粗略判断物体与视锥体是否相交,只需要将其包围球与视锥体的6个⾯分别计算符号距离即可,如果其与任⼀⾯的符号距离⼤于R,则可安全剔除。

那么如何算得视锥体每个⾯的⾯⽅程呢?⼀个⽐较通⽤的⽅法是求出视锥体的8个顶点,然后分别利⽤叉积和点积求出6个⾯的法线和原点距。

但如果我们已经知道投影矩阵,也可以⽤如下更简单的⽅法算得⾯⽅程:(以Direct3D为例,OpenGL与之相似,但需要注意的是其规范化设备坐标系的Z取值范围为[-1,1]⽽⾮[0,1])对于⼀个场景,设物体空间中有⼀球体,中⼼坐标为P,半径为R,由某⼀视锥体定义的物体空间到规范化设备空间的变换矩阵为M= World *View *Projection。

现需要求该视锥体各个⾯在物体空间中的⾯⽅程。

回顾规范化设备坐标系的定义,我们可以很容易得知,M的效果可以看做是将视锥体的6个⾯分别变换到X=1, X=-1, Y=1, Y=-1, Z=0, Z=1这6个⾯上。

例如,视锥体的近剪裁⾯经过M,会变换到Z=0平⾯上,远剪裁⾯变换到Z=1平⾯上,其他4个⾯也是类似变换。

OpenGL投影矩阵(ProjectionMatrix)构造方法

OpenGL投影矩阵(ProjectionMatrix)构造方法

OpenGL投影矩阵(ProjectionMatrix)构造⽅法(翻译,图⽚也来⾃)⼀、概述绝⼤部分计算机的显⽰器是⼆维的(a 2D surface)。

在OpenGL中⼀个3D场景需要被投影到屏幕上成为⼀个2D图像(image)。

这称为投影变换(参见或),需要⽤到投影矩阵(projection matrix)。

⾸先,投影矩阵会把所有顶点坐标从eye coordinates(观察空间,eye space或view space)变换到裁剪坐标(clip coordinated,属于裁剪空间,clip space)。

然后,这些裁剪坐标被变换到标准化设备坐标(normalized device coordinates, NDC,即坐标范围在-1到1之间),这⼀步是通过⽤⽤裁剪坐标的w_c分量除裁剪坐标实现的。

因此,我们要记住投影矩阵⼲了两件事: 裁剪clipping(即frustum culling,视景体剔除)和⽣成NDC。

下⽂会讲述如何根据6个参数(left, right, bottom, top, near和far边界值)来构建投影矩阵。

注意视景体剔出(也即clipping)是在裁剪坐标下完成的,是早于⽤w_c(即上⾯提到的w分量,c表⽰clipping)除裁剪坐标的(它会⽣成NDC)。

裁剪坐标x_c, y_c, z_c会与w_c进⾏⽐较。

如果裁剪坐标⽐-w_c⼩或者⽐w_c⼤,则丢弃这个顶点(vertex)。

即经裁剪后剩余的顶点的裁剪坐标满⾜:-w_c < x_c, y_c, z_c < w_c。

OpenGL会成发⽣裁剪的地⽅⽣成新的边,如下图1,⼀个三⾓形经裁后,成了⼀个梯形,两条红⾊的边就是裁剪后新⽣成的。

(图1. ⼀个被视体裁剪的三⾓形)⼀般常⽤的有透视投影和正交投影,相应地也就有两种投影矩阵。

⼆、透视投影(Perspective Projection)(图2. 透视投影中的视景体和标准化设备坐标NDC)在透视投影中,⼀个3D point是在⼀个截头锥体中(truncated pyramid frustum,上⾯图2左图,即⼀个棱台),会被映射到⼀个⽴⽅体(NDC坐标空间)中,x坐标范围从[1, r]变成了[-1, 1],y坐标范围从[b, t]变成了[-1, 1],z坐标从[-n, -f]变成了[-1, 1]。

深入探索3D拾取技术

深入探索3D拾取技术

深入探索3D拾取技术在游戏中,玩家需要通过点击2D屏幕来选择3D物体,这个过程就是拾取(picking)。

拾取是3D游戏必不可少的基本操作,它实现了玩家和游戏世界内对象的交互。

虽然拾取技术很基本,但它却迷惑了很多3D初学者。

很多朋友都问过我关于拾取的细节问题,这让我觉得很有必要具体探讨一下该技术。

其实,拾取之所以让很多开发者感到复杂,主要原因在于它跨域了流水线的多个阶段,并且是逆流水线上行。

另外,它是一个2D信息扩展到3D的过程,必须对信息做相应的扩展和额外的计算才能够得到正确的结果。

下面我门具体分析一下这个技术。

水流线主要阶段分析我们来直观地看一下从相机空间到viewport的变换相机空间中的一个顶点v,经过透视变换后进入了CVV中。

这个变换矩阵实际上完成了两个工作:1)将顶点从3D空间投影到2D的投影平面(Projection Plane)上。

2)将投影平面上的2D投影点通过线性插值变换到齐次裁剪空间CVV中。

这些变换都通过透视矩阵一次完成。

我之所以把这一步分解为两步,因为这对于分析拾取很重要。

顶点进入齐次裁剪空间并经过CVV裁剪,最终进行透视除法从4D齐次形式变回成3D形式。

然后经过一个线性插值(被封装在视口(viewport)变换中),变换到viewport中,多个点以三角形的形式经过光栅化后被玩家看到。

最后一步的点变换可以描述为:3)将CVV中的点通过线性插值变换到viewport中。

分析了这个变换过程之后,我们知道了从相机空间开始实际处理点位置信息的操作,就是上面的三个步骤。

这样,我们可以先把顶点从viewport中先变换回投影平面上,也就是我们可以先完成(2)和(3)的逆处理。

这里我们不用考虑裁剪和透视除法这些操作,因为反推的时候,处于视口中的点,已经是经过裁剪后留下的有效点了,必定处于CVV内,也必定处于projection plane内!而且从viewport逆变换到projection plane,点一直保持2D形式。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

-Twinsen 编写- 本人水平有限,疏忽错误在所难免,还请各位数学高手、编程高手不吝赐教 -email:透视投影是 3D 固定流水线的重要组成部分,是将相机空间中的点从视锥体 (frustum) 变换到规则观察体 (Canonical View Volume) 中,待裁剪完毕后进行透视除法的行为。

在算法中它是通过透视矩阵乘法和透视除法两步完成的。

透视投影变换是令很多刚刚进入 3D 图形领域的开发人员感到迷惑乃至神秘的一个图形技术。

其中的理解困难在于步骤繁琐,对一些基础知识过分依赖,一旦对它们中的任何地方感到陌生,立刻导致理解停止不前。

没错,主流的 3D APIs 如 OpenGL 、 D3D 的确把具体的透视投影细节封装起来,比如gluPerspective(…) 就可以根据输入生成一个透视投影矩阵。

而且在大多数情况下不需要了解具体的内幕算法也可以完成任务。

但是你不觉得,如果想要成为一个职业的图形程序员或游戏开发者,就应该真正降伏透视投影这个家伙么?我们先从必需的基础知识着手,一步一步深入下去(这些知识在很多地方可以单独找到,但我从来没有在同一个地方全部找到,但是你现在找到了)。

我们首先介绍两个必须掌握的知识。

有了它们,我们才不至于在理解透视投影变换的过程中迷失方向(这里会使用到向量几何、矩阵的部分知识,如果你对此不是很熟悉,可以参考《向量几何在游戏编程中的使用》系列文章)。

齐次坐标表示透视投影变换是在齐次坐标下进行的,而齐次坐标本身就是一个令人迷惑的概念,这里我们先把它理解清楚。

根据《向量几何在游戏编程中的使用 6 》中关于基的概念。

对于一个向量 v 以及基 oabc ,可以找到一组坐标 (v1,v2,v3) ,使得v = v1 a + v2 b + v3 c ( 1 )而对于一个点 p ,则可以找到一组坐标( p1,p2,p3 ),使得p – o = p1 a + p2 b + p3 c ( 2 )从上面对向量和点的表达,我们可以看出为了在坐标系中表示一个点(如 p ),我们把点的位置看作是对这个基的原点 o 所进行的一个位移,即一个向量—— p – o (有的书中把这样的向量叫做位置向量——起始于坐标原点的特殊向量),我们在表达这个向量的同时用等价的方式表达出了点 p :p = o + p1 a + p2 b + p3 c (3)(1)(3) 是坐标系下表达一个向量和点的不同表达方式。

这里可以看出,虽然都是用代数分量的形式表达向量和点,但表达一个点比一个向量需要额外的信息。

如果我写出一个代数分量表达 (1, 4, 7) ,谁知道它是个向量还是个点!我们现在把( 1 )( 3 )写成矩阵的形式:这里 (a,b,c,o) 是坐标基矩阵,右边的列向量分别是向量 v 和点 p 在基下的坐标。

这样,向量和点在同一个基下就有了不同的表达: 3D 向量的第 4 个代数分量是0 ,而 3D 点的第 4 个代数分量是 1 。

像这种这种用 4 个代数分量表示 3D 几何概念的方式是一种齐次坐标表示。

“齐次坐标表示是计算机图形学的重要手段之一,它既能够用来明确区分向量和点,同时也更易用于进行仿射(线性)几何变换。

”—— F.S. Hill, JR这样,上面的 (1, 4, 7) 如果写成( 1,4,7,0 ),它就是个向量;如果是 (1,4,7,1) ,它就是个点。

下面是如何在普通坐标 (Ordinary Coordinate) 和齐次坐标 (Homogeneous Coordinate) 之间进行转换:从普通坐标转换成齐次坐标时,如果 (x,y,z) 是个点,则变为 (x,y,z,1);如果 (x,y,z) 是个向量,则变为 (x,y,z,0)从齐次坐标转换成普通坐标时,如果是 (x,y,z,1) ,则知道它是个点,变成 (x,y,z);如果是 (x,y,z,0) ,则知道它是个向量,仍然变成 (x,y,z)以上是通过齐次坐标来区分向量和点的方式。

从中可以思考得知,对于平移 T 、旋转 R 、缩放 S 这 3 个最常见的仿射变换,平移变换只对于点才有意义,因为普通向量没有位置概念,只有大小和方向,这可以通过下面的式子清楚地看出:而旋转和缩放对于向量和点都有意义,你可以用类似上面齐次表示来检测。

从中可以看出,齐次坐标用于仿射变换非常方便。

此外,对于一个普通坐标的点 P=(Px, Py, Pz) ,有对应的一族齐次坐标 (wPx, wPy, wPz, w) ,其中 w 不等于零。

比如, P(1, 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 个分量来表达 3D 概念,使得平移变换可以使用矩阵进行,从而如 F.S. Hill, JR 所说,仿射(线性)变换的进行更加方便。

由于图形硬件已经普遍地支持齐次坐标与矩阵乘法,因此更加促进了齐次坐标使用,使得它似乎成为图形学中的一个标准。

简单的线性插值这是在图形学中普遍使用的基本技巧,我们在很多地方都会用到,比如 2D 位图的放大、缩小, Tweening 变换,以及我们即将看到的透视投影变换等等。

基本思想是:给一个 x 属于 [a, b] ,找到 y 属于 [c, d] ,使得 x 与 a 的距离比上 ab 长度所得到的比例,等于 y 与 c 的距离比上 cd 长度所得到的比例,用数学表达式描述很容易理解:这样,从 a 到 b 的每一个点都与 c 到 d 上的唯一一个点对应。

有一个 x ,就可以求得一个 y 。

此外,如果 x 不在 [a, b] 内,比如 x < a 或者 x > b ,则得到的 y 也是符合 y < c 或者 y > d ,比例仍然不变,插值同样适用。

透视投影变换好,有了上面两个理论知识,我们开始分析这次的主角——透视投影变换。

这里我们选择 OpenGL 的透视投影变换进行分析,其他的 APIs 会存在一些差异,但主体思想是相似的,可以类似地推导。

经过相机矩阵的变换,顶点被变换到了相机空间。

这个时候的多边形也许会被视锥体裁剪,但在这个不规则的体中进行裁剪并非那么容易的事情,所以经过图形学前辈们的精心分析,裁剪被安排到规则观察体 (Canonical View Volume, CVV) 中进行, CVV 是一个正方体, x, y, z 的范围都是[-1 , 1] ,多边形裁剪就是用这个规则体完成的。

所以,事实上是透视投影变换由两步组成:1)用透视变换矩阵把顶点从视锥体中变换到裁剪空间的 CVV 中。

2) CVV 裁剪完成后进行透视除法(一会进行解释)。

我们一步一步来,我们先从一个方向考察投影关系。

上图是右手坐标系中顶点在相机空间中的情形。

设 P(x,z) 是经过相机变换之后的点,视锥体由 eye ——眼睛位置, np——近裁剪平面, fp ——远裁剪平面组成。

N 是眼睛到近裁剪平面的距离, F 是眼睛到远裁剪平面的距离。

投影面可以选择任何平行于近裁剪平面的平面,这里我们选择近裁剪平面作为投影平面。

设P’(x’,z’) 是投影之后的点,则有z’ = -N 。

通过相似三角形性质,我们有关系:同理,有这样,我们便得到了 P 投影后的点P’从上面可以看出,投影的结果z’ 始终等于 -N ,在投影面上。

实际上,z’ 对于投影后的P’ 已经没有意义了,这个信息点已经没用了。

但对于 3D 图形管线来说,为了便于进行后面的片元操作,例如 z 缓冲消隐算法,有必要把投影之前的 z 保存下来,方便后面使用。

因此,我们利用这个没用的信息点存储 z ,处理成:这个形式最大化地使用了 3 个信息点,达到了最原始的投影变换的目的,但是它太直白了,有一点蛮干的意味,我感觉我们最终的结果不应该是它,你说呢?我们开始结合 CVV 进行思考,把它写得在数学上更优雅一致,更易于程序处理。

假入能够把上面写成这个形式:那么我们就可以非常方便的用矩阵以及齐次坐标理论来表达投影变换:其中哈,看到了齐次坐标的使用,这对于你来说已经不陌生了吧?这个新的形式不仅达到了上面原始投影变换的目的,而且使用了齐次坐标理论,使得处理更加规范化。

注意在把变成的一步我们是使用齐次坐标变普通坐标的规则完成的。

这一步在透视投影过程中称为透视除法( PerspectiveDivision ),这是透视投影变换的第 2 步,经过这一步,就丢弃了原始的 z 值(得到了 CVV 中对应的 z 值,后面解释),顶点才算完成了投影。

而在这两步之间的就是 CVV 裁剪过程,所以裁剪空间使用的是齐次坐标,主要原因在于透视除法会损失一些必要的信息(如原始 z,第 4 个 -z 保留的)从而使裁剪变得更加难以处理,这里我们不讨论 CVV 裁剪的细节,只关注透视投影变换的两步。

矩阵就是我们投影矩阵的第一个版本。

你一定会问为什么要把 z 写成有两个原因:1)P’ 的 3 个代数分量统一地除以分母 -z ,易于使用齐次坐标变为普通坐标来完成,使得处理更加一致、高效。

2)后面的 CVV 是一个 x,y,z 的范围都为 [-1 , 1] 的规则体,便于进行多边形裁剪。

而我们可以适当的选择系数 a 和 b ,使得接下来我们就求出 a 和 b :这个式子在 z = -N 的时候值为 -1 ,而在 z = -F 的时候值为 1 ,从而在 z 方向上构建 CVV 。

这样我们就得到了透视投影矩阵的第一个版本:使用这个版本的透视投影矩阵可以从 z 方向上构建 CVV ,但是 x 和 y 方向仍然没有限制在 [-1,1] 中,我们的透视投影矩阵的下一个版本就要解决这个问题。

为了能在 x 和 y 方向把顶点从 Frustum 情形变成 CVV 情形,我们开始对 x 和 y 进行处理。

先来观察我们目前得到的最终变换结果:我们知道 -Nx / z 的有效范围是投影平面的左边界值(记为 left )和右边界值(记为 right ),即 [left, right] , -Ny / z 则为[bottom, top] 。

而现在我们想把 -Nx / z 属于 [left, right] 映射到 x 属于 [-1, 1] 中, -Ny / z 属于 [bottom, top] 映射到 y 属于[-1, 1] 中。

你想到了什么?哈,就是我们简单的线性插值,你都已经掌握了!我们解决掉它:则我们得到了最终的投影点:下面要做的就是从这个新形式出发反推出下一个版本的透视投影矩阵。

相关文档
最新文档