`
v5qqcom
  • 浏览: 1285185 次
文章分类
社区版块
存档分类
最新评论

OpenGL函数思考-gluPerspective

 
阅读更多

OpenGL函数思考-gluPerspective

函数原型:

void gluPerspective(GLdouble fovy, GLdouble aspect,GLdouble zNear,GLdouble zFar)

参数说明:

fovy:指定视景体的视野的角度,以度数为单位,y轴的上下方向

  aspect:指定你的视景体的宽高比(x 平面上)

  zNear: 指定观察者到视景体的最近的裁剪面的距离(必须为正数)

  zFar: 指定观察者到视景体的最远的裁剪面的距离(必须为正数)

如图

函数说明:

gluPerspective()这个函数设置透视投影矩阵,一般在执行命令glMatrixMode(GL_PROJECTION)和glLoadidentity()之后使用;它指定了观察的视景体在世界坐标系中的具体大小,一般而言,其中的参数aspect应该与窗口的宽高比大小相同。比如说,aspect=2.0表示在观察者的角度中物体的宽度是高度的两倍,在视口中宽度也是高度的两倍,这样显示出的物体才不会被扭曲

由gluPerspective()产生的矩阵是当前矩阵与指定的矩阵相乘得到的,就好像是调用glMatrix()产生的矩阵一样。为了使透视矩阵替代当前矩阵,在调用gluPerspective()之前要先调用glLoadidentity()这个函数(就是把当前矩阵重置为单位矩阵)。

透视原理:

我们知道,远处的东西看起来要小一些,近处的东西看起来会大一些,这就是透视原理,如下图所示




假设那两条线表示公路,理论上讲,它们的两条边是平行的, 但现实情况中,它们在远方(可以无限远)总要相交于一点,实际线段AB的长度=CD的长度,只是在此例中使用了透视角,故会有如上的效果,是不是很接近现实的情况?

结合gluPerspective()这个命令:
zNear,眼睛距离近处的距离,假设为10米远,请不要设置为负值,OpenGl就傻了,不知道怎么算了,
zFar表示远处的裁面,假设为1000米远,
就是这两个参数的意义了,

再解释下那个"眼睛睁开的角度"是什么意思,首先假设我们现在距离物体有50个单位距离远的位置, 在眼睛睁开角度设置为45时,请看大屏幕:


我们可以看到,在远处一个球,很好玩哈,现在我们将眼睛再张开点看,将"眼睛睁开的角度"设置为178(180度表示平角,那时候我们将什么也看不到,眼睛睁太大了,眼大无神),我们只看到一个点,因为我们看的范围太大了,这个球本身大小没有改变,但是它在我们的"视界"内太小了;





反之,我们将眼睛闭小些,改为1度看看会出现什么情况呢?在我们距离该物体3000距离远,"眼睛睁开的角度"为1时,我们似乎走进了这个球内,这个是不是类似于相机的焦距?





当我们将"透视角"设置为0时,我们相当于闭上双眼,这个世界清静了,我们什么也看不到。

分享到:
评论

相关推荐

    OpenGL 库函数汇总(中文分类)CHM

    目前OpenGL的函数主要包含在3个库中 1.GL 函数库 2.GLU 函数库 3.GLUT 函数库 1.GL 库函数 =================================== 颜色编辑 ------------------- glShadeModel 选择平面明暗模式或光滑明暗...

    OpenGL读取3DS文件示例

    使用OpenGL读取3DS文件的示例代码。 演示说明了3DS文件的结构、三维控件中视线、旋转设置,以及简单的动画...如果读取结果是黑屏,往往是视角和视场设置错误,可以查看三维数据的位置,更改gluLookAt和gluPerspective。

    OpenGL基本框架(SDI)1.2

    http://blog.csdn.net/whucv/article/details/8150537 ArchieOpenGL基础教程搭建OpenGL框架(SDI), 三维显示 gluLookAt gluperspective。学习使用gluPerspective和gluLookAt函数。

    OpenGl实验报告.doc

    gluPerspective(45, fAspect, 1.0, 600.0);//设置透视投影矩阵 glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void Satellite() //增加卫星 { for (int n=0; n[i]; n++) { glPushMatrix(); glRotatef(30.0f+6*n...

    opengl 期末复习资料

    如何使用OpenGL函数来实现?要求在照相机改变时,该程序应该仍然有效。 7、 如何实现纹理的反走样?说明其原理。 8、 写出场景的反走样算法,并说明其原理。 9、 如何实现采用立方体映射实现的环境映射,写出立方体...

    opengl的太阳系模型

    //对齐像素字节函数 glGenTextures(1,texName); //第一个参数指定表明获取多少个连续的纹理标识符 glBindTexture(GL_TEXTURE_2D , *texName); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); ...

    OpenGL透视变换详解

    Void gluPerspective(GLdouble fovy,GLdouble aspect, GLdouble near, GLdouble far) 函数作用: 创建一个表示对称投影视图矩阵,并把它与当前矩阵相乘。Fovy是yz平面上视野的角度,它的值必须为[0.0,180.0]。aspect...

    gertt点阵图读取器(opengl)

    gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,1000.0f); glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix glLoadIdentity(); // Reset The Modelview Matrix } int ...

    OpenglES lookat,perspective and Ortho

    自己封装的glulookat,gluperspective and gluOrtho,可以在任何平台使用

    opengl画图程序附带源代码

    gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,1000.0f); glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix glLoadIdentity(); // Reset The Modelview Matrix } int InitGL(GLvoid) // ...

    GL包含头文件.rar

    #include "GL/GLU.H" #include "GL/GL.H" ...glWidget.obj:-1: error: LNK2019: 无法解析的外部符号 gluPerspective,该符号在函数 -1: error: LNK2019: 无法解析的外部符号 gluLookAt,该符号在函数

    Camera-Movement:现在,我们在添加Camera并使用gluLookAt函数并添加一些照相机变换之前添加视图转换,直到达到类似这样的效果

    SBE306B-作业3-摄像机移动 在以下人员的监督下: ( 和工程 ... gluPerspective ( 65.0 , (GLfloat)1024 / (GLfloat)869, 1.0, 60.0); 并在显示函数的gluLookAt添加gluLookAt函数 全局变量 double eye[] = { 0

    doom-fcg:最终计算机图形学工作

    例如,不能使用以下在Web教程中常用的函数:gluLookAt(),gluOrtho2D(),gluPerspective(),gluPickMatrix(),gluProject(),gluUnProject(),glm :: lookAt() ,glm :: ortho(),glm ::透视(),...

    计算机图形学制作时钟源代码

    PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL| PFD_DOUBLEBUFFER|PFD_SUPPORT_GDI, PFD_TYPE_RGBA, 24, 0,0,0,0,0,0, 0, 0, 0, 0,0,0,0, 32, 0, 0, PFD_MAIN_PLANE, 0, 0,0,0 }; this->m_GLPixelIndex ...

    基于粒子系统的火焰

    gluPerspective(45.0f,1.3333f,0.1f,1000.0f); glMatrixMode(GL_MODELVIEW); // Set The Blending Function For Translucency glBlendFunc(GL_SRC_ALPHA,GL_ONE); glEnable(GL_BLEND);

Global site tag (gtag.js) - Google Analytics