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)原点)
在指定了图形的笛卡尔坐标后,如果想要在图形上进行贴图,则要设置好纹理坐标。纹理坐标要么是指定为着色器的一个属性,要么通过算法计算出来。典型情况下,纹理坐标是作为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
OpenGL超级宝典总结(二)2D/3D笛卡尔坐标、坐标裁剪、纹理坐标、MVP转换等概念的更多相关文章
- OpenGL超级宝典笔记----框架搭建
自从工作后,总是或多或少的会接触到客户端3d图形渲染,正好自己对于3d图形的渲染也很感兴趣,所以最近打算从学习OpenGL的图形API出发,进而了解3d图形的渲染技术.到网上查了一些资料,OpenGL ...
- OpenGL超级宝典visual studio 2013开发环境配置,GLTools
做三维重建需要用到OpenGL,开始看<OpenGL超级宝典>,新手第一步配置环境就折腾了一天,记录下环境的配置过程. <超级宝典>中的例子使用了GLEW,freeglut以及 ...
- 问题解决——OpenGL超级宝典 关于gltDrawTorus的错误解决
看OpenGL超级宝典的时候,遇到一个函数 “gltDrawTorus”,在TRANSFORM和SPHEREWORLD中都有用到.但是一开始在自己写示例代码里时却没法使用,而在作者的代码目录结构下却可 ...
- 问题解决——OpenGL超级宝典 第四章 4.5.2 关于freeglut.lib问题的解决过程
看<OpenGL超级宝典(第四版)>的4.5.2节时遇到了一系列问题,经过不懈努力终于解决,现将过程记录在下,以便查找追思. 在第4.5.2节之前,自己写的的代码都没有使用作者的gltoo ...
- 《OpenGL超级宝典》编程环境配置
最近在接触OpenGL,使用的书籍就是那本<OpenGL超级宝典>,不过编程环境的搭建和设置还是比较麻烦的,在网上找了很多资料,找不到GLTools.lib这个库.没办法自己就借助源码自己 ...
- win8+VS2012搭建OpenGL超级宝典的环境
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/booirror/article/details/36957799 自从公司搬到腾讯附近,每天上班都迟 ...
- OpenGL超级宝典笔记——贝塞尔曲线和曲面(转)
http://my.oschina.net/sweetdark/blog/183721 参数方程表现形式 在中学的时候,我们都学习过直线的参数方程:y = kx + b;其中k表示斜率,b表示截距(即 ...
- OpenGL超级宝典笔记----渲染管线
在OpenGL中任何事物都在3D空间中,但是屏幕和窗口是一个2D像素阵列,所以OpenGL的大部分工作都是关于如何把3D坐标转变为适应你屏幕的2D像素.3D坐标转为2D坐标的处理过程是由OpenGL的 ...
- 【转载】OpenGL超级宝典笔记——GLSL语言基础
变量 GLSL的变量命名方式与C语言类似.变量的名称可以使用字母,数字以及下划线,但变量名不能以数字开头,还有变量名不能以gl_作为前缀,这个是GLSL保留的前缀,用于GLSL的内部变量.当然还有一些 ...
随机推荐
- deepin linux手工更新系统
sudo apt-get updatesudo apt-get dist-upgrade -y 可以使用阿里云的镜像
- buildroot 文件系统添加telnet, ssh, 以及制作注意事项
buildroot 制作Linux嵌入式文件系统,并添加telnet 以及ssh * sshd 服务的添加 // make menuconfig Target options ---> Targ ...
- [wifi]wifi模块的测试
罗德斯瓦茨 非信令CMW100,信令CMW270,CMW500 支持多通道 具体如何多通道接相同的SSID,要看被测设备的变成 ublox是否支持非信令,需要check,信令和芯片没有关系,只和协议有 ...
- SpringMVC @RequestMapping 用法详解之地址映射
@RequestMapping 用法详解之地址映射 http://blog.csdn.net/walkerjong/article/details/7994326
- oracle sql生成日历表
以下是生成2017年日历表: insert into dw_mdl.m_hadp_dim_date select to_char(everyDay,'yyyy-mm-dd') as dt, to_ch ...
- [LintCode]删除链表中的元素
问题分析: 声明当前指针和上一个指针即可. 问题求解: public class Solution { public ListNode removeElements(ListNode head, in ...
- PHP 获取图片中的器材信息
function getExif($img){ $exif = exif_read_data($img, 'IFD0'); return array ( '文件名' => $exif['File ...
- jQuery.Form插件介绍
一.前言 jQuery From插件是一个优秀的Ajax表单插件,使用它可以让你非常容易地.无侵入地升级HTML表单以支持Ajax.jQuery From有两个主要方法:ajaxForm和ajaxS ...
- ADT Android Development Tools
ADT(Android Development Tools)在Eclipse编译IDE环境中,需安装ADT(Android Developer Tools)Plug-in,这是Android在Ecli ...
- 【转】【Android】Android不同版本下Notification创建方法
使用 new Notification(int icon, CharSequence tickerText, long when)构造函数时,Eclipse却提示:" The constru ...