为了更好的理解渲染过程的坐标变化,我们要先熟悉涉及到几个概念.
二维三维
二维空间: 是指仅由长度和宽度(几何学中的X轴和Y轴)两个要素所组成平面空间,只向所在的平面延伸和扩展.
三维空间: 日常生活中可指由长、宽、高三个维度构成的空间.
3D图形学中的坐标系
世界坐标系 : 在一个大千世界里,为了表述多个物体间的关系引入了世界坐标系.世界坐标系始终不变,是系统的绝对坐标系,在没有建立用户坐标系之前的画面上所有点的坐标都可以在该坐标系的原点来确定各自的位置.
物体坐标系 : 为了单独的观察每个物体的行为:平移、旋转等引用了物体坐标系.物体坐标系是以物体本身而言的.每个物体都有他们独立的坐标系.例如有四个朝向东西南北的人,这里的东西南北不会因为四个人的朝向而改变既是以世界坐标系为参照,当让这四个人向前走时,四个人回朝不同的方向前进,这里的向前就就是以物体坐标系.物体坐标系又称模型坐标系
惯性坐标系 : 为了简化世界坐标系到物体坐标系的转化而产生,惯性坐标系的原点与物体坐标系重合,惯性坐标系的轴平行于世界坐标系的轴,引用惯性坐标系后,物体坐标系转换到惯性坐标系只需要旋转,惯性坐标系转换到世界坐标系只需要平移,如下图展示了以上三个坐标系的关系
![](https://img.haomeiwen.com/i6672498/f732361d7e137c61.png)
摄像机(照相机)坐标系 : 与观察者密切相关,为了描述观察者看到的世界的一部分,添加了摄像机坐标系,摄像机坐标系是对3D控件的描述
![](https://img.haomeiwen.com/i6672498/76ea3e9f0acf1696.png)
投影坐标系 : 因为直接将3D坐标转换为屏幕坐标非常复杂,所以将3D坐标降维到2D坐标,OpenGL为了将笛卡尔坐标系映射为屏幕上的显示的二维坐标系提供了两种常见的投影方式.
- 正投影或平行投影 使用正投影时,需要指定一个正方形/或长方形的视景体,在视景体以外的任何物体都不会被绘制,并且使用正投影以世界大小相同的物体在屏幕上都具有相同的大小,不管他们是否存在远近问题.正投影比较适合平面图形/2D图形
-
透视投影 一般指定的视景体,看起来像平截体,经过投影,使图像渲染更加逼真
projection.jpg
窗口 视口 裁剪区域
- 窗口 能进行绘制的区域,以像素为单位度量
- 视口 窗口中用来显示图形的一块区域,只有绘制在视口区域的图形才能被显示,在代码中会通过glViewPort来设置,可以和窗口一样大,也可以比窗口大或小
- 裁剪区域 视口矩形区域的最小最大x、y坐标,同时也可以指定z来形成立体裁剪.
左手坐标系右手坐标系
伸出左手,让拇指和食指成" L"形,大拇指向右,食指向上.其余的手指指向前方,这样我们就建立了一个左手坐标系.同理伸出右手使食指向上,拇指向左,其余指向前这样就成了一个右手坐标系,OpenGL中物体,世界,照相机坐标系都属于右手坐标系,而规范化设备坐标系使用的是左手坐标系
![](https://img.haomeiwen.com/i6672498/eb1c8fbdb31ea204.jpg)
坐标系的全局变化
通过以上概念我们可以知道,如果想要把三维空间内的物体转换到二维空间上势必要经过一系列的转化.一个简单的流程是: 物体/对象坐标通过模型变换,转成世界坐标.世界坐标经过视变换,转成摄像机/观察者坐标.之后经过投影变换,转成裁剪坐标,使用透视除法,得到规范化坐标.最后进行视口变换得到屏幕坐标
![](https://img.haomeiwen.com/i6672498/c5c7870627e31b75.png)
在上图的变换中,一部分是用户自定义的变换如模型变换、视变换、投影变换,这些内容在顶点做色器中完成,有一部分是OpenGL自动执行的包括透视除法、视口变换,在顶点着色器处理后的阶段完成
网友评论