2019独角兽企业重金招聘Python工程师标准>>>

终于搞明白gluPerspective和gluLookAt的关系了

函数原型
gluLookAt(GLdoble eyex,GLdouble eyey,GLdouble eyez,GLdouble centerx,GLdouble centery,GLdouble centerz,GLdouble upx,GLdouble upy,GLdouble upz);

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

一个一个来,首先得设置gluPerspective,来看看它的参数都表示什么意思
fovy,这个最难理解,我的理解是,眼睛睁开的角度,即,视角的大小,如果设置为0,相当你闭上眼睛了,所以什么也看不到,如果为180,那么可以认为你的视界很广阔,
aspect,这个好理解,就是实际窗口的纵横比,即x/y
zNear,这个呢,表示你近处,的裁面,
zFar表示远处的裁面,

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

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

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

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

我们可以看到,在远处一个球,,很好玩哈,
现在我们将眼睛再张开点看,将"眼睛睁开的角度"设置为178
(180度表示平角,那时候我们将什么也看不到,眼睛睁太大了,眼大无神)

我们只看到一个点,,,,,,,,,,,,,,,,,,,,,,,,,,,
因为我们看的范围太大了,这个球本身大小没有改变,但是它在我们的"视界"内太小了,

反之,我们将眼睛闭小些,改为1度看看会出现什么情况呢?

在我们距离该物体3000距离远,"眼睛睁开的角度"为1时,我们似乎走进了这个球内,这个是不是类似于相机的焦距?

当我们将"透视角"设置为0时,我们相当于闭上双眼,这个世界清静了,

我们什么也看不到,,,,,,,,,

现在来看gluLookAt(GLdoble eyex,GLdouble eyey,GLdouble eyez,GLdouble centerx,GLdouble centery,GLdouble centerz,GLdouble upx,GLdouble upy,GLdouble upz);

它共接受三对坐标,
分别为eye,center,up
故名思义,eye表示我们眼睛在"世界坐标系"中的位置,
center表示眼睛"看"的那个点的坐标,
最后那个up坐标表示观察者本身的方向,如果将观察点比喻成我们的眼睛,那么这个up则表示我们是正立还是倒立异或某一个角度在看,所看的影像大不相同,故此时需要指明我们现在正立,那么X,Z轴为0,Y轴为正即可,通常将其设置为1,只要表示一个向上的向量(方向)即可
球是画在世界坐标系的原点上的,即O(0,0,0)坐标上,我们的眼睛位于观察点A(0,0,100),Z轴向屏幕里看去的方向为负,屏幕外我们的位置,Z轴为正值,其实很好理解,即我们距离原点的距离,设置100,将观察到如下图所示的影像

如果我们向前或向后移动,则相应的图像会变大或变小,这里其实就是运用了透视原理,近处的物体大,远处的物体小,实际物体的大小是不变的,

同理改变center坐标(眼睛看去的那个点,可简单理解为视线的终点)也会影响球的大小,同样可以认为是改变了物体与观察点的距离所致,

最后那个up坐标表示观察者本身的方向,如果将观察点比喻成我们的眼睛,那么这个up则表示我们是正立还是倒立异或某一个角度在看,所看的影像大不相同,故此时需要指明我们现在正立,那么X,Z轴为0,Y轴为正即可,通常将其设置为1,只要表示一个向上的向量(方向)即可,我们指定0.1f或0.00001f异或1000.0f,效果是一样的,只要能表示方向即可,

以上理解了之后,来做一个测试
透视图不变,最远处仍为3000,近处为0.1

gluPerspective                            // 设置透视图
        (45,                            // 透视角设置为 45 度,在Y方向上以角度为单位的视野
        (GLfloat)x/(GLfloat)y,    // 窗口的宽与高比
        0.1f,                                // 视野透视深度:近点1.0f
        3000.0f                            // 视野透视深度:始点0.1f远点1000.0f
        );

将我们的观察点置于A(0,10,0),
将观察位置(视线终点)坐标置于(0,0,0)
然后在原点开始绘图,画一个V字形,并将Z轴的值从-1000递增加到+1000,增量为10,
代码如下

    glColor3f(0.5f, 0.7f, 1.0f);

glBegin(GL_LINES);
        for(int i=-1000;i<=1000;i+=10)
        {
            glVertex3f(0,0,i);
            glVertex3f(10,10,i);

glVertex3f(0,0,i);
            glVertex3f(-10,10,i);
        }
    glEnd();

F5运行效果如下图

上图证实了我们的推测

//---------------------------------------------
    //生成网络
    glColor3f(0.5f, 0.7f, 1.0f);
    int x=(int)(40*2);
    
    glBegin(GL_LINES);
            for(int i=-x;i<=x;i+=4)
            {
                glVertex3i(-x,0,i);
                glVertex3i(x,0,i);

glVertex3i(i,0,x);
                glVertex3i(i,0,-x);
            }
    glEnd();

