透视投影(perspectiveprojection)变换推导

合集下载

投影转换公式范文

投影转换公式范文

投影转换公式范文投影转换的目的是将三维物体的形状、尺寸、方向等信息映射到二维平面上,以便于在计算机屏幕上显示或进行进一步处理。

其中最常用的投影转换有透视投影和平行投影两种。

透视投影是模拟人眼看到的投影效果。

当物体离观察者比较近时,离观察者越近的物体映射到平面上的尺寸越大;当物体离观察者比较远时,离观察者越远的物体映射到平面上的尺寸越小。

透视投影的数学表达式如下:```x'=(x*f)/(z+d)y'=(y*f)/(z+d)```其中,(x,y,z)是三维物体上的一个点,(x',y')是其在二维平面上的投影点,f是焦距,d是观察者到投影平面的距离。

平行投影是保持物体的形状和尺寸不变,将其映射到平行于观察视线的平面上。

平行投影的数学表达式如下:```x' = x + dxy' = y + dy```其中,(x, y, z)是三维物体上的一个点,(x', y')是其在二维平面上的投影点,dx和dy是投影平面的偏移量,用于控制投影的位置。

除了透视投影和平行投影,还有其他各种形式的投影转换公式。

比如等角投影、斜投影、正射投影等等。

不同的投影转换公式适用于不同的应用场景和需求。

在计算机图形学中,投影转换通常是在视景体的局部坐标系中进行的。

视景体是一个六面体,用于限定需要显示的物体范围。

常见的视景体包括矩形视景体、正交视景体、透视视景体等。

在进行投影转换时,需要将三维物体先从局部坐标系转换到世界坐标系,然后再进行投影转换到二维平面上。

投影转换还涉及到一些常见的问题和技巧,比如消失点的计算、背面剔除、深度缓冲等。

这些问题和技巧都是为了提高投影转换的效果和速度,使得二维平面上的投影能够尽可能地还原出三维物体的形状和尺寸。

总结起来,投影转换公式是将三维空间中的点映射到二维平面上的数学公式。

不同的投影转换公式适用于不同的应用场景和需求。

投影转换涉及到视景体、局部坐标系、世界坐标系等概念。

CG透视变换推导汇总

CG透视变换推导汇总

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

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

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

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

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

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

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

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

