深入探索透视投影矩阵.
透视投影矩阵 公式
透视投影矩阵:原理、公式与应用透视投影矩阵是计算机图形学中的核心概念,用于在三维空间中模拟人眼看世界的方式。
本文将详细阐述透视投影矩阵的原理、公式及其在各种应用中的作用。
一、透视投影矩阵的原理透视投影,又称远心投影,是计算机图形学中实现三维场景到二维屏幕映射的重要方法。
透视投影的原理与人眼看世界的方式相似:物体离观察者越远,它们显得越小。
这种投影方式能够产生近大远小的视觉效果,使得生成的图像更加逼真。
在透视投影中,观察者位于一个被称为“投影中心”的点,投影线从这个点出发,穿过三维场景中的物体,相交于一个被称为“投影平面”的二维平面。
投影线与投影平面的交点即为物体在二维屏幕上的像素位置。
通过这种方式,三维空间中的物体被映射到了二维平面上。
二、透视投影矩阵的公式透视投影矩阵的公式如下: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投影矩阵推导视锥体,清晰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)构造⽅法(翻译,图⽚也来⾃)⼀、概述绝⼤部分计算机的显⽰器是⼆维的(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拾取技术在游戏中,玩家需要通过点击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形式。
OpenGL空间(坐标系)变换
OpenGL空间(坐标系)变换⽹友的《3D图形学的学习策略》⼀⽂使我深受启发,在图形学以及openGL学习⽅⾯给了我很有价值的指导性意见,在此对前辈们的不吝赐教表⽰感激,谢谢你们的⽆私分享。
如⽂章所说,API是⼯具,不是本质,OpenGL/Direct3D的本质是图形学,⽽不是OpenGL/Direct3D的本⾝,API的本⾝只是⼀些Interface⽽已。
最重要的,最根本的是,你要明⽩这些API背后的图形学的原理---因为那才是根本中的根本。
其实很多事情,包括学习也涉及到⽣活,只有抓住了本质,才能体会到其中的真谛。
带着这种希望探究本质的学习⽅法,结合图形学原理,通过阅读书⽬和⽹友们的⽂章,我对OpenGL⼏何空间变换进⾏了总结性的学习。
OpenGL处理管线的⽬的是将对象的三维描述转换为可以显⽰的⼆维图像。
为了完成这个从三维到⼆维的转换,OpenGL 使⽤了多个空间(坐标系),每个空间完成特定的任务,从⼀个空间到另⼀个空间需要进⾏空间转换。
理解OpenGL所使⽤的各种空间以及它们间的变换是⾮常重要的。
如上图所⽰,openGL中使⽤的空间依次是:对象空间、世界空间、视点空间、裁剪空间、归⼀化设备空间、窗⼝空间、屏幕空间。
结合⾃⼰的理解,就每个空间完成的基本任务和空间的变换关系,总结如下。
对象空间。
对象空间中完成的最⼤任务是对象建模,三维对象的属性,包括顶点位置和表⾯法线等是在这个空间内指定的。
这个空间的坐标原点⼀般在对象上,有时候也在其他地⽅,主要是为了建模⽅便。
每⼀个对象都有⼀个⾃⼰的对象空间。
就openGL⽽⾔,我⽬前还没有接触到建⽴很复杂模型的应⽤,建模⼀般在其他地⽅如3DMAX中完成,然后读⼊openGL进⾏处理。
世界空间。
对象空间之后是世界空间,我理解为世界坐标系是固定不变的。
世界空间主要是对三维场景进⾏描述,就是把已经建⽴的各种对象摆放在三维空间中,空间的转换是通过模型变换完成的。
可以通过平移、旋转、⽐例缩放等把对象摆放在需要的位置,就好像买好家具以后设计房间布局⼀样。
如何运用透视法增加画面的深度和空间感
如何运用透视法增加画面的深度和空间感透视法是绘画中常用的一种技巧,通过合理运用透视法可以增加画面的深度和空间感,使画面更加生动和立体。
本文将介绍如何运用透视法来增加画面的深度和空间感。
一、透视法的基本原理透视法是一种通过绘制物体的线条和投影来表现物体在空间中位置关系的方法。
它基于以下两个基本原理:1. 远近原理:远离观察者的物体看起来较小,而靠近观察者的物体看起来较大。
2. 收敛原理:平行线在远离观察者的方向上会逐渐收敛,最终汇聚到一个点上,称为消失点。
二、使用透视法增加画面的深度和空间感的方法1. 选择适当的透视类型透视法有单点透视和两点透视两种类型。
单点透视适用于正面或侧面的视角,而两点透视适用于斜面的视角。
根据画面的需求选择适当的透视类型。
2. 确定消失点的位置消失点是透视法中非常重要的概念,它决定了平行线的收敛方向。
在画面中确定一个或多个消失点的位置,可以通过这些消失点来确定物体的位置和大小。
3. 绘制透视线透视线是连接物体上的点与消失点的线条。
通过绘制透视线,可以将物体的位置和大小准确地表现在画面中。
4. 透视变形在透视法中,物体的形状会因为远近关系而发生变化。
远离观察者的物体会变小,而靠近观察者的物体会变大。
在绘画中,可以通过透视变形来表现这种远近关系,使画面更加真实。
5. 利用明暗对比增加空间感透视法不仅可以通过线条来表现物体的远近关系,还可以通过明暗对比来增加画面的空间感。
远离观察者的物体通常较暗,而靠近观察者的物体通常较亮。
通过合理运用明暗对比,可以使画面更加立体和有层次感。
6. 利用遮挡增加深度感在画面中添加一些遮挡物,可以增加画面的深度感。
遮挡物可以是建筑物、树木、人物等,通过遮挡物的存在,可以使画面更加有层次感和立体感。
7. 运用透视法绘制背景背景是画面中重要的一部分,通过运用透视法来绘制背景,可以使画面更加有深度和空间感。
在绘制背景时,可以运用透视法来表现建筑物、道路、山脉等,使背景与前景相互呼应,形成画面的整体感。
空间点投影到像素坐标的过程
空间点投影到像素坐标的过程空间点投影到像素坐标是计算机视觉中常见的过程,用于将三维空间中的点映射到二维图像的像素坐标系中。
本文将详细介绍空间点投影到像素坐标的过程,包括投影模型和计算方法。
在计算机视觉领域,常用的投影模型有透视投影和正交投影两种。
透视投影模型是一种模拟人眼视觉的投影方式,将三维空间中的点映射到一个视野范围内的二维图像中。
正交投影模型则是一种投影方式,将三维空间中的点平行投影到二维图像中,保持相对距离和大小的不变。
以透视投影模型为例,下面介绍空间点投影到像素坐标的具体计算过程。
首先,我们需要确定相机的内参矩阵。
相机内参矩阵包括焦距、光心偏移等参数,用于将相机坐标系中的点转换到图像坐标系中。
假设相机内参矩阵为K,可以表示为:K = [fx 0 cx][0 fy cy][0 0 1]其中,fx和fy为焦距的像素单位,cx和cy为光心在图像坐标系中的位置。
接下来,我们需要确定相机的外参矩阵,也称为相机坐标系到世界坐标系的变换矩阵。
相机外参矩阵包括旋转矩阵R和平移向量t,用于将世界坐标系中的点转换到相机坐标系中。
假设某一空间点的坐标为P = [X Y Z 1],将其转换到相机坐标系中的坐标为P_c = [X_c Y_c Z_c 1],可以通过以下公式进行计算:P_c = [R|t] * P其中,[R|t]表示将旋转矩阵和平移向量按列拼接起来得到的4×4的变换矩阵。
将点P_c投影到归一化平面上,可以得到归一化平面上的坐标P_n = [x_n y_n 1],公式如下:x_n = X_c / Z_cy_n = Y_c / Z_c最后,将P_n坐标映射到图像坐标系中,可以得到像素坐标P_p = [u v 1],公式如下:P_p = K * P_n其中,[u v]表示像素坐标。
综上所述,空间点投影到像素坐标的过程可以概括为以下几个步骤:1. 确定相机的内参矩阵K;2. 确定相机的外参矩阵[R|t];3. 将空间点的坐标P转换到相机坐标系中的坐标P_c;4. 将P_c投影到归一化平面上的坐标P_n;5. 将P_n映射到图像坐标系中的坐标P_p。
深入探索正交投影变换
深入探索正交投影变换之前我们在《深入探索透视投影变换》以及《深入探索透视投影变换(续)》中研究了OpenGL、D3D以及M3G的透视投影变换的原理以及生成方法。
这些方法在当前的主流图形API 中得到了普遍使用。
但关于投影应用,还有一类经常使用的投影方式需要我们深入理解——正交投影,我们在本篇文章里面研究它(这里假设读者已经看过前两篇文章,并理解了绝大多数的理论,因为正交投影比透视投影的推导关系简单得多,因此我们的推导会非常得快,如果读者有任何的不解,请参考前两篇文章或者通过email联系我)。
在具体研究之前我觉得有必要把平面投影的分类简单介绍一下,目的是为了让大家有一个总体的认识,从而更好的理解这个知识体系。
请看下图:平面投影分为平行投影和透视投影两种类型,后者我们在前两篇文章中介绍了。
平行投影则是具有矩形观察体的投影方式(透视投影则是视锥观察体),它不会根据物体离视点的远近缩放物体(透视投影则会)。
平行投影可以分成侧投影和正交投影两种类型。
这两种类型如何区分呢?我们继续看图吧:上图中,v是投影平面,n是它的法线。
p和q是平面外两点,p’和q’分别是它们在平面上的投影点。
q的投影方向向量为Q = 单位化(q’-q),而p的投影方向向量为P = 单位化(p’-p),其中Q不平行于n而P平行于n,则q的投影叫做侧投影,而p的投影叫做正交投影。
正交投影是我们今天的研究对象。
实际上上面对平面投影的分类还可以继续向下细分,比如透视投影可以分为一灭点、二灭点以及三灭点透视投影。
侧投影则可以继续分为散点侧投、斜二轴侧投等等。
而正交投影则可以分成轴侧投影以及多视点正交投影等等。
如果读者对此感兴趣,可以参考相关的图形学教程。
接下来我们研究正交投影。
分别介绍OpenGL、D3D以及M3G的。
我们的环境约定(左右手坐标系、行列向量乘法、CVV范围)仍然尊重相应API自己的设置。
OpenGL正交投影变换下图是OpenGL的右手坐标系中观察空间的情形,我们看到的是正交投影的矩形观察体,原点是相机位置,n是近裁剪平面到相机平面的距离,f是远裁剪平面到相机平面的距离。
投影矩阵
视锥就是场景中的一个三维空间,它的位置由视口的摄像机来决定。
这个空间的形状决定了摄像机空间中的模型将被如何投影到屏幕上。
透视投影是最常用的一种投影类型,使用这种投影,会使近处的对象看起来比远处的大一些。
对于透视投影,视锥可以被初始化成金字塔形,将摄像机放在顶端。
这个金字塔再经过前、后两个剪切面的分割,位于这两个面之间的部分就是视锥。
只有位于视锥内的对象才可见。
视锥由凹视野(在上图中,变量投影矩阵是一个典型的缩放和透视矩阵。
投影变换将视锥变换成一个直平行六面体的形状。
因为视锥的近处比远处小,这样就会对靠近摄像机的对象起到放大的作用,也就将透视应用到了场景当中。
在视锥中,摄像机与空间原点间的距离被定义为变量视矩阵将摄像机放置在场景的原点。
又因为投影矩阵需要将摄像机放在将两个矩阵相乘,得到下面的矩阵:下图显示了透视变换如何将一个视锥变换成一个新的坐标空间。
注意:锥形体变成了直平行六面体,原点从场景的右上角移到了中心。
在透视变换中,这个矩阵基于一定的距离(这个距离是从摄像机到邻近的剪切面)对对象进行平移和旋转,但是它没有考虑到视野(在这个矩阵中,在程序中,使用视野角度来定义x和y缩放系数比使用视口的水平和垂直尺寸(在摄像机空间中)并不方便多少。
下面两式使用了视口的尺寸,并且与上面的公式相等:在这些公式中,Zn表示邻近的剪切面的位置,变量Vw和Vh表示视口的高和宽。
这两个参数与D3DVIEWPORT2结构中的dwWidth和dwHeight成员相关。
不管你使用那个公式,将同世界和视变换一样,可以调用下面的D3DMATRIX ProjectionMatrix(const float near_plane,// distance to near clipping planeconst float far_plane,// distance to far clipping planeconst float fov_horiz,// horizontal field of view angle, in radiansconst float fov_vert)// vertical field of view angle, in radians {float h, w, Q;w = (float)cot(fov_horiz*0.5);h = (float)cot(fov_vert*0.5);Q = far_plane/(far_plane - near_plane);D3DMATRIX ret = ZeroMatrix();ret(0, 0) = w;ret(1, 1) = h;ret(2, 2) = Q;ret(3, 2) = -Q*near_plane;ret(2, 3) = 1;return ret;} // end of ProjectionMatrix()一旦创建完了矩阵,你需要调用一个顶点经过世界、观察和投影变换之后,下图展示了一个不适合的投影矩阵,和一个经过缩放的适合的矩阵:在前面的矩阵中,所有的变量都被假定为非零。
透视变换矩阵和相机参数
透视变换矩阵和相机参数全文共四篇示例,供读者参考第一篇示例:透视变换矩阵和相机参数是计算机图形学中重要的概念,它们在虚拟现实、游戏开发和计算机辅助设计等领域起着重要作用。
透视变换矩阵用于将三维场景投影到二维屏幕上,而相机参数则决定了场景在屏幕上的具体表现方式。
本文将深入探讨透视变换矩阵和相机参数的原理及应用。
我们来介绍透视变换矩阵。
在计算机图形学中,透视变换矩阵是用来将三维空间中的点投影到二维平面上的矩阵。
它是由一个透视投影矩阵和一个视点矩阵组合而成。
透视投影矩阵包含了观察者的视点、视角和透视投影平面的参数,而视点矩阵则包含了场景中物体的位置、旋转和缩放等信息。
透视投影矩阵的计算方法包括了将物体坐标系中的点转换到相机坐标系中,再把相机坐标系中的点转换到裁剪坐标系中,最后再将裁剪坐标系中的点进行透视变换得到最终的屏幕坐标。
透视变换矩阵的计算涉及到矩阵乘法和坐标变换等数学知识,需要深入理解线性代数和几何变换的原理才能准确地进行计算。
相机参数也是影响场景表现的重要因素。
相机参数包括了视角、焦距、光圈和感光度等参数。
视角决定了场景在屏幕上的大小和比例,焦距和光圈决定了景深和景别,而感光度则影响了场景的曝光和对比度。
在计算机图形学中,调整相机参数可以使场景更加真实和逼真,符合人类眼睛的观察方式。
在虚拟现实和游戏开发领域,透视变换矩阵和相机参数的选择对于场景的表现至关重要。
合理的透视变换矩阵和相机参数可以让人们感受到身临其境的虚拟体验,增强沉浸感和真实感。
在计算机辅助设计领域,透视变换矩阵和相机参数则可以帮助设计师更准确地展示自己的设计作品,提高设计效率和质量。
第二篇示例:透视变换矩阵和相机参数是计算机图形学领域中非常重要的概念,它们能够帮助我们将三维世界中的物体投影到二维屏幕上,从而实现真实感的渲染效果。
本文将从透视变换矩阵和相机参数的定义、原理、应用以及优化等方面进行详细介绍。
透视变换矩阵是一种用来描述透视投影的数学工具,它可以将三维空间中的物体投影到二维屏幕上。
基于空间射影变换的视角转换方法
基于空间射影变换的视角转换方法空间射影变换是一种在计算机图形学中广泛应用的技术,用于将3D空间中的对象在不同的视角进行投影以呈现出逼真的3D效果。
在计算机视觉和虚拟现实领域,视角转换是一项重要的技术,它可以帮助我们在不同的视角下观察和理解3D场景。
本文将介绍基于空间射影变换的视角转换方法,并探讨其在计算机图形学领域的应用。
一、空间射影变换的基本原理空间射影变换是一种数学方法,通过应用投影矩阵将3D空间中的对象投影到2D平面上。
在计算机图形学中,我们通常使用透视投影或正交投影进行空间射影变换。
透视投影是一种模拟人眼视觉的投影方式,它可以使观察者在观察3D场景时感受到景深和透视效果。
透视投影通常通过透视投影矩阵来实现,其基本原理是根据观察者的位置和视线方向,将3D场景中的对象投影到视平面上。
透视投影可以使得远处的物体看起来比近处的物体小,从而呈现出逼真的3D效果。
正交投影是一种简单而直接的投影方式,它将3D场景中的对象投影到一个平行于观察平面的平面上。
正交投影通常通过正交投影矩阵来实现,其基本原理是将3D场景中的对象在观察者的视线方向上进行投影,保持物体在投影平面上的大小和比例不变。
正交投影不会呈现出透视效果,但可以使得物体在不同视角下呈现出相同的大小和比例。
在计算机图形学中,基于空间射影变换的视角转换方法主要包括以下几个步骤:1.确定观察者的位置和朝向。
通过设定观察者的位置和观察方向,我们可以确定视角转换的基本参数,包括视点、观察方向和上方向。
2.构建投影矩阵。
根据观察者的位置和朝向,我们可以构建透视投影矩阵或正交投影矩阵,用于将3D场景中的对象进行投影。
3.进行坐标变换。
将3D场景中的对象的顶点坐标通过投影矩阵进行坐标变换,将其投影到2D平面上。
4.剔除不可见部分。
通过深度测试或裁剪算法,剔除投影后在观察平面之外的部分,以减少不必要的计算和提高性能。
5.渲染投影图像。
将投影到2D平面上的对象进行光照、纹理映射和渲染,生成最终的投影图像。
世界坐标转屏幕坐标算法
世界坐标转屏幕坐标算法一般来说,世界坐标系与屏幕坐标系之间存在一个变换矩阵,通过该矩阵可以将世界坐标转换为屏幕坐标。
下面是一个简单的介绍世界坐标转屏幕坐标的算法。
1.确定变换矩阵:首先,需要确定一个变换矩阵,该矩阵定义了世界坐标系与屏幕坐标系之间的关系。
这个变换矩阵一般包括平移、缩放和旋转操作。
2.获取相机参数:在进行世界坐标转屏幕坐标的过程中,需要知道相机的一些参数,例如相机的位置、朝向和透视投影矩阵等。
3.计算视图矩阵:根据相机的位置和朝向,可以计算出一个称为视图矩阵的矩阵。
视图矩阵定义了从世界坐标系到相机坐标系的变换。
4.计算投影矩阵:透视投影矩阵用于将相机坐标系的点转换为裁剪坐标系的点。
透视投影矩阵的计算可以使用现有的数学库函数。
5.计算模型矩阵:模型矩阵描述了对象相对于世界坐标系的变换。
根据对象的位置、旋转和缩放等信息,可以计算出模型矩阵。
6.将点从世界坐标系转换为屏幕坐标系:将要转换的点坐标与模型矩阵、视图矩阵和投影矩阵相乘,得到的结果就是点在裁剪坐标系的坐标。
然后,将裁剪坐标系的坐标进行归一化处理,得到屏幕坐标系的坐标。
7.转换结果处理:最后,根据具体的需求,可以对转换后的屏幕坐标进行处理。
例如,可以将屏幕坐标转换为整数坐标,以便于在屏幕上进行绘制。
总结:世界坐标转屏幕坐标算法需要确定变换矩阵,获取相机参数,计算视图矩阵和投影矩阵,计算模型矩阵,并将点从世界坐标系转换到屏幕坐标系。
在进行坐标转换时,需要使用数学库函数进行矩阵计算。
最后,可以根据需求对转换结果进行处理。
这些步骤构成了世界坐标转屏幕坐标的算法。
透视投影矩阵推导
在上一篇文章中我们讨论了透视投影变换的原理,分析了OpenGL所使用的透视投影矩阵的生成方法。
正如我们所说,不同的图形API因为左右手坐标系、行向量列向量矩阵以及变换范围等等的不同导致了矩阵的差异,可以有几十个不同的透视投影矩阵,但它们的原理大同小异。
这次我们准备讨论一下Direct3D(以下简称D3D)以及J2ME平台上的JSR184(M3G)(以下简称M3G)的透视投影矩阵,主要出于以下几个目的:(1)我们在写图形引擎的时候需要采用不同的图形API实现,当前主要是OpenGL和D3D。
虽然二者的推导极为相似,但D3D的自身特点导致了一些地方仍然需要澄清。
(2) DirectX SDK的手册中有关于透视投影矩阵的一些说明,但并不详细,甚至有一些错误,从而使初学者理解起来变得困难,而这正是本文写作的目的。
(3) M3G是J2ME平台上的3D开发包,采用了OpenGL作为底层标准进行封装。
它的透视投影矩阵使用OpenGL的环境但又进行了简化,值得一提。
本文努力让读者清楚地了解D3D与M3G透视投影矩阵的原理,从而能够知道它与OpenGL的一些差别,为构建跨API的图形引擎打好基础。
需要指出的一点是为了完全理解本文的内容,请读者先理解上一篇文章《深入探索透视投影变换》的内容,因为OpenGL和它们的透视投影矩阵的原理非常相似,因此这里不会像上一篇文章从基础知识讲起,而是对比它们的差异来推导变换矩阵。
我们开始!OpenGL与D3D的基本差异前面提到,不同API的基本差异导致了最终变换矩阵的不同,而导致OpenGL和D3D的透视投影矩阵不同的原因有以下几个:(1) OpenGL默认使用右手坐标系,而D3D 默认使用左手坐标系。
(2) OpenGL使用列向量矩阵乘法而D3D使用行向量矩阵乘法。
(3) OpenGL的CVV的Z范围是[-1, 1],D3D的CVV的Z范围是[0, 1]。
以上这些差异导致了最终OpenGL和D3D的透视投影矩阵的不同。
透视投影矩阵公式
透视投影矩阵公式透视投影是计算机图形学中常用的一种技术,通过透视投影矩阵,可以将三维物体映射到二维平面上,模拟出真实世界中的透视效果。
本文将介绍透视投影矩阵的原理和常用公式。
一、透视投影的原理在计算机图形学中,透视投影是通过将物体的三维坐标转换为二维坐标来实现的。
透视投影时,离观察者较近的物体会比较大,而离观察者较远的物体会比较小,从而产生了一种近大远小的效果,使画面更加逼真。
透视投影的原理可以用一个简单的模型来描述:将观察者看作位于原点的摄像机,物体位于摄像机前方的三维空间中。
当光线从物体上的某一点射入摄像机中时,两者之间形成一条射线。
我们需要找到摄像机对应的二维平面上的投影点。
二、透视投影矩阵公式透视投影矩阵是将三维坐标转换为二维坐标的关键工具。
下面是透视投影矩阵的公式:```P = M * V * P * N * v```其中,P表示投影后的二维坐标,M表示模型坐标系到世界坐标系的转换矩阵,V表示世界坐标系到相机坐标系的转换矩阵,P表示相机坐标系到裁剪坐标系的转换矩阵,N表示裁剪坐标系到标准化坐标系的转换矩阵,v表示标准化坐标系到屏幕坐标系的转换矩阵。
三、各矩阵的作用和计算方式1. 模型矩阵(M)模型矩阵将物体从局部坐标系转换到世界坐标系。
它包括平移、旋转和缩放等变换。
计算模型矩阵时,需要考虑物体的位置、旋转角度和尺寸等参数。
2. 视图矩阵(V)视图矩阵将世界坐标系转换为相机坐标系。
相机的位置和方向决定了视图矩阵的值。
通过平移相机的位置和旋转相机的方向,可以得到视图矩阵。
3. 投影矩阵(P)投影矩阵将相机坐标系转换为裁剪坐标系。
投影矩阵有两种类型:正交投影和透视投影。
正交投影用于制作二维游戏或平面设计等,而透视投影则用于模拟真实世界的透视效果。
4. 规范化矩阵(N)规范化矩阵将裁剪坐标系转换为标准化坐标系。
裁剪坐标系的坐标范围是(-1,1),而标准化坐标系的坐标范围是(0,1)。
规范化矩阵通过缩放和偏移来将裁剪坐标系的范围转换为标准化坐标系的范围。
透视深度文档
透视深度简介透视深度(Perspective Depth)是指在视觉中通过给定的物体在三维空间中的位置,以及相机的位置,计算物体在二维图像中的大小和位置关系,从而使得图像看起来更加真实和具有立体感。
在计算机图形学和计算机视觉中,透视深度是一个重要的概念,对于生成逼真的三维效果和图像重建非常有帮助。
透视投影透视深度的基础是透视投影(Perspective Projection)。
透视投影是一种将三维场景投影到二维平面上的方法,在透视投影中,远处的物体看起来比近处的物体更小。
透视投影模拟了人眼在观察远距物体时的视觉效果。
在透视投影中,相机位置和视角是决定透视深度的重要因素。
相机位置决定了从哪个视点去观察场景,视角则决定了观察场景时的视野范围。
在计算机图形学中,通常使用透视投影矩阵来完成透视投影的计算。
透视深度的计算在计算机图形学中,透视深度的计算通常通过以下步骤完成:1.确定相机位置和视角。
2.根据相机位置和视角计算透视投影矩阵。
3.根据物体在三维空间的位置,将物体的顶点坐标通过透视投影矩阵转换到相机坐标系中。
4.将相机坐标系中的物体坐标转换到屏幕坐标系中,得到物体在屏幕上的位置和大小。
需要注意的是,透视深度的计算并不仅仅涉及到透视投影,还包括了其他因素的考虑,例如物体之间的遮挡关系和光照效果等。
应用领域透视深度广泛应用于计算机图形学和计算机视觉领域。
在计算机图形学中,透视深度是创建逼真的三维场景的关键技术之一。
通过透视深度的计算,可以显示出不同距离的物体之间的大小和位置关系,从而使得图像更加真实。
在计算机游戏和虚拟现实中,透视深度的应用则更加突出。
在计算机视觉中,透视深度常用于物体重建和立体视觉计算。
通过计算物体在图像中的透视深度,可以还原出物体在三维空间中的形状和位置信息。
这对于机器人导航、增强现实和三维重建等应用具有重要意义。
结论透视深度是一种通过计算物体在二维图像中的大小和位置关系,使得图像具有立体感的技术。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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] 中。
你想到了什么?哈,就是我们简单的线性插值,你都已经掌握了!我们解决掉它:则我们得到了最终的投影点:下面要做的就是从这个新形式出发反推出下一个版本的透视投影矩阵。