夏天/isummer

Sun of my life !Talk is cheap, Show me the code! 追风赶月莫停留,平芜尽处是春山~

博客园 首页 新随笔 联系 管理

 

(1)glEnable(GL_DEPTH_TEST)作用

  glEnable(GL_DEPTH_TEST): 用来开启更新深度缓冲区的功能,也就是,如果通过比较后,深度值发生变化了,会进行更新深度缓冲区的操作。启动它,OpenGL就可以跟踪再Z轴上的像素,这样,它只会再那个像素前方没有东西时,才会绘画这个像素。

  在做绘画3D时,这个功能最好启动,视觉效果比较真实。

(2)glClearDepth:设置深度缓存的清除值
  void glClearDepth(GLclampd depth);
  参数
      depth 指定清除深度缓存时使用的深度值。
  说明
  本函数指定用glClear清除深度缓存时所使用的深度值,该值的范围在[0,1]之间。

(3)glClearColor :设置颜色缓存的清除值
  C语言描述
  void glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
  参数
  red,green,blue,alpha 指定清除颜色缓存时所使用的红、绿、蓝和alpha值。
  说明
  指定由glClear清除颜色缓存时所使用的红、绿、蓝和alpha值,指定值的范围固定为[0.0f,1.0f]。

(4) glClear :将缓存清除为预先的设置值
C语言描述
void glClear(GLbitfield mask);
参数
    mask 对指定的需要清除的缓存进行按位或屏蔽操作,这四个屏蔽值:GL_COLOR_BUFFER_BIT,GL_DEPTH_BUFFER_BIT,GL_ACCUM_BUFFER_BIT
         和GL_STENCIL_BUFFER_BIT。
  说明
  本函数只有一个变量,这个变量对所清除的缓存值进行按位或操作,这些值如下:
  GL_COLOR_BUFFER_BIT 指定当前被激活为写操作的颜色缓存。
  GL_DEPTH_BUFFER_BIT 指定深度缓存。
  GL_ACCUM_BUFFER_BIT 指定累加缓存。
  GL_STENCIL_BUFFER_BIT 指定模板缓存。

(5)gluLookAt函数原型为:
  void gluLookAt(GLdouble eyex,GLdouble eyey,GLdouble eyez,GLdouble centerx,GLdouble centery,GLdouble centerz,GLdouble upx,GLdouble upy,GLdouble upz);
  该 函数简单来说可以理解为在一个三维世界中,摄像机的坐标位置以及朝向等信息,要确定一个摄像机子世界中的状态,就需要该函数的参数来确定。前三个参数为摄 像机的位置坐标,在该位置上,摄像机可以360°进行观察;那么接下来的三个参数标示摄像机正对着的目标位置,也就是摄像机所观察的方向。最后三个参数决 定了摄像机的放置状态,像是在现实世界中,摄像机可以使正放,侧放或者倒立放置等等,一样的,在opengl中,我们的摄像机也可以这样调整,如果最后三 个参数为(0,1,0),那么标示摄像机是正立着的,(0,-1,0)的时候则是倒立放置的。

  该函数定义一个视图矩阵,并与当前矩阵相乘。

  (整个都是相对于世界坐标系的位置)

  第一组eyex, eyey,eyez 相机在世界坐标的位置
  第二组centerx,centery,centerz 相机镜头对准的物体在世界坐标的位置
  第三组upx,upy,upz 相机向上的方向在世界坐标中的方向
  你把相机想象成为你自己的脑袋:

  第一组数据就是脑袋的位置
  第二组数据就是眼睛看的物体的位置
  第三组就是头顶朝向的方向(因为你可以歪着头看同一个物体)。

  看图,在世界坐标系中画一个水壶:定义观察点情况:

  (a):gluLookAt(0.0,0.0,5.0, 0.0,0.0,0.0, 0.0,1.0,0.0); 相当于我们的脑袋位置在世界坐标系(0.0,0.0,5.0)处,眼睛望向(0.0,0.0,0.0),即原点。后面的三个参数(0.0,1.0,0.0),y轴为 1,其余为0,表示脑袋朝上,就是正常的情况。

  (b):gluLookAt的后三个参数设置为(0.0,-1.0,0.0),即y轴为-1,其余为0。这样表示脑袋向下,即人眼倒着看,看到的效果。

  (c):再次修改gluLookAt的后三个参数为(1.0,0.0,0.0);x轴为1,其余为0.即人的脑袋像右歪90度来看,即顺时针转90度(换个角度思考就是壶逆时针转90度),猜想看到的结果应该是壶嘴在上,壶盖在右,壶底在左,壶柄在下,如图。

            

          (a)                        (b)                    (c)          

(6)glOrtho()的函数原型为:
  void glOrtho(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top,GLdouble near,GLdouble far);
该函数决定了我们在三维世界中所能观察到的一个矩形区域,第一三五个参数决定了矩形区域左下前点的位置,二四六决定矩形区域右上后点的位置,注意该点不是世界坐标,而是相对摄像机的位置

  这个函数定义了一个“视景体”,上述的参数不是“世界坐标系”中的坐标,而是相对于视点的距离

     void gluLookAt(GLdouble eyex,GLdouble eyey,GLdouble eyez,
                                   GLdouble centerx,GLdouble centery,GLdouble centerz,
                                   GLdouble upx,GLdouble upy,GLdouble upz);

(7)视景体的定义

   glOrtho          :正交投影,摄像机可以位于裁剪体内,所以near和far可以取两个正值或者一正一负

       glFrustum     :透视投影,摄像机不可以位于裁剪体内,所以near和far都必须去正值,它的参数矩阵定义了才简体以及投影的类型,但是未定义摄像机的方位。GL 中的摄像机位于原点,并指向了Z轴的负方向。函数glFrustum只是修改了摄像机的 透镜,并非位置,为了改变位置或者朝向可以借助于模型视图矩阵相对于摄像机移动场景中的对象,或者通过GL变换,或者用函数gluLookAt().以为 glFrustum对参数far和near非常敏感,修改near和far则远景可能就影响很大,所以常用于观察近景。

       glPerspective:也是用于透视投影,功能和glFrustum非常相似,参数不一样。相对于glFrustum来说不常用。

    

  视景体是相对于“视点”位置的。参数不是坐标,而是距离。

  具体解释,参考我的另一个博客说明,视景体的详细介绍。

  http://www.cnblogs.com/icmzn/p/5003600.html

 

posted on 2015-12-09 19:15  夏天/isummer  阅读(468)  评论(0编辑  收藏  举报