有了它们,我们才不至于在理解透视投影变换的过程中迷失方向(这里会使用到向量几何、矩阵的部分知识,如果你对此不是很熟悉,可以参考可以找到一组坐标(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)是坐标系下表达一个向量和点的不同表达方式。

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

计算机图形学中的透视变换算法研究

计算机图形学中的透视变换算法研究

计算机图形学中的透视变换算法研究计算机图形学是一门应用广泛且发展迅速的学科,其中透视变换算法是其中的重要内容之一。

透视变换算法是用于将三维场景投影到二维平面上的一种技术,可以用于制作三维建模、游戏开发、虚拟现实等诸多场景。

本文将对透视变换算法进行深入探讨。

一、透视变换的基本原理透视变换是一种投影变换,实际上是将原本三维的场景投影到一个二维平面上,使得相机所看到的场景保持透视关系。

我们以一个简单的场景为例,来说明透视变换的基本原理。

图一:一个简单的场景如图一所示,我们需要将这个三维场景投影到一个平面上。

我们假设相机位置在(0,0,0),相机朝向为Z轴正方向。

首先,我们需要将相机坐标系转换为世界坐标系。

我们可以通过相机的位置、视线方向、以及上方向来得到相机坐标系的X、Y、Z轴方向向量,进而得到相机矩阵(Camera Matrix)。

接下来,我们需要将物体坐标系转换为相机坐标系。

我们可以通过将物体的顶点坐标乘以一个变换矩阵(Model Matrix),将物体从模型空间转换到世界空间,然后将其乘以相机矩阵,将其从世界空间转换到相机空间。

最后,我们对相机空间中的坐标进行透视变换,得到最终的图像。

透视变换的过程如下:(1) 将相机空间中的坐标投影到相机平面上。

这一步称作投影变换(Projection transformation),通常使用投影矩阵(Projection Matrix)来实现。

(2) 对投影后的坐标进行归一化(Normalization)处理,使得所有坐标的Z值都等于1。

(3) 将归一化后的坐标变换到屏幕空间(Screen Space)。

屏幕空间是二维的,并且以屏幕左上角为原点,以屏幕右下角为坐标系的正方向。

这一步通常使用视口变换(Viewport Transformation)来实现。

二、透视变换算法的具体实现透视变换算法是计算机图形学中的重要内容之一,其核心在于将三维场景转换为二维图像。

透视投影的原理和实现

透视投影的原理和实现

透视投影的原理和实现透视投影的原理和实现摘要:透视投影是3D渲染的基本概念,也是3D程序设计的基础。

掌握透视投影的原理对于深⼊理解其他3D渲染管线具有重要作⽤。

本⽂详细介绍了透视投影的原理和算法实现,包括透视投影的标准模型、⼀般模型和屏幕坐标变换等,并通过VC实现了⼀个演⽰程序。

1 概述在计算机三维图像中,投影可以看作是⼀种将三维坐标变换为⼆维坐标的⽅法,常⽤到的有正交投影和透视投影。

正交投影多⽤于三维健模,透视投影则由于和⼈的视觉系统相似,多⽤于在⼆维平⾯中对三维世界的呈现。

透视投影(Perspective Projection)是为了获得接近真实三维物体的视觉效果⽽在⼆维的纸或者画布平⾯上绘图或者渲染的⼀种⽅法,也称为透视图[1]。

它具有消失感、距离感、相同⼤⼩的形体呈现出有规律的变化等⼀系列的透视特性,能逼真地反映形体的空间形象。

透视投影通常⽤于动画、视觉仿真以及其它许多具有真实性反映的⽅⾯。

2 透视投影的原理基本的透视投影模型由视点E和视平⾯P两部分构成(要求 E不在平⾯P上)。

视点可以认为是观察者的位置,也是观察三维世界的⾓度。

视平⾯就是渲染三维对象透视图的⼆维平⾯。

如图1所⽰。

对于世界中的任⼀点X,构造⼀条起点为E并经过X点的射线R,R与平⾯P的交点Xp即是X点的透视投影结果。

三维世界的物体可以看作是由点集合 { Xi} 构成的,这样依次构造起点为E,并经过点Xi的射线Ri,这些射线与视平⾯P的交点集合便是三维世界在当前视点的透视图,如图2所⽰。

图1 透视投影的基本模型图2 透视图成像原理基本透视投影模型对视点E的位置和视平⾯P的⼤⼩都没有限制,只要视点不在视平⾯上即可。

P⽆限⼤只适⽤于理论分析,实际情况总是限定P为⼀定⼤⼩的矩形平⾯,透视结果位于P之外的透视结果将被裁减。

可以想象视平⾯为透明的玻璃窗,视点为玻璃窗前的观察者,观察者透过玻璃窗看到的外部世界,便等同于外部世界在玻璃窗上的透视投影(总感觉不是很恰当,但想不出更好的⽐喻了)。

透视投影(Perspective_Projection)变换推导

透视投影(Perspective_Projection)变换推导

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

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

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

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

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

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

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

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

有了它们,我们才不至于在理解透视投影变换的过程中迷失方向(这里会使用到向量几何、矩阵的部分知识,如果你对此不是很熟悉,可以参考可以找到一组坐标(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)是坐标系下表达一个向量和点的不同表达方式。

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

深度探讨透视投影坐标系

深度探讨透视投影坐标系

3d图形程序,就一定会做坐标变换.而谈到坐标变换,就不得不提起投影变换,因为它是所有变换中最不容易弄懂的。

但有趣的是,各种关于透视变换的文档却依然是简之又简,甚至还有前后矛盾的地方。

看来如此这般光景,想要弄清楚它,非得自己动手不可了。

所以在下面的文章里,作者尝试推导一遍这个难缠的透视变换,然后把它套用到DX和PS2lib 的实例中去。

1.一般概念所谓透视投影变换,就是view 空间到project 空间的带透视性质的坐标变换步骤(这两个空间的定义可以参考其他文档和书籍).我们首先来考虑它应该具有那些变换性质。

很显然,它至少要保证我们在view空间中所有处于可视范围内的点通过变换之后,统统落在project空间的可视区域内。

好极了,我们就从这里着手—-先来看看两个空间的可视区域.由于是透视变换,view空间中的可见范围既是常说的视平截体(view frustum).如图,(图1)它就是由前后两个截面截成的这个棱台。

从view空间的x正半轴看过去是下图这个样子。

(图2)接下来是project空间的可视范围。

这个空间应当是处于你所见到的屏幕上。

实际上将屏幕表面视作project空间的xoy平面,再加一条垂直屏幕向里(或向外)的z轴(这取决于你的坐标系是左手系还是右手系),这样就构成了我们想要的坐标系。

好了,现在我们可以用视口(view port)的大小来描述这个可视范围了.比如说全屏幕640*480的分辨率,原点在屏幕中心,那我们得到的可视区域为一个长方体,它如下图(a)所示。

(图3)但是,这样会带来一些设备相关性而分散我们的注意力,所以不妨先向DirectX文档学学,将project空间的可视范围定义为x∈[—1,1], y∈[-1,1],z∈[0,1]的一个立方体(上图b)。

这实际上可看作一个中间坐标系,从这个坐标系到上面我们由视口得出的坐标系,只需要对三个轴向做一些放缩和平移操作即可。

另外,这个project坐标系对clip操作来说,也是比较方便的。

opencv 透视变换原理

opencv 透视变换原理

透视变换(Perspective Transformation)是OpenCV中的一种变换方法,其原理是通过找到原始平面和目标平面之间的转换矩阵来实现的。

这个转换矩阵由四个点的坐标对确定,其中原始平面上的四个点对应于目标平面上的四个点。

具体来说,首先需要手动标记原始图像上的四个点,或者使用计算机视觉中的特征检测算法来自动找到这四个点。

接下来,确定目标平面上的四个点的坐标。

通常,目标平面是一个矩形或正方形,因此可以通过定义一个矩形或正方形的四个顶点来确定目标平面上的四个点的坐标。

一旦获得了原始平面和目标平面上的四个点的坐标,就可以使用这些坐标来计算透视变换的转换矩阵。

OpenCV提供了一个函数“cv2.getPerspectiveTransform()”来计算这个转换矩阵。

这个函数需要原始平面上的四个点的坐标和目标平面上的四个点的坐标作为输入,并返回一个3x3的转换矩阵。

有了转换矩阵,就可以使用OpenCV中的另一个函数“cv2.warpPerspective()”来实施透视变换。

这个函数需要原始图像、转换矩阵和目标图像的大小作为输入,并返回一个经过透视变换的图像。

透视变换的过程可以总结为以下几个步骤:1)找到原始平面上的四个点的坐标;2)找到目标平面上的四个点的坐标;3)使用这些坐标来计算透视变换的转换矩阵;4)使用转换矩阵对原始图像进行透视变换。

