若是你想把图形渲染在正确的位置上,那么坐标的设置就很重要了。在OpenGL中,与坐标相关的主要有笛卡尔坐标、坐标裁剪、纹理坐标、MVP(Model View Projection)转换。算法
1.笛卡尔坐标spa
在二维绘图中,笛卡尔坐标有一个X轴和一个Y轴组成,X轴为水平方向,Y轴为垂直方向,X和Y相互垂直。如图1。关于正负方向问题,默认如图1上标示,可是咱们能够根据实际需求本身定义。(左下角为(0, 0)原点).net
图1:翻译
在三维绘图中,笛卡尔坐标多了一个Z轴,Z轴同时垂直于X和Y轴。Z轴的实际意义表明着三维物体的深度。如图2。关于正负方向问题,默认如图2上标示,可是咱们能够根据实际需求本身定义。对象
图2:blog
2.坐标裁剪排序
窗口是以像素为单位进行度量的。开始在窗口中绘制点、线和形状以前,要把指定的笛卡尔坐标对翻译成屏幕坐标,咱们能够经过指定占据窗口的笛卡尔区域来转换,这个区域叫作裁剪区域。在二维空间中,有两种常见的裁剪区域。第一种,裁剪区域就是窗口内部最小和最大的x、y值,如图3。第二种就是根据窗口指定原点位置,如图4。get
图3:it
图4:io
在OpengL绘图中采用的裁剪坐标是第二种,而且x、y的取值为-1~+1,这称为单位坐标。固然咱们日常直接使用setPosition(x=500,y=600),x和y值到最后仍是会经过矩阵相乘转换成单位坐标,这是涉及到模型视图、投影的变换,即MVP变换(Model View Projection)。
3.纹理坐标(左上角为(0, 0)原点)
在指定了图形的笛卡尔坐标后,若是想要在图形上进行贴图,则要设置好纹理坐标。纹理坐标要么是指定为着色器的一个属性,要么经过算法计算出来。典型状况下,纹理坐标是做为0.0到1.0范围内的浮点值指定,固然你也能够设置本身预约的范围,而后再着色器中进行单位化计算。纹理坐标的命名为s、t和q(与顶点坐标x、y、z、w类似),支持从一维到三维的纹理坐标,而且能够选择一种对坐标进行缩放的方法。如图5。
图5:
注意:若是纹理通过DXT压缩(一般为jpg格式),纹理的坐标的t坐标会反转。即原点变成左上角了,y轴向下为正,x依旧向右为正。由于DXT压缩源自DirectX,纹理坐标和OpenGL相比,因此使用压缩纹理时,得用“t变=1.0-t前”来获取正确的纹素。即在OpenGL中(0,0)变为(0,1),(0,1)变为(0,0),(1,1)变为(1,0),(1,0)变为(1,1)。
4.模型视图、投影
首先,咱们来看看OpengGL变换的术语。
视图(View)--指定观察者或照相机的位置。
模型(Model)--在场景中移动物体。
模型视图--描述视图和模型变换的二元性。
投影(Projection)--改变视景体的大小或从新设置它的形状。
视口--这是伪改变,只是对窗口上的最终输出进行缩放。
视图坐标与视图变换
视觉坐标是相对观察者的视角而言的,它是一个虚拟的固定坐标系,一般用做参考坐标系。 视图变换容许咱们把观察点放在任何位置,并容许在任何方向上观察场景。肯定视图变换就像在场景中放置照相机并让它指向某个方向。
模型变换
模型变换用于操纵模型和其中的特定对象,这里的模型指的是点的笛卡尔坐标,这些变换将对象移动到须要的位置,而后再对它们进行旋转和缩放。一般代码如,Sprite::moveTo(x,y),Sprite::scale(x)。这里须要注意的是模型变换的顺序,由于矩阵的相乘不遵照结合律,所以变换顺序不一样,一般获得的结果会不一样。
模型视图变换
模型视图变换是模型变换和视图变换在变换管线中的组合。由于有时两种变换的效果同样的,如将对象向后移动和将参考坐标系向前移动在视觉上的效果同样,可是后者的变换对全部的元素都有效,前者只做用于本身。因此,要看本身须要那种效果来进行那种变换。
须要注意的是,在OpengL中的矩阵是以列优先排序的。
投影变换
投影变换将在模型视图变换以后应用到顶点上,这种投影定义了视景体并建立了裁剪平面。投影变换有两种:正投影和透视投影。
正投影,全部多边形都是按一样相对大小来在屏幕上绘制的。线和多边形使用平行线来直接映射到2D屏幕上。适合蓝图、文本等二维图形。如图6。
图6:
透视投影,经过非平行线来把图形映射到2D屏幕上,有透视缩短的特色,更加贴近现实。如图7。
图7:
5.总结
最后,咱们梳理一下渲染过程当中坐标变换的流程,如图8。
图8:
如需转载,请标明出处,http://blog.csdn.net/cbbbc/article/details/39738641