//生成球体
    GLUquadricObj * pObj;
    pObj = gluNewQuadric();
    gluQuadricDrawStyle(pObj,GLU_LINE);
    gluQuadricNormals(pObj,GLU_SMOOTH);
    gluSphere(pObj,16,16,16);

转载于:https://my.oschina.net/gujianhan/blog/162808

终于搞明白gluPerspective和gluLookAt的关系了相关推荐

  1. gluPerspective和gluLookAt的关系

    参考文章 GL学习笔记(2) - 终于搞明白gluPerspective和gluLookAt的关系了(zz) gluPerspective的具体含义 解密--神秘的gluPerspective 函数原 ...

  2. 理解gluPerspective和gluLookAt的关系

    在网上查看到了这篇: 终于搞明白gluPerspective和gluLookAt的关系了(zz) http://cowboy.1988.blog.163.com/blog/static/7510579 ...

  3. matlab中异步电机y接法,电机接法Y和三角形什么区别,今天终于搞明白了!

    原标题:电机接法Y和三角形什么区别,今天终于搞明白了! 电动机三角形接法和星形接法区别: 1.异步电动机因其结构简单.价格便宜.可靠性高等优点被广泛应用.但在起动过程中起动电流较大,所以容量大的电动机 ...

  4. python和c混合编程 gil_终于搞明白python与gil

    感想:东看一篇文章西看一篇文章,终于把gil的概念理顺了 我们都知道,比方我有一个4核的CPU,那么这样一来,在单位时间内每个核只能跑一个线程,然后时间片轮转切换.但是Python不一样,它不管你有几 ...

  5. 感染新冠后为啥会丧失​嗅觉?最新《细胞》论文终于搞明白了!

    感染新冠后,患者的一大症状就是会丧失嗅觉,然而这一症状背后的机理却始终没有得到阐明.日前,顶尖学术期刊<细胞>上的一篇论文,终于揭开了背后的谜底--原来新冠病毒会让嗅觉受体出现下调,使得人 ...

  6. java的向下转型_终于搞明白向下转型的作用了,还不懂的进来看下.

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 之前一直搞不明白,向下转型的实际意义,虽然知道向下转型怎么写, 现在我来讲解下 向下转型 的实际作用,如果有错的话,大家可以指出, 如果认为我说的对的话可 ...

  7. 程序内存区域分配(五个段)--终于搞明白了

    在学习之前我们先看看ELF文件. ELF分为三种类型:.o 可重定位文件(relocalble file),可执行文件以及共享库(shared library),三种格式基本上从结构上是一样的,只是具 ...

  8. c语言主范式与编码,超详细!终于搞明白KMP算法

    小伙伴们好久不见,今天将开设"数据结构与算法"专栏,一起梳理一遍硬核课程的重要知识点,那我们开始吧 正文 「字符串匹配」是计算机的基本任务之一,举个栗子,有一个字符串"「 ...

  9. 深度解析|硬盘协议大全,终于搞明白SCSI、IDE、FC、SATA……

    一提到SCSI.IDE.FC.SATA--, 这些令人眼花缭乱的存储协议和接口之间都有怎样千丝万缕关系呢,今天就给大家科普大全. 一.顶层协议描述了什么 在存储系统中,上层协议可以泛指"指令 ...

最新文章

  1. 一篇让你搞懂 Nginx
  2. 一遍记住Java常用的八种排序算法与代码实现
  3. 数字经济时代,什么是关键资源?(算力篇)
  4. 这样配置,让你的 IDEA 好用到飞起来!
  5. 计算机网络早期结构图,第21讲 计算机网络应用基础(一).ppt
  6. 每日一个css效果之css sprites
  7. 这些贷款冷知识你知道多少?
  8. 地理生物高考成绩查询2021,2021北京中考地理生物成绩查询时间【已公布】
  9. PPC(Pocket PC)中显示二进制数组(byte[])类型的图片
  10. Jsonschema2pojo从JSON生成Java类(Maven)
  11. Android WebView与JS交互入门
  12. 集成hello到OpenDaylight发行版中
  13. 使用ISA Server 2006发布Exchange Server 2007安全的Web、安全的OWA和Outlook Anyw
  14. java发送qq邮件
  15. 浅谈软件项目中的需求分析与需求管理
  16. Thinkphp 6.0商城系统,B2C商城系统全新UI
  17. react脚手架配置
  18. Java音频格式转换,支持amr、aud、slk、silk转成mp3的程序
  19. 基于i.mx6q平台的NES模拟器移植
  20. 过滤多余的空格-C语言

热门文章

  1. 目标驱动的软件度量(选译)
  2. CLion 远程Linux服务器 开发调试
  3. [LeetCode][JavaScript]Invert Binary Tree 反转二叉树
  4. SpringBoot 应用程序启动过程探秘
  5. Linux系统调用的运行过程【转】
  6. 《数据中心虚拟化技术权威指南》一2.2 数据中心网络拓扑
  7. 【java】map的几种遍历方式
  8. iOS Cookie相关操作
  9. log-malloc2 0.2.4 发布
  10. FC3服务器配置一条龙