博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux OpenGL 实践篇-4 坐标系统
阅读量:4957 次
发布时间:2019-06-12

本文共 2041 字,大约阅读时间需要 6 分钟。

  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相关的值。

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

   这里的投影其实是借助了“齐次坐标”的应用,关于“齐次坐标”,有兴趣的同学可自行google或百度。使用齐次坐标的好处就是能把三维的平移使用四维的错切变换实现,即平移可以使用矩阵的乘法实现(在三维坐标下三维平移是使用加法),这样所有的变换都可以统一为乘法,方便计算。

  

  屏幕空间

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

 

  MVP

  MVP即我们常用的把坐标从模型坐标系变换到投影坐标系的矩阵,其中M表示model,V表示view,P表示Projection。根据前文表述,我们有4个坐标系(屏幕坐标系统除外),其中有三个变化,分别是:模型空间->世界空间,世界空间->观察空间,观察空间->裁切空间,把这3个变化矩阵组合到一起即为模型空间到裁切空间的矩阵变换——MVP:

   

 

的发达第

转载于:https://www.cnblogs.com/xin-lover/p/8546890.html

你可能感兴趣的文章
IIS负载均衡-Application Request Route详解第六篇:使用失败请求跟踪规则来诊断ARR...
查看>>
javascript中的自执行匿名函数
查看>>
linux权限详解
查看>>
asp.net 验证码技术
查看>>
Dispose,using
查看>>
三成架构 与 Mvc
查看>>
微信公众平台开发培训
查看>>
Jmeter目录认识
查看>>
python 第四次---- if 语句
查看>>
Android BindService中遇到的一个小问题
查看>>
PYTHON网络编程笔记
查看>>
The logon account that was provided does not have valid credentials
查看>>
ActionScript3与PHP的通信
查看>>
VC++Tips
查看>>
201712015第十四次例会
查看>>
(三)hibernate单表操作
查看>>
我的作品
查看>>
Allowed memory size of 134217728 bytes exhausted解决办法(php内存耗尽报错)【简记】
查看>>
百度地图API试用--(初次尝试)
查看>>
RGB555转RGB565
查看>>