首先,我们看看glOrtho这个函数的形参是怎么样的,不同书本不同,主要有两个版本:
glOrtho(GLDouble left, GLDouble right, GLDouble bottom, GLDouble top, GLdouble near, GLdouble far);
glOrtho(GLDouble xmin, GLDouble xmax, GLDouble ymin, GLDouble ymax, GLdouble zmin, GLdouble zmax);
相信大家都明白什么意思,那么哪个版本比较好呢?我个人觉得第二个版本比较好理解,而且这个版本如果放在没有进行过视图变换的情况下是比较好理解,也就是说刚初始化,照相机是位于原点,视线朝向Z轴负方向。因为默认情况下,glOrtho所构造的视景体是一个边长为2的立方体,也就是glOrtho(-1,1,-1,1,-1,1);
了解完上面的基础知识,下面就继续谈一谈这个视景体位置永远都在x,y,z(-1,1,-1,1,-1,1)这个范围里面的吗?我通过做实验发现视景体的位置还要取决于glLookAt这个函数,这个函数的参数主要有三组,分别是观察点位置、视点位置和一个方向。其中观察点位置决定视景体位置,视点位置和方向决定视景体姿态。这里要区别位置跟姿态的区别,既然大家都是OpenGL高手我就不在这点上班门弄斧了。下面就看看我的论证实验吧~~~
实验准备:
(1)用到的glOrtho(-2,2,-2,2,-2,2); 也就是说边长为4的视景体。
(2) 我会在原点处画一个边长为2的绿色正方形,记住是正方形!然后在(0,0,1.5)位置上画一个边长为 0.5的红色正方体。具体看下图吧,第一幅是在X-Y平面上的投影,第二幅是在Z-X上的投 影。还有 一点就是图形正面是以填充模式画,背面是以线框模式画的,一会儿出来的效果是容易分辨些。
这样好像看得不太清楚明白,好吧,看看我亲手画的草图吧,本来想找Visio那种软件画,但是很麻烦,所以 还是自己亲手画来得比较简单。画得有点难看,大家就将就一下吧~
再贴一下主要代码:
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-2,2,-2,2,-2,2);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
//gluLookAt(0,0,2.1, 0,0,0, 0,1,0);
//glCallList(ID_COORDINATY);
glLineWidth(5.0);
glPolygonMode(GL_FRONT, GL_FILL); // 设置正面为填充模式
glPolygonMode(GL_BACK, GL_LINE); // 设置反面为线形模式
glColor3f(0.1,0.5,0.3);
glRectf(-1.0f, -1.0f, 1.0f, 1.0f);
glTranslatef(-0.75,0.75,1.5);
glColor3f(1,0,0);
glRectf(-0.25f,-0.25f, 0.25f, 0.25f);
glFlush();
}
然后我都不知道怎么说下去了,先列举出几个临界位置的现象先吧~~~
情况一:gluLookAt(0,0,2, 0,0,0, 0,0,1)与gluLookAt(0,0,2.1, 0,0,0, 0,0,1)。看图有真相~
情况二:gluLookAt(0,0,3.5, 0,0,0, 0,0,1)与gluLookAt(0,0,3.6, 0,0,0, 0,0,1)。看图有真相~
情况三:gluLookAt(0,0,-0.5, 0,0,0, 0,0,1)与gluLookAt(0,0,-0.6, 0,0,0, 0,0,1)。看图有真相~
情况四:gluLookAt(0,0,-2, 0,0,0, 0,0,1)与gluLookAt(0,0,-2.1, 0,0,0, 0,0,1)。看图有真相~
看了上面四种情况应该都知道发生啥事了吧,简单来说就是你的观察点位置移动多少,视景体位置就移动多少。例如上面的情况一:观察点在Z轴2位置上,然后将2分别与zmin,zmax相加就得到一个范围[0,4],也就是说视景体的实际位置相对于原来的位置向Z轴正方向移动了两个单位,这样子的话,绿色正方形方形正好在视景体里面,如果改成2.1,那么绿色正方形方形就不在视景体里面了,所以看不到,下面几种情况都是这样子的,是不是非常简单呢~~~好了,那如果我想在不改变观察点的位置也能看到绿色长方形那怎么办,哎,太简单的答案我都不好意思说出来了,你们肯定知道的,当然把视景体的zmin,zmax加大啦,在情况一种可以改glOrtho(-2,2,-2,2,-2.1,2.1);这时候有人可能会问如果只改zmin行不行,那你可以试试,反正我试过是不可以的。为啥?我也不知道~~~
在这里我们只是在单根轴上验证,如果我们的观察点不是在轴上呢?其实可以类推的,假如我们的视点是在(2,2,0),那么我们可以想象,本来在原点上有一个边长为4的长方体,它以原点为中心也就是说长方体的中心首先移动到(2,2,0),然后因为视点是(0,0,0),所以就旋转到一定角度。其实就是把长方体旋转后正对着原点,这样子,如果物体在这个长方体里面就可以显示出来,否则就显示不出来。
好了,这一篇文章就先介绍到这里,说实话写技术文章很麻烦,费时间,最重要的这篇文章没啥水平,所以很佩服那些大牛可以写出有水准的文章,以后要多锻炼才行。下一篇就会针对这一篇聊聊一
些小细节。