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时,我们相当于闭上双眼,这个世界清静了,我们什么也看不到。

 

时间: 2024-09-20 09:28:20

OpenGL函数思考-gluPerspective的相关文章

OpenGL函数思考-gluLookAt

OpenGL函数思考-gluLookAt 函数原型:       void gluLookAt(GLdouble eyex,GLdouble eyey,GLdouble eyez,GLdouble centerx,GLdouble centery,GLdouble centerz,GLdouble upx,GLdouble upy,GLdouble upz) 参数说明:       eyex, eyey,eyez 指定视点的位置 centerx,centery,centerz 指定参考点的位置

OpenGL函数思考-glMatrixMode

OpenGL函数思考-glMatrixMode  函数原型:        void glMatrixMode(GLenum mode) 参数说明:        mode 指定哪一个矩阵堆栈是下一个矩阵操作的目标,可选值: GL_MODELVIEW,对模型视图矩阵堆栈应用随后的矩阵操作.可以在执行此命令后,输出自己的物体图形了. GL_PROJECTION,对投影矩阵堆栈应用随后的矩阵操作.可以在执行此命令后,为我们的场景增加透视. GL_TEXTURE,对纹理矩阵堆栈应用随后的矩阵操作.可以

OpenGL函数思考-glColor

OpenGL函数思考-glColor 函数原型:      glColor3b,glColor3d,glColor3f,glColor3i,glColor3s,glColor3ub,glColor3ui,glColor3us,glColor4b,glColor4d,glColor4f,glColor4i,glColor4s,glColor4ub,glColor4ui,glColor4us,glColor3bv,glColor3dv,glColor3fv,glColor3iv,glColor3sv

OpenGL函数思考-glClear

OpenGL函数思考-glClear 函数原型:       void glClear(GLbitfield mask); 参数说明:       GLbitfield:可以使用 | 运算符组合不同的缓冲标志位,表明需要清除的缓冲,例如glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)表示要清除颜色缓冲以及深度缓冲,可以使用以下标志位       GL_COLOR_BUFFER_BIT:    当前可写的颜色缓冲       GL_DEPTH_B

OpenGL函数思考-glBlendFunc

OpenGL函数思考-glBlendFunc 函数原型:      void glBlendFunc(GLenum sfactor,GLenum dfactor)参数说明:       sfactor:源颜色系融合方法,可取如下值GL_ZERO, GL_ONE, GL_DST_COLOR, GL_ONE_MINUS_DST_COLOR, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_COLOR, GL_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA, and

OpenGL函数思考-glLoadIdentity

OpenGL函数思考-glLoadIdentity 函数原型:      void glLoadIdentity(void) 函数说明:       OpenGL为我们提供了一个非常简单的恢复初始坐标系的手段,那就是调用glLoadIdentity()命令.该命令是一个无参的无值函数,其功能是用一个4×4的单位矩阵来替换当前矩阵,实际上就是对当前矩阵进行初始化.也就是说,无论以前进行了多少次矩阵变换,在该命令执行后,当前矩阵均恢复成一个单位矩阵,即相当于没有进行任何矩阵变换状态.       单

OpenGL函数思考-glTexImage2D

OpenGL函数思考-glTexImage2D 函数原型:       void glTexImage2D(GLenum target,GLint level,GLint components,GLsizei width, glsizei height,GLint border,GLenum format,GLenum type, const GLvoid *pixels); 函数说明:       定义一个二维纹理映射.其中       参数target是常数GL_TEXTURE_2D.   

OpenGL函数思考-glOrtho

  OpenGL函数思考-glOrtho 函数原型: void glOrtho(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top,GLdouble near,GLdouble far) 参数说明: 函数说明:         glOrtho()这个函数设置正摄投影矩阵,一般在执行命令glMatrixMode(GL_PROJECTION)和glLoadidentity()之后使用:使用glOrtho函数可以将当前的可视空间设置为正投

OpenGL函数思考-glRotatef

OpenGL函数思考-glRotatef 函数原型:       void glRotated(GLdouble angle,GLdouble x,GLdouble y,GLdouble z)       void glRotatef(GLfloat angle,GLfloat x,GLfloat y,GLdouble z) 函数说明:      这两个函数用来计算旋转矩阵,该矩阵围绕原点到点(x,y,z)的向量逆时针旋转angle度.