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

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

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

void glPerspective(GLdouble fov, GLdouble aspect, GLdouble near, GLdouble far)

fov是依据y方向的视角,aspect是近裁剪面的纵横比,当然远裁剪面也取这个值,near和far的意义和上面的一样。

透视投影的一个问题就是深度精度的损失,在显示设备中该问题很明显。问题出在深度缓存中深度的限制以及由透视投影引起的非线性比例变换。当近裁剪面非常靠近投影中心的时候,误差就非常大。

以下摘自网络,对参数讲的很经典:

OpenGL 关于视景台gluPerpective,glFrustum的理解

作者:华文广    [url]www.physdev.com [/url]
07/3/30

很多刚学OpenGL的朋友,都会对视景台的定义有很大的迷惑,这里以我的经验来解释一下,希望对大家有所帮助,
void glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far);
在这个函数中,有六下参数,这六个参数,都不是真实的世界坐标(虽然有些书上说它们是坐标),而指的是到眼睛的平面距离,
left,right分别指的是左右截面到眼睛(在XY平面上)的距离,这两个数不必一定要对称,甚至两个都可以大于或小于0;

          对称
    |-------------|
    |                 |
    |   eye        |
    |                 |
    |-------------|
  left(-1.0)     right(1.0)

====================================================
             不对称
           |-------------|
           |                 |
  eye   |                 |
           |                 |
           |-------------|
       left(1.0)     right(2.0)

视景体默认情况下,眼睛位置是在坐标原点(0.0f,0.0f,0.0f)处,视线指向Z轴的负向。
如果是这种情况,上图中的left,right的值,就刚好是与它们的世界坐标一一对应的。top和bottom也同样理解。
一种理解方式是这样:
眼睛是位于坐标原点,是逆着Z轴向屏幕里看的;
gluPerpective,glFrustum函数的zNear, zFar都是相对眼睛的距离,
其各自的负值为相对于坐标系原点的坐标值;
每个画的物体,其中心最开始都是位于坐标系的原点的,
通过glTranslate, glRotate函数,把物体移动到视景中,这样物体才可以被看得见;

但是事实上,眼睛可以是任何位置,视线也可以不平行于Z轴,这种情况情下,left,right,top,bottom,near,far,
它们指的就只是到眼睛的平面距离,与坐标没有一一对应的关系。

好像越说越复杂了。呵呵。

===============================================
你可以这样想:在眼睛前面有一个视景台,这个台体并不是固定的,而是随着你视线的转动而转动,
也就是说,视景台的正面和底面始终与视线垂直。那么,当你的眼睛是在(0,0,0)处,视线是指向Z的负向时,
视景台的近面(0.3)和远面(0.7)所对应的坐标,就是(-0.3,-0.7)
[code]
|Y                 (0.3)                 (0.7)
|                                             |
|0.0                   | -0.3           |-0.7
*eye-------------|--------------|-------> -Z
|                         |                   |
|                                             |
|[/code]再举个例子,如下图,眼睛在0.1处,视线指向X轴正向,
那么视景台也在X轴正向上,近面对应的坐标是0.4,远面对应的坐标是0.8
[code]
|Y                  (0.3)            (0.7)
|                                            |
|0.0      0.1       | 0.4            |0.8
-------eye *-----|--------------|------->X
|                        |                   |
|                                            |
|[/code]另外一种理解方式是这样的:
物体在空间中者有着其固定的位置。物体不被移动,
我们可以通过调整眼睛的位置,和视线的方向,来观看空间中的所有物体。

================================================
其实这是一个非常主观性的问题,
主要是看你如何去看待。
也就是说,我们可以设想眼睛不动,只移动空间中的物体。
但是我们也可以设想坐标系中的物体不动,我们只移动眼睛,
动作是相对的,但效果是一样的

对于3DMAX这样的绘图软件就是一种眼睛不动的做法。
但对于游戏,地形漫游之类的软件,则是采用,物体不动,只移动眼睛位置的方法。来模拟一个人在地形上走动

=====================================

前面我们说过,视景台是可以不对称的(这个特性有一些高级应用),
但大多的情况下我们还是会定义一下与视线对称的视景台。于是我们可以使用gluPerpective这个函数。
gluPerpective函数的zNear, zFar都是相对眼睛的(YZ平面)距离,fovy是视野角度。

