OpenGL超级宝典总结(二)2D/3D笛卡尔坐标、坐标裁剪、纹理坐标、MVP转换等概念

如果你想把图形渲染在正确的位置上,那么坐标的设置就很重要了。在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

时间: 2024-10-13 20:33:41

OpenGL超级宝典总结(二)2D/3D笛卡尔坐标、坐标裁剪、纹理坐标、MVP转换等概念的相关文章

OpenGL超级宝典笔记二 - 基础变换

1.向量: 点乘:float m3dDotProduce3(u,v):返回两个单位向量的余弦值 叉乘:float m3dCrossProduct3(result,u,v):返回垂直于两个向量定义的平面的向量 2.矩阵: OpenGL使用的是列优先排序的矩阵 单位矩阵(对角线为1,其他为0):任何向量乘以一个单位矩阵都不会发生任何改变 3.变换:最终获得的变换矩阵会应用到每个顶点 视图矩阵x模型矩阵x投影矩阵->投影摄像机的位置变换,物体对象的位置变换,投影裁剪变换 若顶点向量为Vert,则变换公

Ubuntu:Codeblocks编译OpenGL超级宝典(第5版)的实例

最近在看OpenGL超级宝典第五版,系统为Ubuntu,想通过Codeblocks运行书中的实例,途中遇到不少问题,均已解决,现分享一下操作步骤如下: 1. 建立基本编译环境 sudo apt-getinstall build-essential 2. 安装OpenGL Library sudo apt-getinstall libgl1-mesa-dev   3.安装OpenGL Utilities sudo apt-getinstall libglu1-mesa-dev 4.安装OpenGL

win8+VS2012搭建OpenGL超级宝典的环境

自从公司搬到腾讯附近,每天上班都迟到20分钟左右,迟到会扣钱,两不相欠,迟到就成了心安理得的事情了. 如果你光看我之前的blog,我现在告诉你目前从事游戏开发,你可能会感到惊讶.是啊,我之前从未写过一篇关于游戏的文章.或许因缘巧合吧,正在做手游项目啊,用的是cocos2dx引擎.说来话长,大学的毕业设计是用java写了个小游戏,后来工作了,进了一家做电子教育产品的公司,虽然不是游戏公司,产品里也包含些休闲小游戏,其中有个游戏是我经理开发的,在同行的产品中算是最大型的一款游戏吧,由c语言写成,未使

OpenGL超级宝典visual studio 2013开发环境配置,GLTools

做三维重建需要用到OpenGL,开始看<OpenGL超级宝典>,新手第一步配置环境就折腾了一天,记录下环境的配置过程. <超级宝典>中的例子使用了GLEW,freeglut以及作者自己开发的GLTools这三个库. 1.GLEW The OpenGL Extension Wrangler Library (GLEW) is a cross-platform open-source C/C++ extension loading library. GLEW provides effi

[转]OpenGL超级宝典 5e 环境配置

OpenGL超级宝典(第五版)环境配置 1.各种库的配置 (1)glew 下载:https://sourceforge.net/projects/glew/files/glew/1.7.0/glew-1.7.0.zip/download 将include文件夹下的.h文件拷贝到C:\Program Files\Microsoft Visual Studio 9.0\VC\include\GL目录中(没有GL目录就自己创建一个,这里的具体路径视电脑上VS2008安装的位置而定) 将lib文件夹下的

Mac OSX下搭建OpenGL超级宝典5(蓝宝书)开发环境(运行第一个三角形程序)

1.下载OpenGL超级宝典5(蓝宝书)的资源,链接如下:http://pan.baidu.com/s/1c02PtYC,解压得到SB5文件夹,里面有书籍的课程源码以及GLTools库. 2.依次点击Xcode-->Preferences-->Locations-->Sources Trees,再点“+”号按钮添加Name:  GLTOOLS_INCLUDE,  Display Name:  GLTools include Folder, Path: ~/Desktop/SB5/src/

OpenGL超级宝典笔记——贝塞尔曲线和曲面(转)

http://my.oschina.net/sweetdark/blog/183721 参数方程表现形式 在中学的时候,我们都学习过直线的参数方程:y = kx + b;其中k表示斜率,b表示截距(即与y轴的交点坐标).类似地,我们也可以用一个参数方程来表示一条曲线.1962年,法国工程师贝塞尔发明了贝塞尔曲线方程.关于贝塞尔曲线的详细介绍可以参考(维基贝塞尔).这里只介绍OpenGL实现贝塞尔的函数. OpenGl定义一条曲线时,也把它定义为一个曲线方程.我们把这条曲线的参数成为u,它的值域就

OpenGL超级宝典笔记----渲染管线

在OpenGL中任何事物都在3D空间中,但是屏幕和窗口是一个2D像素阵列,所以OpenGL的大部分工作都是关于如何把3D坐标转变为适应你屏幕的2D像素.3D坐标转为2D坐标的处理过程是由OpenGL的图形渲染管线完成的.图像渲染管线可以被划分为两个主要部分:第一个部分把你的3D坐标转换为2D坐标,第二部分是把2D坐标转变为实际的有颜色的像素. 渲染管线接收一组3D坐标,然后把它们转变为你屏幕上的有色2D像素.渲染管线可以被划分为几个阶段,每个阶段需要把前一阶段的输出作为输入.所有这些阶段都是高度

OpenGL超级宝典笔记——深度纹理和阴影 【转】

目录[-] 光源视角 新型的纹理 深度纹理的大小 首先绘制阴影 然后是光照 投影阴影贴图 阴影比较 之前我们介绍过简单的把物体压平到投影平面来制造阴影.但这种阴影方式有其局限性(如投影平面须是平面).在OpenGL1.4引入了一种新的方法阴影贴图来产生阴影. 阴影贴图背后的原理是简单的.我们先把光源的位置当作照相机的位置,我们从这个位置观察物体,我们就知道哪些物体的表面是被照射到(被光源看到) 的,哪些是没有被照射到(被遮挡住)的(在某个方向上离光源最近的表面是被照射的,后面的表面则没有被照射到