zoukankan      html  css  js  c++  java
  • gluLookAt、glViewport()、glOrtho和gluPerspective参数分析

    记性不好 ,学习opengl的时候,总是忘记视口和投影变换函数配合时需要注意的地方,导致窗口内看不到三维物体。所以写在这以方便提醒自己。(原创,转载请注明出处)

    一、 gluLookAt和投影

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

      gluLookAt的前三个参数定义了观察点的位置,但同时也定了投影函数如正交投影函数各个参数的原点!

      

      正交投影是指物体和照相机之间的距离并不影响他看上去的大小。

    void glOrtho(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top,GLdouble near,GLdouble far)各参数意义如图所示,用来标记正交空间长方体。

                    

       

        若在程序中有glOrtho(-2.0,2.0,-2.0,2.0,5.0,100.0);和gluLookAt(1.0,0.0,0.0,1.0,0.0,-4.0,0.0,1.0,0.0);而物体坐标为(0,0,-10)则表示以(1,0,0)点为原点定义了一个宽为4高为4长为95的立方体,其左下角绝对坐标为(1-2,0-2,0-5)=(-1,-2,-5),物体显示时偏左。

                                                                                                   

        若物体坐标为(0,0,-4) 此时会显示黑屏。因为物体在正交立方体外。

     

        对于透视投影函数void gluPerspective(GLdouble fovy, //角度

                          GLdouble aspect,//视景体的宽高比

                          GLdouble zNear,//沿z轴方向的两裁面之间的距离的近处

                          GLdouble zFar //沿z轴方向的两裁面之间的距离的远处)

       其中,zNear和zFar两个参数也是以观察点为原点的相对坐标。

    二、投影变换到视口变换

      视口是一个矩形的窗口区域,三维图像通过映射生成二维平面的像素后,就是在这片区域绘制的。默认情况下,视口被设置为打开窗口的整个像素矩形。

         glViewport(GLint x,GLint y,GLsizei width,GLsizei height)定义了视口在窗口中的区域同时也规定了二维的像素平面到视口区域的映射关系。

      

                                                     

        若有glViewport(0,0,w/2,h),即有:

                                 

    也可以利用glViewPort()生成多窗口模式:

        glViewport(0.0,0.0,afxw/2,afxh/2);
        glCallList(box);
         glViewport(afxw/2,0.0,afxw/2,afxh/2);     
        glCallList(box);
        glViewport(0.0,afxh/2,afxw/2,afxh/2);     
        glCallList(box);
        glViewport(afxw/2,afxh/2,afxw/2,afxh/2);     
        glCallList(box);

                      生成效果如图所示:                          

                                                                                                         2012-11-15   01:31:37

  • 相关阅读:
    css技巧---电子表体字体引入
    解决for循环,暂停3s,在执行下次循环
    node 将汉字转化为拼音
    针对CMS中的tag标签理解
    博客园上传markdown文件方法
    正则表达式匹配非某字符串的情况
    ubuntu 20.04 MySQL的workbench无法连接
    在ubuntu20.04上使用Navicat客户端
    如何提升git clone的速度
    jenkins出现故障,报错HTTP ERROR 403 No valid crumb was included in the request
  • 原文地址:https://www.cnblogs.com/lydyy/p/2770854.html
Copyright © 2011-2022 走看看