2.2 正交投影,观察箱,世界坐标

实验2.2表明,顶点的坐标值不是屏幕上的任意绝对单位(屏幕单位是像素)。

glOrtho(left,right,bottom,top,near,far)建立一个观察箱(viewing box),用6个参数来确定六个面的位置。

最近搞opengl,本来以为自己对glortho这个函数已经了解了,结果发现自己根本不理解。

首先,glortho函数的原型是void glOrtho(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top,GLdouble near,GLdouble far)。我原先一直认为near和far指定的就是近平面和远平面的z坐标,知道今天自己开始写OpenGL的程序才发现不是这样。首先该函数定义的绘图空间是下面这样的:

我们自己所绘制的图形的坐标只能在这个空间里,不然不能看到自己绘制的图形。

但是near和far却不是上图中所示的近平面和远平面的z坐标。近平面矩形的左下角的坐标是(left,bottom,-near),右上角的坐标是(right,top,-near);远平面矩形的左下角坐标是(left,bottom,-far),右上角坐标是(right,top,-far)。所以说,实际的远近平面坐标并不是简单地由near和far指定,而是由-near和-far指定。

那么,远近平面对我们来说有什么作用呢?其中最重要的一个就是深度测试。如果我们想实现靠近我们的物体遮挡住远处的物体,那么我们应该通过glEnable(GL_DEPTH_TEST)启用深度测试,这个时候每一个物体绘制前,都会和当前的深度缓冲区进行比较,然后决定要不要渲染当前输入的绘图指令。首先,如果我们启用深度测试我们一般在绘图之前使用glClear(GL_DEPTH_BUFFER_BIT),把所有深度缓冲区的值设置为最大值(一般就是前面说过的远平面的值)。在以后的绘图过程中,会将当前绘图指定中的图形深度值即z值与深度缓冲区中对应像素点的值进行比较,如果更加靠近近平面(并不是简单地比较数值大小,而是看相对于近平面的位置),则绘制该图形,并把深度缓冲区中的值修改为当前绘图指定中指定图形的z值;否则,不绘制图形,同时深度缓冲区中的值不变。

在进行混合的时候,深度测试也很重要。首先,如果在需要渲染的场景中,如果存在透明的物体,那么先要绘制不透明的物体。因为,绘制透明物体时,当前绘图指令指定的物体的颜色为源颜色,而当前颜色缓冲区中的颜色为目标颜色,源颜色会与目标颜色按一定公式进行混合(公式参考文献3)。例如,先绘制背景,再绘制透明物体,再绘制一个位置位于透明物体后面(相对于透明物体,远离近平面)的不透明物体,则不会获得你所期望的效果。这是因为,当你绘制透明物体时,当前颜色缓冲区中存放的背景颜色,那么透明物体的颜色会与背景颜色混合。当你再绘制不透明物体时,即使不透明物体比透明物体大而导致透明物体不能遮挡不透明物体,由于深度测试的存在,也不会在透明物体的区域上绘制不透明物体,这时不透明物体位置处的颜色就是不透明物体和背景的混合色,而没有产生你想要的透明物体与不透明物体的混合。

那么,在存在混合的情况时,一般的做法是先打开深度测试,然后绘制所有的不透明物体,由于这个时候存在深度测试,绘制的顺序不一定要按照物体距离近平面的近远顺序绘制。然后利用函数glDepthMask(GL_FALSE)将深度缓冲区设置为只读模式(此时,没必要关闭深度检测,因为无论启不启用深度检测对于透明物体都要按照先远后近的顺序绘制),此时深度缓冲区的值不会随着后面绘制的不透明物体的深度值而改变。接着,按照先远后近的顺序绘制各个透明物体。

参考1:http://blog.csdn.net/shuaihj/article/details/7228882

参考2:http://blog.csdn.net/j123kaishichufa/article/details/6603888

参考3:http://blog.sina.com.cn/s/blog_6c8369530100m0x8.html

glOrtho是创建一个正交平行的视景体。 一般用于物体不会因为离屏幕的远近而产生大小的变换的情况。比如,常用的工程中的制图等。需要比较精确的显示。 而作为它的对立情况, glFrustum则产生一个透视投影。这是一种模拟真实生活中,人们视野观测物体的真实情况。例如:观察两条平行的火车到,在过了很远之后,这两条铁轨是会相交于一处的。还有,离眼睛近的物体看起来大一些,远的物体看起来小一些。

glOrtho(left, right, bottom, top, near, far), left表示视景体左面的坐标,right表示右面的坐标,bottom表示下面的,top表示上面的。这个函数简单理解起来,就是一个物体摆在那里,你怎么去截取他。这里,我们先抛开glViewport函数不看。先单独理解glOrtho的功能。 假设有一个球体,半径为1,圆心在(0, 0, 0),那么,我们设定glOrtho(-1.5, 1.5, -1.5, 1.5, -10, 10);就表示用一个宽高都是3的框框把这个球体整个都装了进来。  如果设定glOrtho(0.0, 1.5, -1.5, 1.5, -10, 10);就表示用一个宽是1.5, 高是3的框框把整个球体的右面装进来;如果设定glOrtho(0.0, 1.5, 0.0, 1.5, -10, 10);就表示用一个宽和高都是1.5的框框把球体的右上角装了进来。上述三种情况可以见图:

时间: 2024-10-12 12:53:59

2.2 正交投影,观察箱,世界坐标的相关文章

OpenGL坐标系统

