如果你想把图形渲染在正确的位置上,那么坐标的设置就很重要了。在OpenGL中,与坐标相关的主要有笛卡尔坐标、坐标裁剪、纹理坐标、MVP(Model View Projection)转换。
1.笛卡尔坐标
在二维绘图中,笛卡尔坐标有一个X轴和一个Y轴组成,X轴为水平方向,Y轴为垂直方向,X和Y相互垂直。如图1。关于正负方向问题,默认如图1上标示,但是我们可以根据实际需求自己定义。(左下角为(0, 0)原点)
图1:
在三维绘图中,笛卡尔坐标多了一个Z轴,Z轴同时垂直于X和Y轴。Z轴的实际意义代表着三维物体的深度。如图2。关于正负方向问题,默认如图2上标示,但是我们可以根据实际需求自己定义。
图2:
2.坐标裁剪
窗口是以像素为单位进行度量的。开始在窗口中绘制点、线和形状之前,要把指定的笛卡尔坐标对翻译成屏幕坐标,我们可以通过指定占据窗口的笛卡尔区域来转换,这个区域叫做裁剪区域。在二维空间中,有两种常见的裁剪区域。第一种,裁剪区域就是窗口内部最小和最大的x、y值,如图3。第二种就是根据窗口指定原点位置,如图4。
图3:
图4:
在OpengL绘图中采用的裁剪坐标是第二种,并且x、y的取值为-1~+1,这称为单位坐标。当然我们平常直接使用setPosition(x=500,y=600),x和y值到最后还是会通过矩阵相乘转换成单位坐标,这是涉及到模型视图、投影的变换,即MVP变换(Model View Projection)。
3.纹理坐标
在指定了图形的笛卡尔坐标后,如果想要在图形上进行贴图,则要设置好纹理坐标。纹理坐标要么是指定为着色器的一个属性,要么通过算法计算出来。典型情况下,纹理坐标是作为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