`
hunankeda110
  • 浏览: 746580 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论
阅读更多
深入研究透视投影变换



    3D世界变换主要有世界变换、观察变化、投影变换。世界变换做的事情是把坐标从模型空间变换到世界空间,而观察变换是把坐标从世界空间变换到观察空间。3D世界里,所有的物体(包括相机等)都可以认为是3D模型,他们开始创建的时候都是处于自身坐标系内,渲染的时候,我们需要把这些模型从模型空间最终变换到统一的观察空间(相机自身空间)以方便进行裁剪等操作,最后,再经过透视投影变换将坐标变换到统一的立方体空间内。


    在这三种变换中,投影变换最麻烦,越是麻烦的事情,越是需要整理一下思路,下面是我在做“将屏幕坐标转换为三维射线”算法研究中的一些想法,记录下来以供将来察看.

   投影变换就做一件事:将锥形的观察空间转化为单位立方体空间。



    上图是观察空间,其中近裁剪面可以认为是计算机内的一个3D图形显示窗口或者屏幕,经过观察变化后,只有处于此锥形空间内的物体才会最终显示在用户面前。



   上图是观察空间的YZ图,我们据此推出坐标之间的关系:

y = ± z * tan(fov/2),x = y*Aspect





    上图是投影空间的可见范围,这个空间处于你所见到的屏幕上。实际上将屏幕表面视作投影空间的xoy平面,再加一条垂直屏幕向里(或向外)的z轴(这取决于你的坐标系是左手系还是右手系),这样就构成了我们想要的坐标系。好了,现在我们可以用视口(view port)的大小来描述这个可视范围了。比如说全屏幕640*480的分辨率,原点在屏幕中心,那我们得到的可视区域为一个长方体,它如图(a)所示。



    从图(a)变换到图(b)需要经过视口变换,目的是将屏幕坐标(0< SPAN>)变换到[-1,+1]的范围内。下面是将屏幕坐标变换到视口坐标的转换过程



接下来,我们处理视口空间到观察空间的转换。

由于在观察空间内,y = ± z * tan(fov/2),x = y*Aspect

而在投影空间内,x’和y’都属于[-1,+1],因此我们推出从观察空间到投影空间的变换公式,如下:

y’ = y * cot(fov/2) / z,   x’ = x * cot(fov/2) /(z* aspect)

    我们可以看到,从(x,y)变换到(x’,y’)是一次非线性变换,为了用矩阵来表达这个转换过程,我们就得用w这个分量了,为什么这么有用呢?我们可以想到,在世界变换和观察变换这两个过程内,我们对坐标的操作都是一些平移、旋转、缩放操作,仔细观察这些变换矩阵,我们可以发现这些矩阵的第四列元素均是(0 0 0 1),因此向量与矩阵相乘后,w分量并不会改变。换句话说,只要不是故意,一个w分量等于1的向量,再来到投影变换之前他的w分量仍旧等于1。好的,接下来我们让w’= w*z, 新的w’就记录下了view空间中的z值;同时在x,y分量上我们退而求其次,只要做到y’ = y * cot(fov/2), x’ = x * cot(fov/2) /aspect。那么,在做完线性变换之后,我们再用向量的y除以w,就得到了我们想要的最终的y值。

    现在只剩下z分量了。我们所渴望的变换应将z = Znear 变换到z = 0,将z = Zfar变换到z = 1。这个很简单,但是等等,x, y最后还要除以w,你z怎能例外。既然也要除,那么z = Zfar 就不能映射到z = 1了。唔,先映射到z = Zfar试试。于是,有z’ = Zfar*(z-Znear)/(Zfar – Znear)。接下来,看看z’/z的性质。令f(z) = z’/z = Zfar*(z-Znear)/(z*(Zfar – Znear))。

则f’(z) = Zfar * Znear / ( z^2 * (Zfar –Znear )), 显而易见f’(z) > 0。所以除了z = 0是一个奇点,函数f(z)是一个单调增的函数。因此,当Znear≤z≤Zfar时,f(Znear)≤f(z)≤f(Zfar),
  即0≤f(z)≤1。

至此,我们可以给出投影变换的表达式了:  
  x’ = x*cot(fov/2)/aspect  
  y’ = y*cot(fov/2)  
  z’ = z*Zfar / ( Zfar – Znear ) – Zfar*Znear / ( Zfar – Znear ) 
  w’ = z

以矩阵表示,则得到变换矩阵如下,  
  cot(fov/2)/aspect   0           0                         0  

  0                   cot(fov/2)  0                         0  
  0                   0           Zfar/(Zfar-Znear)         1  
  0                   0           -Zfar*Znear/(Zfar-Znear)  0



   做完线性变换之后,再进行所谓的“归一化”,即用w分量去除结果向量。
为了验证这一研究结果,我们可以察看DX9文档,发现投影矩阵就是我们在上面推出的矩阵,因此,我们可以得出结论,经过D3D提供的投影函数,我们可以得到投影矩阵M,为了将观察空间内的坐标变换到投影空间,我们首先要将观察空间内的向量称上矩阵M以执行线性变换,然后再将得到的向量除以w分量,就可以得到最终的投影空间内的向量了。

   为了简化上述步骤,Direct manager提供了一个函数TransformCoordinate函数,该函数内部直接将w分量“归一化”为1了。因此,我们只需将观察空间内的向量乘上此投影矩阵就可以得到投影空间内的向量了。

   同理,如果我们想从二维的屏幕坐标转化到模型空间内的坐标,就需要执行上述过程的逆过程:视口变换-->投影逆变换-->观察逆变换-->世界逆变换。
分享到:
评论

相关推荐

    深入理解透视投影变换

    ### 深入理解透视投影变换 #### 一、引言 透视投影变换是三维图形渲染管线中的核心组件之一,其主要功能是将三维场景中的物体从摄像机坐标系(通常称为视锥体)转换到规范化视图体积(Canonical View Volume),...

    论文研究-摄像机图像投影变换的研究 .pdf

    对于透视投影变换矩阵的构建,研究采用了将世界坐标系下的点坐标转换为视点坐标系下的点坐标,再将视点坐标系下的点坐标转换为屏幕坐标系下的点坐标的两步变换方法。 研究还提到了如何通过改变摄像机距地平面的高度...

    C++三维透视投影源代码

    在计算机图形学中,三维透视投影是一种模拟人眼观察三维物体的方式,使得图像在屏幕上具有...通过对源代码的研究,我们可以深入了解图形渲染、变换矩阵和交互控制等方面的知识,这对于深入学习计算机图形学非常有帮助。

    pjt.zip_java体_pjt_立方体投影_透视变换 java_透视投影

    在IT行业中,尤其是在图形学和计算机视觉领域,立方体透视投影和透视变换是重要的概念,它们用于模拟真实世界中的三维物体在二...通过这个Java程序,开发者可以深入研究透视投影的数学原理,并将其应用到自己的项目中。

    正方体投影变换-计算机图形学

    计算机图形学是信息技术领域的一个重要分支,它涉及图像的生成、处理和显示。...通过深入研究这个压缩包内的文件,你可以更深入地了解正投影变换的原理,并可能学会如何在自己的项目中应用这些知识。

    透视变换源代码_matlab;图像处理_透视变换_图像变换

    透视变换在很多领域都有应用,例如遥感图像处理、地图投影、自动驾驶中的视觉定位等。理解并熟练掌握MATLAB中的透视变换操作,对于进行图像分析、图像增强或算法开发是非常有益的。通过研究提供的代码和示例,你可以...

    一个用VC实现的透视投影演示程序

    为了进一步理解这个演示程序,你可以从以下几个方面深入研究: 1. 了解和分析源代码,特别是与透视投影设置和3ds文件解析相关的部分。 2. 学习OpenGL的基础知识,包括投影矩阵的设定和顶点坐标变换。 3. 熟悉3ds...

    轴测投影与透视投影的通用变换式及其CAD绘图.pdf

    作者推导出一个统一的变换式,该变换式可以同时适用于轴测投影和透视投影的表示,这为计算机绘图提供了便利。 3. 形体投影的计算方法: 为了在计算机中绘制形体的轴测图或透视图,首先需要确定形体在空间中的位置和...

    透视投影的原理和实现借鉴.pdf

    掌握透视投影的原理对于深入理解其他3D渲染管线具有重要作用。本文详细介绍了透视投影的原理和算法实现,包括透视投影的标准模型、一般模型和屏幕坐标变换等,并通过VC实现了一个演示程序。 1. 透视投影的原理 ...

    逆透视变换IPM源码

    在传统的透视变换中,一个三维空间的场景被投影到二维平面上,导致了近大远小的现象。而逆透视变换则是试图消除这种透视效应,使图像看起来像是从上方垂直俯视,这在交通监控、地图制作等领域非常有用。在车道线检测...

    计算机图形学课程设计汇本透视投影图三视图.doc

    参考文献部分则提供了进一步学习和深入研究的相关资源。 总的来说,这个课程设计项目通过实际操作加深了学生对计算机图形学中投影和视图变换的理解,锻炼了他们的编程能力,同时也为他们未来在图形处理和可视化领域...

    三维图形变换的统一矩阵

    通过对轴测投影和透视投影变换矩阵的研究,本文不仅详细地阐述了两种投影方式的基本原理及其变换矩阵的推导过程,而且还成功地推出了一种三维图形变换的统一矩阵。这一成果对于计算机图形学领域来说具有重要的理论...

    相机模型与投影变换-章国锋.pdf

    相机模型与投影变换是计算机视觉领域中...总之,通过对“相机模型与投影变换”这一主题的学习,我们可以对计算机视觉中的重要概念有更深入的理解,不仅可以帮助我们解决实际问题,还可以激发我们在这一领域的研究兴趣。

    课件 计算机图形学 投影变换.ppt

    在本课件中,重点讨论了将三维图形转化为二维显示的过程,主要包括窗口视区变换、投影变换、视向变换以及裁剪等核心概念。 首先,三维物体的表示方式主要有线框模型和表面模型。线框模型通过轮廓线来呈现形体,简洁...

    IPM.rar_360全景_IPM-OPF_ipm_图像逆透视_逆透视变换

    本文将深入探讨这两个概念以及图像逆透视变换在其中的作用。 首先,让我们理解什么是IPM。IPM是一种图像处理技术,它通过将摄像头捕获的常规图像转换为鸟瞰图或俯视图,从而创建出一种仿佛从上方观察场景的效果。...

    透视算法的例子

    透视算法是一种在计算机图形学中广泛使用的技巧,它允许我们模拟三维空间中的物体在二维屏幕上的投影,从而创建出具有深度感的图像。...通过深入研究这个例子,你可以更好地掌握透视变换的原理及其在实际项目中的应用。

    透视自瞄代码C/C++,矩阵透视

    这个过程涉及到透视投影和视口变换。透视投影可以模拟人眼观察真实世界的视觉效果,而视口变换则将3D空间的坐标映射到2D屏幕上。 C/C++代码中实现透视自瞄通常包括以下几个步骤: 1. **获取游戏内存信息**:外挂...

    D3D透视打包源码成品DLL

    在D3D中,透视投影通过设置视口、近裁剪平面和远裁剪平面来实现。视口定义了屏幕上的显示区域,而裁剪平面决定了哪些3D对象会被渲染到屏幕上。在设置好这些参数后,D3D会自动进行透视变换,使远离观察者的物体看起来...

    计算机图形学 透视图算法

    这涉及到一个称为透视投影的过程,其中每个点的x和z坐标被重新计算,与y坐标保持比例关系,确保远离视点的点看起来更小。 3. **线段绘制**:在新的二维坐标系中,根据转换后的坐标绘制线段,模拟物体的边缘。在一点...

Global site tag (gtag.js) - Google Analytics