区分glFrustum和gluPerspective

来源:互联网 发布:中国网络作家排名 编辑:程序博客网 时间:2024/05/22 14:33

区分glFrustum和gluPerspective

(1)

先说一下glFrustum,当然这两个都是创建视图,都可以达到同样的效果。

函数原型:

void glFrustum(GLdouble left,GLdouble Right,GLdouble bottom,GLdouble top,GLdouble near,GLdouble far);


先上图,虽然画的很糟糕(图上说明与函数参数相对应,45度是将要得出的广角先不考虑):

(灰色区域和DE后区域为不可见区,蓝色区域为可见区)

如果希望得到45度的广角,又希望所画的最小范围为(-2,-2)到(2,2)即near面的范围(即BC长为4),继而可以得到near值的大小为(2/tan(22.5))

,约为4.838,即AA‘为4.838

举个例子(画一个满屏的三角形):

[html]view plaincopyprint?
  1. void Reshape(int width, int height)//重绘窗口  
  2.   
  3. {  
  4.   
  5.  // 创建透视效果视图  
  6.   
  7. glMatrixMode(GL_PROJECTION);  
  8.   
  9.     glLoadIdentity();  
  10.   
  11. glFrustum(-2, 2, -2, 2, 4.828, 100);  
  12.   
  13. glViewport(0, 0, width, height);  
  14.   
  15.     glMatrixMode(GL_MODELVIEW);  
  16.   
  17. }  
  18.   
  19. void Display(void)  
  20.   
  21. {  
  22.   
  23.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);  
  24.   
  25. glTranslatef(0.0f, 0.0f, -4.828);//将球移入near内  
  26.   
  27.     glBegin(GL_TRIANGLES);//画一个低边为4的三角形,与最小平面范围等大  
  28.   
  29. glVertex3d(-2, -2, 0);  
  30.   
  31. glVertex3d(2, -2, 0);  
  32.   
  33. glVertex3d(0, 2, 0);  
  34.   
  35. glEnd();  
  36.   
  37.     glutSwapBuffers();  
  38.   
  39. }  
void Reshape(int width, int height)//重绘窗口{ // 创建透视效果视图glMatrixMode(GL_PROJECTION); glLoadIdentity();glFrustum(-2, 2, -2, 2, 4.828, 100);glViewport(0, 0, width, height); glMatrixMode(GL_MODELVIEW);}void Display(void){ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glTranslatef(0.0f, 0.0f, -4.828);//将球移入near内 glBegin(GL_TRIANGLES);//画一个低边为4的三角形,与最小平面范围等大glVertex3d(-2, -2, 0);glVertex3d(2, -2, 0);glVertex3d(0, 2, 0);glEnd(); glutSwapBuffers();}

运行结果:()

                             

 

当我们对函数的参数设置不恰当时,就会发生一些一想不到的效果:

比如将参数设为: glFrustum(-10, 10, -10, 10, 0.1, 100);//相当这个广角很大,相当把眼睛睁开接近180度(有谁能做到吗),结果是什么都没有,但是用glPerspective设

为接近180度,会发现图形显得很小很小,因为你设置的是看见整个视野......

(2)

gluPerspective

函数原型:

void gluPerspective(GLdouble fovy,GLdouble aspect,GLdouble zNear, GLdouble zFar);
同样达到glFrustum的效果,此时fovy对应上图的45度,aspect为宽高比(即top边与right边的长度比),zNear和zFar概念和glFrustum相同

例子(得到和上一个例子一样的效果)

[html]view plaincopyprint?
  1. void Reshape(int width, int height)  
  2. {  
  3.      // 创建透视效果视图  
  4.     glMatrixMode(GL_PROJECTION);  
  5.     glLoadIdentity();  
  6.     //glFrustum(-2, 2, -2, 2, 4.828, 100);  
  7.     gluPerspective(45.0f,1,4.828f,100.0f);//广角为45度,  
  8.     glViewport(0, 0, width, height);  
  9.     glMatrixMode(GL_MODELVIEW);  
  10. }  
  11.   
  12. void Display(void)  
  13. {  
  14.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);  
  15.     glTranslatef(0.0f, 0.0f, -4.828f);  
  16.     glBegin(GL_TRIANGLES);  
  17.         glVertex3d(-2, -2, 0);  
  18.         glVertex3d(2, -2, 0);  
  19.         glVertex3d(0, 2, 0);  
  20.     glEnd();  
  21.               
  22.     glutSwapBuffers();  
  23. }  
void Reshape(int width, int height){ // 创建透视效果视图 glMatrixMode(GL_PROJECTION); glLoadIdentity(); //glFrustum(-2, 2, -2, 2, 4.828, 100); gluPerspective(45.0f,1,4.828f,100.0f);//广角为45度, glViewport(0, 0, width, height); glMatrixMode(GL_MODELVIEW);}void Display(void){ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glTranslatef(0.0f, 0.0f, -4.828f); glBegin(GL_TRIANGLES); glVertex3d(-2, -2, 0); glVertex3d(2, -2, 0); glVertex3d(0, 2, 0); glEnd(); glutSwapBuffers();}

运行结果:(和glFrustum效果一样)

                             

总之,习惯用那个就用哪个,只不过个人觉得glPerspective更直观一些更方便不容易睁得过头了呵,但是要包含glu.h哦......以上纯属个人见解笔记呵!!
原创粉丝点击