一.坐标系统概述 本文类容见LearnOpenGL CN.直接copy过来留个存档. OpenGL希望每次顶点着色后,我们的可见顶点都为标准化设备坐标(Normalized Device Coordinate,NDC).也就是说每个顶点的\(z,y,z\)都应该在\(-1\)到\(1\)之间,超出这个范围的顶点将是不可见的.通常情况下我们会自己设定一个坐标范围,之后再在顶点着色器中将这些坐标变换为表转化设备坐标.然后这些标化设备坐标传入光栅器(Rasterizer),将它们变换为屏幕上的二维坐标

读<<为了替女朋友买件内衣,用Python爬虫>>有感

本文主要讨论的是通过爬取天猫的销售数据和评论数据后,对数据进行清洗,并进行分析.流程大致为:1.通过selenium爬取销售数据: 2.通过selenium和re正则表达式爬取评论数据:3.通过pandas对数据进行清洗和分析:4.运用matplotlib和wordcount来进行可视化 1.故事的起源 故事要从上周四说起,J某人由于工作上的变动,暂时比较闲,难得能准时下班,结果在地铁上太挤,一不小心手机就点进了一篇名为<为了给女朋友买件心怡内衣,我用Python爬虫了天猫内衣售卖数据>.我这

世界坐标空间与观察坐标系之间的转换

1.世界坐标空间与观察坐标系之间的转换 已知:观察坐标系相对世界坐标系的u,v,w轴与起点q,将世界坐标系中一点变换到观察坐标系 使用左手坐标系推导 u = ( ux , uy , uz , 0 ) v = ( vx , vy , vz , 0 ) w = (wx , wy , wz , 0 ) q = ( qx , qy , qz , 1 ) 观察坐标系中的点可以表示为: p = au+bv+cw+q 即为 (a,b,c,1) 展开上述公式 p =  a * ux * x + a * uy *

扩增子图表解读1箱线图:Alpha多样性

箱线图 箱形图(Box-plot)又称为盒须图.盒式图或箱线图,是一种用作显示一组数据分散情况资料的统计图.因形状如箱子而得名.在宏基因组领域,常用于展示样品组中各样品Alpha多样性的分布 第一种情况,最大或最小值没有超过1.5倍箱体范围 第二种情况,最大或最小值超过1.5倍箱体范围,外位延长线外,即异常值(outliers) Alpha多样性 知识背景:Alpha多样性计算方法 常见的丰度估计方法有Shannon, Chao1和Observed OTU和PD whole tree等.我最喜欢

unity, 在image effect shader中用_CameraDepthTexture重建世界坐标

我用于渲染_CameraDepthTexture的相机是一个透视相机.正交的情况没试,估计差不多. unity的image effect的机制我们大致都了解:它是画了一个覆盖全屏的quad(具体尺寸和位置未知). 要注意的是image effect使用的投影矩阵并非相机的投影矩阵,而是使用了一个正交投影矩阵(具体形式未知),这一点我卡了好久才意识到,不过一想也很正常合理,毕竟只是想画个全屏quad,直接push个正交矩阵(即切换到2d模式)去画就好了. 虽然image effect使用的投影矩阵

.NET中六个重要的概念:栈、堆、值类型、引用类型、装箱和拆箱 (转)

作者: Edison Chou  来源: 博客园  发布时间: 2014-09-03 15:59  阅读: 318 次  推荐: 2   原文链接   [收藏] 原文作者:Shivprasad koirala 英文原文:Six important .NET concepts: Stack, heap, value types, reference types, boxing, and unboxing 一.概述 本文会阐述六个重要的概念:堆.栈.值类型.引用类型.装箱和拆箱.本文首先会通过阐述当

.NET中的六个重要概念:栈、堆、值类型、引用类型、装箱和拆箱

内容导读 概述 当你声明一个变量背后发生了什么? 堆和栈 值类型和引用类型 哪些是值类型,哪些是引用类型? 装箱和拆箱 装箱和拆箱的性能问题 一.概述 本文会阐述六个重要的概念:堆.栈.值类型.引用类型.装箱和拆箱.本文首先会通过阐述当你定义一个变量之后系统内部发生的改变开始讲解,然后将关注点转移到存储双雄:堆和栈.之后,我们会探讨一下值类型和引用类型,并对有关于这两种类型的重要基础内容做一个讲解. 本文会通过一个简单的代码来展示在装箱和拆箱过程中所带来的性能上的影响,请各位仔细阅读. 二.当你

OSG世界坐标转屏幕坐标(转载)

OSG世界坐标转屏幕坐标 #define M(row,col) m[col * 4 + row] void Transform_Point(double out[4], const double m[16], const double in[4]){    out[0] = M(0, 0) * in[0] + M(0, 1) * in[1] + M(0, 2) * in[2] + M(0, 3) * in[3];    out[1] = M(1, 0) * in[0] + M(1, 1) * i

[翻译]观察变换View Transform (Direct3D 9)

这一节介绍在Direct3d中观察变换的基本概念和怎么去设置观察矩阵. 视口变换把观察者放在世界坐标系中,并把顶点转化到摄像机空间.在摄像机空间,摄像机或者说观察者在原点,观察方向为z轴正向.Direct3d使用左手坐标系,所以z轴正向进入场景.观察矩阵把重新变换世界中的物品.摄像机位置.摄像机空间原点和方向. 有许多方法可以创建观察矩阵.摄像机在世界空间中的逻辑位置和方向被用作起始点来创建观察矩阵,得到观察矩阵会被应用于场景中的三维建模.观察矩阵平移和旋转在摄像机空间的模型,将他们放入摄像机空