首页 技术 正文
技术 2022年11月15日
0 收藏 836 点赞 3,943 浏览 1774 个字

  OpenGL中顶点经过顶点着色器后会变为标准设备坐标系。标准设备坐标系的各坐标的取值范围是[-1,1],超过这个范围的点将会被剔除。而这个变换的过程可描述为顶点在几个坐标系统的变换,这几个坐标系统为:

    模型空间(Local Sapce)

    世界空间(world Space)

    观察空间(View Space)

    裁切空间(Clip Space)

    屏幕空间(Projection Space)

  OpenGL的顶点变换为标准设备坐标系的点就是按:模型空间->世界空间->观察空间->裁切空间->屏幕空间 顺序进行变化的。为什么要分这么多个阶段的变化?这个主要是为了方便适应不同的变换需求,比如在进行物体移动的时候,使用世界坐标系会比较的方便。那这些坐标空间到底是什么了?我们接下来一个一个解释。

  模型空间

  表示模型最初所在的空间,即当时构建这个模型时的坐标空间。比如上一节中绘制三角形时所给的三个顶点的坐标就时模型坐标系下的坐标位置,每一个x,y,z的取值范围都是[-1,1]。

  世界空间

  想象一下,我们构造模型的时候通常是一个一个的构建的,每个模型都是相对模型坐标系的(0,0,0)点进行的建模,这个时候如果我们把这些模型都放在一起,可以想象它们将叠在一起,这个当然不是我们想要的,这个时候就需要另一个坐标系来描述它们的方位关系了。比如场景中有一个人和一辆车,它们在构建时都在(0,0,0)点,现在我们在这个基础上把人放在(-2,0,0)的位置,把车放在(10,0,0)的位置,而这两个坐标就是世界空间中的坐标。所以世界坐标系描述的时所有三维模型的相对关系。

  观察空间

  观察空间可以这么理解:在世界空间摆放好我们的模型之后,我们需要找一个位置和角度来观察它们,我们观察到的画面即我们要渲染的画面,而以我们眼睛为基点构建的空间即为观察空间。观察空间是把世界空间的点转换为视线前方的点的而产生的结果。它通常由一些平移和旋转矩阵组合成。

  裁切空间

  我们人眼的观察范围是有限的,计算机模拟人眼视野,所以OpenGL渲染的顶点应该都在一个视野范围内,这个视野范围即我们所谓的裁切空间,超出这个范围的点就被裁切掉。裁切空间定义在标准设备坐标系上的,坐标的取值范围是(-1,1),但我们观察空间中的顶点是三维的,如果要把三维的顶点映射为二维的点,我们需要定义一个投影矩阵把观察空间的点映射到裁切空间。投影就是将三维物体投射到二维平面的过程,投影可分为正投影和透视投影。

正投影

  正投影比较简单,他的平截头体是一个长方体,在这个长方体内的顶点可见,其它点则剔除。这个长方体可以由left,right,bottom,top,near,far这几个参数确定,其中near和far表示近平面和远平面。投影可以看作是把三维画面投影在近平面,可以想象,因为远平面和近平面一样大,所以投影对于物体的大小没有影响,可以推断:在着色器使用齐次坐标,顶点着色器透视除法所使用的w为1,即(x/w,y/w,z/w,1),w=1。

透视投影

  在实际生活中常见的现象是离我们越远的物体越小,越近的物体越大。这个效果就是透视,最直观的现象即使两条平行线在远处会相交,如铁路上的铁轨。要实现这种透视的效果我们需要一个梯状的平截头体,这个平截头体的参数定义可同正投影使用6个参数,也可使用指定fov的方式定义。与正投影相比,透视投影的远平面更大,这样越远的物体投影到近平面时就越小,即w是一个与z相关的值。

具体的投影矩阵推导可参见:

http://blog.csdn.net/wangdingqiaoit/article/details/51589825

  屏幕空间

  屏幕空间可理解为显示器屏幕上定义的坐标空间,有两种定义,一种是以左上角为(0,0)点,右下角为(width,height),其中width和height是屏幕的宽和高;一种是左下角为(0,0)点,右上角为(width,height)。

  MVP

  把顶点从模型空间变换到裁切空间,我们需要经过:模型空间->世界空间->观察空间->裁切空间的3个变换阶段,这3个变换可用3个矩阵表示,分别是模型矩阵、观察矩阵和投影矩阵,把这3个变化矩阵组合到一起即为模型空间到裁切空间的矩阵变换:

   

的发达第

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,129
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,601
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,444
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,218
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,852
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,940