透视变换在计算机视觉中有广泛的应用,其中一个常见的应用是校正图像中的透视畸变,例如校正从一个角度拍摄的文档图像。

通过应用透视变换,可以使文档图像看起来像是平面上的正视图。

透视变换也可以用于图像合成,将一个平面上的图像合成到另一个平面上的图像中。

透视投影矩阵推导

透视投影矩阵推导

在上一篇文章中我们讨论了透视投影变换的原理,分析了 OPe nGL 所使用的透视 投影矩阵的生成方法。

正如我们所说,不同的图形APl 因为左右手坐标系、行向 量列向量矩阵以及变换范围等等的不同导致了矩阵的差异,可以有几十个不同的 透视投影矩阵,但它们的原理大同小异。

这次我们准备讨论一下 DireCt3D (以 下简称D3D 以及J2ME 平台上的JSR184(M3G (以下简称M3G 的透视投影矩 阵,主要出于以下几个目的: (1)我们在写图形引擎的时候需要采用不同的图形 API 实现,当前主要是OPenGL 和D3D 虽然二者的推导极为相似,但 D3D 的自身特点导致了一些地 方仍然需要澄清。

(2) DireCtX SDK 的手册中有关于透视投影矩阵的一些说明,但并不详 细,甚至有一些错误,从而使初学者理解起来变得困难, 而这正是本文写作的目 的。

(3) M3G 是J2ME 平台上的3D 开发包,采用了 OPenG!作为底层标准进 行封装。

它的透视投影矩阵使用 OPe nG 啲环境但又进行了简化,值得一提。

本文努力让读者清楚地了解D3D 与 M3G 透视投影矩阵的原理,从而能够知道它与 OPenG 啲一些差别,为构建跨 API 的图形引擎打好基础。

需要指出的一点是为 了完全理解本文的内容,请读者先理解上一篇文章 《深入探索透视投影变换》的 内容,因为OPenGL 和它们的透视投影矩阵的原理非常相似,因此这里不会像上 一篇文章从基础知识讲起,而是对比它们的差异来推导变换矩阵。

我们开始!OPenGL ⅛ D3D 的基本差异前面提到,不同API 的基本差异导致了最终变换矩阵的不同,而导致OPenGL 和D3D 的透视投影矩阵不同的原因有以下几个:(1) OPe nGL 默认使用右手坐标系,而 D3D 默认使用左手坐标系OPerLGL ri^iUxandeci CoOrdinate system DmD handed coordinate SyStemOPe nGL 使用列向量矩阵乘法而 D3D 使用行向量矩阵乘法(3) OPenGL 的 CVV 勺 Z 范围是[-1, 1] , D3D 的 CVV 勺 Z 范围是[0, 1]以上这些差异导致了最终OPenGL 和D3D 的透视投影矩阵的不同。

透视投影变换的推导过程-3D基础知识

透视投影变换的推导过程-3D基础知识

透视投影变换的推导过程-3D基础知识感觉很多书上都没讲清楚透视投影变换的推导过程,自己推导了下,以前一直含糊的关于方形/非方形的视平面和屏幕的宽高比的问题也有了答案.本文组织如下:1.相机空间到视平面的变换2.视平面到屏幕的变换3.综合4.一般情形1.相机空间到视平面的变换* p (xc,0, zc)/ |/ |/ |X |/ |^ *p |(xp,0,zp)| / | || / | || / | |C(cam) |/ | |--------*----|----*------------->Z0 dx zc(X-Z平面的投影示图)a.透视投影一般的视景体为棱台,相机空间的物体会投影到视平面z=d,这里考虑左手坐标系,矩阵使用行优先方式。

如图所示,由相似三角形知识可知相机空间中的物体投影到视平面上的坐标为:xp = xc*(dx/zc)yp = yc*(dy/zc)其中,xc,yc,zc为相机空间坐标,xp,yp,zp为视平面坐标,dx,dy为x,y轴向的视距view distance,视平面到camera的距离,故相机空间投影到视平面上的矩阵Tcp为:|dx 0 0 0 ||0 dy 0 0 ||0 0 1 1 ||0 0 0 0 |(验证:T cp右乘点p(xc,yc,zc,1)得点p (xc*dx, yc*dy, zc, zc),转换为3D坐标为(xc*dx/zc, yc*dy/zc, 1),正确。

)*************************************************************** *****注:因为转换过程中点使用的是4D齐次坐标,所以最后需转换为3D坐标。

4D齐次坐标(x,y,z,w)转换为3D坐标的方法为除以w分量,即对应3D坐标为(x/w,y/w,z/w)。

*************************************************************** *****考虑dx/zc和dy/zc项,如果dx != dy,则投影后x,y的比例会发生变化(原因:投影前坐标比例为xc/yc,投影后为xp/yp = xc*(dx/zc)/yc*(dy/zc) = xc*dx/yc*dy),从而投影后的图像的x,y比例会发生变形。

透视投影的详细解释(转载)

透视投影的详细解释(转载)

透视投影的详细解释(转载)本⽂乃<投影矩阵的推导>译⽂,原⽂地址为:译者: 流星上的潴如需转载,请注明出处,感谢!在3D图形程序的基本矩阵变换中,投影矩阵是其中⽐较复杂的。

平移和缩放浏览⼀下就能理解,旋转矩阵只要掌握了三⾓函数知识也可以理解,但投影矩阵有点棘⼿。

如果你曾经看过投影矩阵,你会发现你的常识不⾜以告诉你它是怎么来的。

⽽且,我在⽹上还未看到许多关于如何推导投影矩阵的教程资源。

本⽂的话题就是如何推导投影矩阵。

对于刚刚开始接触3D图形的⼈,我应该指出,理解投影矩阵如何推导可能是我们对于数学的好奇⼼,它不是必须的。

你可以只⽤公式,并且如果你⽤像Direct3D那样的图形API,你甚⾄都不需要使⽤公式,图形API会为你构建⼀个投影矩阵。

所以,如果本⽂看起来有点难,不要害怕。

只要你理解了投影矩阵做了什么,你没必要在你不想的情况下关注它是怎么做的。

本⽂是给那些想了解更多的程序员的。

概述: 什么是投影?计算机显⽰器是⼀个⼆维表⾯,所以如果你想显⽰三维图像,你需要⼀种⽅法把3D⼏何体转换成⼀种可作为⼆维图像渲染的形式。

那也正是投影做的。

拿⼀个简单的例⼦来说,⼀种把3D对象投影到2D表⾯的⽅法是简单的把每个坐标点的z坐标丢弃。

对⽴⽅体来说,看上去可能像图1:图1: 通过丢弃Z坐标投影到XY平⾯当然,这过于简单,并且在⼤多数情况下不是特别有⽤。

⾸先,根本不会投影到⼀个平⾯上;相反,投影公式将变换你的⼏何体到⼀个新的空间体中,称为规范视域体(canonical view volume),规范视域体的精确坐标可能在不同的图形API之间互不相同,但作为讨论起见,把它认为是从(-1, -1, 0)延伸⾄(1, 1, 1)的盒⼦,这也是Direct3D中使⽤的。

⼀旦所有顶点被映射到规范视域体,只有它们的x和y坐标被⽤于映射到屏幕上。

这并不代表z坐标是⽆⽤的,它通常被深度缓冲⽤于可见度测试。

这就是为什么变换到⼀个新的空间体中,⽽不是投影到⼀个平⾯上。

D3D,OPENGL视点变换矩阵,投影矩阵(clip space)的推导过程

D3D,OPENGL视点变换矩阵,投影矩阵(clip space)的推导过程

D3D,OPENGL视点变换矩阵,投影矩阵(clip space)的推导过程此处推导D3D的变换矩阵(采用行向量,行主序存储,右乘矩阵),然后通过调整得出OPENGL中的变换矩阵1. 视点变换矩阵的推导。

根据给定的眼睛位置(position),朝向(orientation)来计算最终的视点变换矩阵。

投影矩阵的计算见Frustum类计算过程大致如下:设Q代表从世界空间坐标系到眼睛空间坐标系的变换矩阵,V代表一个点故VQ=VMT.其中T:从世界空间坐标系到眼睛空间坐标系的平移变换矩阵,M:从世界空间坐标系到眼睛空间坐标系的旋转变换矩阵。

则Q1-代表视点变换矩阵Q1-=MT1-= T1-M1-由于M是正交矩阵,故V=Q1-= T1-M T其中M=[Rx Ry Rz 0], T= [1 0 0 0][Ux Uy Uz 0] [0 1 0 0][Dx Dy Dz 0] [0 0 1 0 ][0 0 0 1] [Tx Ty Tz 1 ]故V=Q1-= [1 0 0 0] * [Rx Ux Dx 0][0 1 0 0] [Ry Uy Dy 0][0 0 1 0] [Rz Uz Dz 0][-Tx –Ty –Tz 1] [0 0 0 1]= [ Rx Ux Dx 0 ][ Ry Uy Dy 0 ][ Rz Uz Dz 0 ][ Wx Wy Wz 1 ]其中W = - Pos* M T对于OPENGL,则有:V=Q1-=M T T1-其中M=[Rx Ux -Dx 0][Ry Uy -Dy 0][Rz Uz -Dz 0][0 0 0 1]T= [1 0 0 Tx][ 0 1 0 Ty][0 0 1 Tz][0 0 0 1 ]故V=Q1 =[Rx Ry Rz Wx][Ux Uy Uz Wy][-Dx –Dy –Dz Wz][0 0 0 1]其中W = -M T* Pos2. 透视投影(perspective projection)矩阵的推导假设(X,Y,Z,1)为一个点,投影后的点为(Xp,Yp,Zp,1)则根据相似三角形原理,有:Xp/X=Yp/Y=N/Z所以:Xp=N*X/ZYp=N*Y/ZZp=N故投影变换可以表示为齐次坐标形式:(Xp,Yp,Zp,1)=(X,Y,Z,Z/N)对于X和Y :在进行上一步变换后,还要进一步做裁剪变换,即将投影后的坐标映射为[-1,1].即:(X*N/Z,Y*N/Z) : ([l,r],[b,t]) ([-1,1],[-1,1])即:(X*N/Z-l)/(r-l)=(s+1)/2由此可以得到:对于Z,变换稍微复杂一些。

深度探讨透视投坐标系

深度探讨透视投坐标系

深度探讨透视投坐标系————————————————————————————————作者:————————————————————————————————日期:3d图形程序,就一定会做坐标变换。

而谈到坐标变换,就不得不提起投影变换,因为它是所有变换中最不容易弄懂的。

但有趣的是,各种关于透视变换的文档却依然是简之又简,甚至还有前后矛盾的地方。

看来如此这般光景,想要弄清楚它,非得自己动手不可了。

所以在下面的文章里,作者尝试推导一遍这个难缠的透视变换,然后把它套用到DX和PS2lib 的实例中去。

1.一般概念所谓透视投影变换,就是view 空间到project 空间的带透视性质的坐标变换步骤(这两个空间的定义可以参考其他文档和书籍)。

我们首先来考虑它应该具有那些变换性质。

很显然,它至少要保证我们在view空间中所有处于可视范围内的点通过变换之后,统统落在project空间的可视区域内。

好极了,我们就从这里着手——先来看看两个空间的可视区域。

由于是透视变换,view空间中的可见范围既是常说的视平截体(view frustum)。

如图,(图1)它就是由前后两个截面截成的这个棱台。

从view空间的x正半轴看过去是下图这个样子。

(图2)接下来是project空间的可视范围。

这个空间应当是处于你所见到的屏幕上。

实际上将屏幕表面视作project空间的xoy平面,再加一条垂直屏幕向里(或向外)的z轴(这取决于你的坐标系是左手系还是右手系),这样就构成了我们想要的坐标系。

好了,现在我们可以用视口(view port)的大小来描述这个可视范围了。

比如说全屏幕640*480的分辨率,原点在屏幕中心,那我们得到的可视区域为一个长方体,它如下图(a)所示。

(图3)但是,这样会带来一些设备相关性而分散我们的注意力,所以不妨先向DirectX文档学学,将project空间的可视范围定义为x∈[-1,1], y∈[-1,1], z∈[0,1]的一个立方体(上图b)。

透视变换算法

透视变换算法

透视变换算法透视变换算法(Perspective Transformation)是一种图像处理技术,用于将二维平面上的图像投影到三维空间中的透视视图。

透视变换可以改变图像的形状和角度,使得图像具有更好的可视性和逼真感。

透视变换在计算机视觉和机器视觉领域广泛应用,例如摄影术中的景深效果、计算机图形学中的三维模型渲染、虚拟现实和增强现实技术等。

本文将介绍透视变换算法的原理、应用和实现方法。

一、原理介绍透视变换是基于投影变换的一种特殊形式,它可以将一个二维平面上的图像投影到三维空间中的透视视角。

透视变换的核心思想是通过定义四个控制点,确定一个透视变换矩阵,然后将原始图像中的每一个像素点根据变换矩阵进行映射,从而得到处理后的图像。

透视变换的公式如下:[ x' ] [ m₁ m₂ m₃ ] [ x ][ y' ] = [ m₄ m₅ m₆ ] * [ y ][ w' ] [ m₇ m₈ m₉ ] [ w ]其中,(x, y)是原图像中的坐标,(x', y')是变换后图像中的坐标,(m₁, m₂, m₃, m₄, m₅, m₆, m₇, m₈, m₉)是待定参数。

通过求解这九个未知参数,就可以得到透视变换矩阵,进而将原始图像进行变换。

二、应用领域透视变换广泛应用于以下几个领域:1. 摄影术中的景深效果:透视变换可以将相机拍摄的平面图像变换成透视图像,从而增强图片的逼真感和立体感。

2. 计算机图形学中的三维模型渲染:透视变换可以用于将三维模型投影到二维屏幕上,实现真实感的渲染效果。

3. 虚拟现实和增强现实技术:透视变换可以用于将虚拟对象或信息叠加在真实世界中的图像上,实现增强现实的效果。

4. 地图投影:透视变换可以用于将球面地图投影到平面上,从而方便地展示地理信息。

三、实现方法透视变换的实现方法通常包括以下几个步骤:1. 确定控制点:选择图像中的四个控制点,可以是四个角点或者其他特定的位置点。

透视投影的坐标转换与数学推导

透视投影的坐标转换与数学推导

透视投影的坐标转换与数学推导坐标转换管线在处理顶点数据时需要经过多个坐标系的转换。

1.通过model与view矩阵先将其变换到世界坐标系中,再将其变换到观察坐标系中。

从⽽⽅便后续处理。

2.经透射投影,将3D坐标映射到视平⾯,完成从3D到2D的变换,从⽽在后续可转换为在屏幕显⽰的2D坐标。

3.透射投影将顶点转换到了单位⽴⽅体中,变换到标准化设备坐标系。

4.⽽标准化设备坐标系中的物体常常会产⽣形变,为恢复物体原⽐例,将其进⾏视⼝变换,转换到最后显⽰的屏幕坐标系中。

以上为顶点在坐标转换中的⼤致流程,其中包含的很多细节部分会在下⾯结合透射投影进⾏详细分析。

逻辑分析图 1 图 2 图 3 图41.转换:我们输⼊在程序中的坐标都是3D,⽽最终显⽰在屏幕上的只能是2D。

所以可想⽽知,需要⼀个过程来将3D坐标映射到我们的2D视平⾯上。

只有这样我们才能通过显⽰器去观看。

2.观察:如上述图1,我们在观察⾯上所观察到的正是观察点E与物体实际坐标的连线在视平⾯P上的交点,其⽐例也可形成近⼤远⼩的现实感。

图2可直观的感受。

3.问题:根据学过的知识,显然这⼀交点可以很轻松的通过相似三⾓形来求得。

但问题是,我们需要获得多⼤范围内的物体?即限定观察空间。

不在观察空间内的物体⼜该怎样去处理?即裁剪。

4.观察空间:设定近平⾯,远平⾯,和观察⾓度,来得到⼀个视椎体(frustum)。

⽽我们也常常将近平⾯作为视平⾯。

如图3。

5.裁剪:裁剪掉视锥体以外的顶点,只保留以内的。

若直接对视锥体裁剪,因平⾯的倾斜也会导致计算量过⼤,所以采⽤将其映射到单位⽴⽅体中(CVV),此时都为垂直平⾯,并且在映射过程中,顶点与视锥体的关系不变,在视锥体外的仍然在视锥体外。

裁剪时只需判定⼀个坐标即可,⼤⼤减少了计算量。

如图4。

6.恢复:但是在映射到CVV的时候,顶点间的⽐例产⽣了变化,物体常常产⽣形变,所以在映射到屏幕坐标系时,必须对其进⾏⽐例恢复。

采⽤的⽅法是:将近平⾯(即视平⾯)的宽⾼⽐例⼀开始就调整为与视⼝宽⾼⽐相同。

透视投影矩阵的推导

透视投影矩阵的推导

透视投影矩阵的推导视锥体如图,近截⾯与远截⾯之间构成的这个四棱台就是视锥体,⽽透视投影矩阵的任务就是把位于视锥体内的物体的顶点X,Y,Z坐标映射到[-1,1]范围。

这就相当于把这个四棱台扭曲变形成⼀个⽴⽅体。

这个⽴⽅体叫做规则观察体 (Canonical View Volume, CVV)。

如下图:变换⽅法或规则:如下图,有⼀点P,位于视锥体内,设坐标为(x,y,z).分别对x,y坐标和z坐标的变换到[-1,1]的⽅式进⾏讨论:1.x,y坐标的变换⽅式:(1)连接视点eye与P点与近裁剪⾯交于P’点(2)设近裁剪⾯的宽度为W,⾼度为H,P’点的x坐标范围是[-W/2,W/2],y坐标范围是[-H/2,H/2],然后分别线性映射⾄[-1,1]内即可。

2.z坐标的变换⽅式z坐标的范围是N⾄F,需要映射到[-1,1],映射⽅法暂时按下,不做想法。

透视投影函数形式void Matrix4X4::initPersProjMatrix(float FOV, const float aspect, float zNear, float zFar) 透视投影矩阵构建函数的参数:Fov:纵向的视⾓⼤⼩aspect:裁剪⾯的宽⾼⽐zNear:近裁剪⾯离摄像机的距离,图中的nzFar:远裁剪⾯离摄像机的距离,图中的f通过这⼏个参数和三⾓函数的数学知识可以求得近裁剪⾯的⾼度,参考上图:求得点P在近裁剪⾯的投影点P’的坐标根据相似三⾓形对应边长度的⽐率相同,由图可得其中x’,y’的范围沿原点对称,只要将他们分别除以W/2,H/2,即可以使范围位于[-1,1]内。

前⾯已求得W,H,因此:假设我们最后需要的坐标点P’’即是推导矩阵然后为了⾃动化的得到这个结果,我们使⽤矩阵这种数学⼯具,将⼀个矩阵乘以⼀个向量,得到⼀个新的向量,使得我们所有的运算步骤和运算数据蕴藏在矩阵和乘法中。

下⾯的⼯作就是寻找到⼀个矩阵使得:我们发现求解很难找出合适的m00、m02,因为左边x和z是以加法的形式相邻,右边z确成为了x的分母。

透视变换的原理

透视变换的原理

透视变换(Perspective Transformation)是一种在二维或三维空间中模拟真实世界中观察物体时产生的视觉效果的数学变换,它反映了图像从一个视点投影到另一个视点的过程。

透视变换的基本原理基于以下几点:
1. 仿射特性:透视变换首先包含了仿射变换的属性,即平移、旋转和缩放,这些基本操作可以改变图像中的点的位置关系。

2. 深度感知:透视变换进一步考虑了深度信息对图像中各点的影响。

在现实世界中,离观察者越远的物体看起来越小,并且它们的相对位置会根据距离的不同而发生变形。

这种现象称为透视收缩(Perspective Foreshortening)。

3. 透视投射:在透视投影下,所有视线(从场景中的每个点到观察者的视线)汇聚于一点,这个点称为消失点(Vanishing Point)。

平行线在无限远处也会交汇于相应的消失点。

4. 数学模型:透视变换可以用一个或多个矩阵运算来表示,通过设置适当的变换参数(通常由四个角点之间的对应关系确定),可以精确地描述三维空间坐标如何映射到二维图像平面。

5. 变换公式:在计算机图形学中,透视变换通常涉及一个4x4的齐次坐标变换矩阵,通过该矩阵将三维坐标向量转换为经过透视投影后屏幕上的二维坐标。

例。

简而言之,透视变换利用几何与代数方法捕捉并模仿人类视觉系统中因物体距离变化导致的大小和形状的变化,从而在数字图像处理和计算机视觉领域得到广泛应用。

一点透视变换矩阵推导

一点透视变换矩阵推导

一点透视变换矩阵推导透视变换矩阵是用来进行透视投影的数学工具。

在三维计算机图形学中,透视投影是一种模拟人眼观察远近物体时产生的透视效果的方法。

透视变换矩阵的推导涉及到线性代数和几何学的知识。

首先,我们考虑一个简化的情况,即相机位于世界坐标系的原点,观察方向与Z轴平行,投影平面位于Z=1处。

在这种情况下,透视投影可以用一个简单的公式来表示,\[ (x_p, y_p, z_p) =(\frac{x}{z}, \frac{y}{z}, 1) \]其中,\( (x_p, y_p, z_p) \) 是投影平面上的点的坐标,\( (x, y, z) \) 是相机坐标系中的点的坐标。

这个公式表示了在Z轴方向上的线性缩放,以及在X和Y轴方向上的透视除法。

现在考虑一般情况下的透视投影。

我们需要引入一个投影矩阵,它可以将相机坐标系中的点变换到投影平面上。

这个投影矩阵通常表示为4x4的矩阵,记作P。

为了推导透视变换矩阵,我们需要考虑相机的内参矩阵K,相机的外参矩阵R和T,以及相机坐标系中的点的坐标\( (X_c, Y_c,Z_c, 1) \)。

透视变换矩阵可以通过将相机坐标系中的点变换到裁剪坐标系中,再将裁剪坐标系中的点变换到屏幕坐标系中来推导。

透视变换矩阵的推导过程比较复杂,涉及到齐次坐标、投影平面的定义、透视除法等多个概念。

推导的细节可以参考计算机图形学的相关教材或者资料。

总的来说,透视变换矩阵是通过将相机坐标系中的点变换到投影平面上来实现透视投影效果的数学工具。

它涉及到线性代数、几何学和计算机图形学等多个领域的知识。

希望这个回答能够帮助你理解透视变换矩阵的推导过程。

vtk parallel projection 缩放原理

vtk parallel projection 缩放原理

vtk parallel projection 缩放原理VTK并行投影缩放原理VTK即可视化工具包(Visualization Toolkit),是一个功能强大的开源软件库,用于实时生成、处理和渲染2D和3D图形。

VTK中的并行投影缩放原理是指在并行计算模式下对图形进行透视投影和缩放的方法。

在本文中,我们将探讨VTK的并行投影缩放原理以及其如何实现。

投影是一种将三维对象映射到二维屏幕上的过程,它模拟了人眼观察物体时光线的路径。

VTK中的投影算法使用了透视投影(Perspective Projection)方法,它能够更加真实地模拟物体在眼睛前方的效果。

透视投影是将三维坐标系中的点映射到二维平面上的一种方法,它根据观察者的位置和朝向,以及距离观察者最近的物体的位置来确定物体在平面上的位置和大小。

在并行计算中,VTK使用了MPI(Message Passing Interface)进行并行数据通信。

MPI是一种用于编写并行计算程序的标准,它定义了一套函数和语法规则,允许多个进程之间进行通信和数据交互。

VTK使用MPI将三维图像的不同部分分发到不同的进程上进行处理,然后将处理结果合并到单个图像中。

这种并行计算的方法可以显著提高处理大规模数据时的计算效率。

在VTK中,缩放是指改变对象在屏幕上的大小,从而使其更容易观察或与其他对象进行比较。

缩放的实现是通过缩放变换矩阵进行的。

缩放变换矩阵定义了沿x、y和z轴的缩放因子,它们确定了对象在每个轴上的缩放比例。

通过改变缩放因子的值,可以以固定的比例放大或缩小物体。

VTK中的并行投影缩放原理是将投影和缩放操作应用于并行计算模式下的图像数据。

首先,将待处理的图像数据分发到不同的进程上进行并行计算。

每个进程在本地进行投影和缩放操作,然后将处理后的图像数据通过MPI进行通信,合并到单个图像中。

最终,处理后的图像可以显示在屏幕上。

通过并行计算,VTK可以高效地处理大规模的图像数据,并快速生成需要的可视化结果。

opencv透视变换原理

opencv透视变换原理

opencv透视变换原理OpenCV中的透视变换(Perspective Transformation)是一种将图像从一种透视投影变换到另一种透视投影的技术。

在计算机视觉中,透视变换通常用于对图像进行校正或将图像投影到平面上,以便后续处理。

透视变换的原理基于投影几何学中的矩阵变换。

在OpenCV中,透视变换通过使用cv2.getPerspectiveTransform()函数来计算一个3x3的变换矩阵,该矩阵可以将原始图像中的四个点映射到目标图像中的四个点,从而实现透视变换。

具体来说,假设我们有原始图像中四个关键点的坐标(x1,y1)、(x2,y2)、(x3,y3)和(x4,y4),以及目标图像中对应的四个关键点的坐标(x1',y1')、(x2',y2')、(x3',y3')和(x4',y4'),那么我们可以使用cv2.getPerspectiveTransform()函数来计算透视变换矩阵:schemeCopyM =cv2.getPerspectiveTransform(np.float32([(x1,y1),(x2,y2),(x3,y3),(x4,y4)]),np.float32([(x1',y1'),(x2',y2'),(x3',y3'),(x4',y4')])) 然后,我们可以使用cv2.warpPerspective()函数将原始图像应用于透视变换:Copydst = cv2.warpPerspective(img, M, (width, height))其中,img是原始图像,M是透视变换矩阵,width和height是目标图像的宽度和高度。

总之,OpenCV中的透视变换是一种将图像从一种透视投影变换到另一种透视投影的技术,它基于投影几何学中的矩阵变换。

通过使用cv2.getPerspectiveTransform()函数计算透视变换矩阵,然后使用cv2.warpPerspective()函数将原始图像应用于透视变换。

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

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

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

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

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

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

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

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

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

有了它们,我们才不至于在理解透视投影变换的过程中迷失方向(这里会使用到向量几何、矩阵的部分知识,如果你对此不是很熟悉,可以参考可以找到一组坐标(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进行思考,把它写得在数学上更优雅一致,更易于程序处理。

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

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

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

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

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

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

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

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

接下来我们就求出a和b:这样我们就得到了透视投影矩阵的第一个版本:使用这个版本的透视投影矩阵可以从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]中。

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

注意到是经过透视除法的形式,而P’只变化了x和y分量的形式,az+b和-z是不变的,则我们做透视除法的逆处理——给P’每个分量乘上-z,得到而这个结果又是这么来的:则我们最终得到:M 就是最终的透视变换矩阵。

相机空间中的顶点,如果在视锥体中,则变换后就在CVV中。

如果在视锥体外,变换后就在CVV 外。

而CVV本身的规则性对于多边形的裁剪很有利。

OpenGL在构建透视投影矩阵的时候就使用了M的形式。

注意到M的最后一行不是(0 0 0 1)而是(0 0 -1 0),因此可以看出透视变换不是一种仿射变换,它是非线性的。

另外一点你可能已经想到,对于投影面来说,它的宽和高大多数情况下不同,即宽高比不为1,比如640/480。

而CVV的宽高是相同的,即宽高比永远是1。

这就造成了多边形的失真现象,比如一个投影面上的正方形在CVV的面上可能变成了一个长方形。

解决这个问题的方法就是在对多变形进行透视变换、裁剪、透视除法之后,在归一化的设备坐标(Normalized Device Coordinates)上进行的视口(viewport)变换中进行校正,它会把归一化的顶点之间按照和投影面上相同的比例变换到视口中,从而解除透视投影变换带来的失真现象。

相关文档
最新文档