glOrtho、glFrustum && glPerspective的更多相关文章

  1. OpenCASCADE Camera

    OpenCASCADE Camera eryar@163.com Abstract. OpenCASCADE introduce a new class Graphic3d_Camera for th ...

  2. 【转】OPENGL基本API概述

    本文信息资源来源于网络,欢迎转载!转载时请保留本文链接(http://www.shopliyang.com.cn/)! OpenGL中的gl库是核心库,glu是实用库,glut是实用工具库. gl是核 ...

  3. OpenGL(二)——函数库简述

    简述 1. OpenGL用到的库分为OpenGL核心库.OpenGL实用库.OpenGL辅助库和OpenGL工具库(不是必须) 2. OpenGL核心库 核心库包含有115个函数,函数名的前缀为gl ...

  4. 【转】OpenGL相关函数库介绍

    原文:http://blog.chinaunix.net/uid-20638550-id-1909182.html OpenGL 函数库相关的API有核心库(gl).实用库(glu).辅助库(aux) ...

  5. 【OpenGL游戏开发之二】OpenGL常用API

    OpenGL常用API 开发基于OpenGL的应用程序,必须先了解OpenGL的库函数.它采用C语言风格,提供大量的函数来进行图形的处理和显示.OpenGL库函数的命名方式非常有规律.所有OpenGL ...

  6. opengl 实体和网格绘图函数(基础)(转)

    http://blog.csdn.net/he_wen_jian/article/details/8594880 GLUT工具箱提供几种图形3维图形的函数: void glutWireSphere(G ...

  7. openGL中的gl,glu,glut

    OpenGL函数库相关的API有核心库(gl).实用库(glu).辅助库(aux).实用工具库(glut).窗口库(glx.agl.wgl)和扩展函数库等.gl是核心,glu是对gl的部分封装.glx ...

  8. OpenGL矩阵类(C++)

    概述 创建&初始化 存取器 矩阵运算 变换函数 实例:模型视图矩阵 实例:投影矩阵 概述 OpenGL固定功能管线提供4个不同类型的矩阵(GL_MODELVIEW.GL_PROJECTION. ...

  9. OpenGl And 视图

    OpenGl And 视图 标签(空格分隔): game 简介 本文主要介绍坐标系的观念, 以及在openGL中的视图及其相关的变换. 大纲 视图.模型.投影变换概念 Opengl中对各种变换的支持 ...

随机推荐

  1. 初始html5,遇到的第一个问题

    1.首先感到html5是html的延续,只是增加了新的标签属性,这是我的第一感觉 2.我写了几行画矩形的canvas入门代码,遇到了不显示问题 3.下面是我写完代码后的问题 刷新后还是这样 4.我的代 ...

  2. 用Editplus开发Java

    ☆ 准备工作 ①,已安装好jdk,同时配置系统变量(3个,JAVA_HOME,PATH,CLASSPATH) ②,电脑已安装Editplus,并做好设置. ☆ Editplus配置java开发环境 对 ...

  3. HTML5 :b/strong加粗,i/em倾斜区别

    解释1 <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="ut ...

  4. oracle imp导入库到指定表空间

    1.创建表空间 create tablespace example_tablespace datafile 'e:\****.dbf' size 10m reuse autoextend on nex ...

  5. [英语学习]儿童英语 sesamestreet

    最近在和我的孩子学习汉语,用在自己学习英语方面,就是多看小故事,多看儿歌. 以前孙小小分享过这个网站www.sesamestreet.org 现在找出来看看,还是很不错的. 搜索elbows and ...

  6. scapy 安装及简单测试

    关于scapy Scapy的是一个强大的交互式数据包处理程序(使用python编写).它能够伪造或者解码大量的网络协议数据包,能够发送.捕捉.匹配请求和回复包等等.它可以很容易地处理一些典型操作,比如 ...

  7. Nginx 报错: nginx: [error] open() "/usr/local/nginx/logs/nginx.pid" failed (2: No such file or directory) 的解决方法

    今天测试域名访问不了,登陆 Linux(Ubuntu)重启Nginx: nginx -s reload 结果报错: nginx: [error] open() : No such file or di ...

  8. php + ajax + html 简单跨域问题

    XMLHttpRequest cannot load http://localhost:8080/abc/index.php. No 'Access-Control-Allow-Origin' hea ...

  9. freebsd 显示中文

    来自 :http://francs3.blog.163.com/blog/static/405767272014659311700/ 只需在 ~/.cshrc 文件添加以下几行即可. --3 在~/. ...

  10. windbg sos版本不匹配问题解决

    dumpheap 时提示: 0:105> !dumpheap -stat The garbage collector data structures are not in a valid sta ...