小谈glOrtho(一)


   首先,我们看看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上的投 影。还有                         一点就是图形正面是以填充模式画,背面是以线框模式画的,一会儿出来的效果是容易分辨些。      
          
                        
              小谈glOrtho(一)_第1张图片   小谈glOrtho(一)_第2张图片

           这样好像看得不太清楚明白,好吧,看看我亲手画的草图吧,本来想找Visio那种软件画,但是很麻烦,所以          还是自己亲手画来得比较简单。画得有点难看,大家就将就一下吧~

           小谈glOrtho(一)_第3张图片   小谈glOrtho(一)_第4张图片

     再贴一下主要代码:
          
         
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)。看图有真相~
   
        小谈glOrtho(一)_第5张图片   小谈glOrtho(一)_第6张图片

     情况二:gluLookAt(0,0,3.5,  0,0,0,  0,0,1)与gluLookAt(0,0,3.6,  0,0,0,  0,0,1)。看图有真相~

        小谈glOrtho(一)_第7张图片   小谈glOrtho(一)_第8张图片

     情况三:gluLookAt(0,0,-0.5,  0,0,0,  0,0,1)与gluLookAt(0,0,-0.6,  0,0,0,  0,0,1)。看图有真相~

       小谈glOrtho(一)_第9张图片    小谈glOrtho(一)_第10张图片

    情况四:gluLookAt(0,0,-2,  0,0,0,  0,0,1)与gluLookAt(0,0,-2.1,  0,0,0,  0,0,1)。看图有真相~

      小谈glOrtho(一)_第11张图片    小谈glOrtho(一)_第12张图片


 
    看了上面四种情况应该都知道发生啥事了吧,简单来说就是你的观察点位置移动多少,视景体位置就移动多少。例如上面的情况一:观察点在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),所以就旋转到一定角度。其实就是把长方体旋转后正对着原点,这样子,如果物体在这个长方体里面就可以显示出来,否则就显示不出来。


   好了,这一篇文章就先介绍到这里,说实话写技术文章很麻烦,费时间,最重要的这篇文章没啥水平,所以很佩服那些大牛可以写出有水准的文章,以后要多锻炼才行。下一篇就会针对这一篇聊聊一 些小细节。

你可能感兴趣的:(小谈glOrtho(一))