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. [IT学习]sql 入门及实例

    sql 是一种数据库查询语言,可以让你很快的查询到数据.其实一般情况下,你也可以采用excel来查询数据库数据. 但是人们通常认为sql会更加灵活和方便一些. sql学习的入门网站: http://w ...

  2. 常用的PHP数据库操作方法(MYSQL版)

    常用的PHP数据库操作方法(MYSQL版) 作者: 字体:[增加 减小] 类型:转载 时间:2011-06-08   最近一直在折腾自己的网站首页,写的大部分PHP脚本都要用到和MYSQL数据库相关的 ...

  3. 让你的PHP更安全之PHP.ini

    让你的PHP更安全之PHP.ini 发布时间:2013-05-02 12:43:06   来源:PHP100论坛   评论:0 点击: 次 [字号:大 中 小] QQ空间新浪微博腾讯微博人人网豆瓣网百 ...

  4. XPath学习:parent,child

    XPath 是一门在 XML 文档中查找信息的语言.XPath 可用来在 XML 文档中对元素和属性进行遍历. XPath 是 W3C XSLT 标准的主要元素,并且 XQuery 和 XPointe ...

  5. 五一结束,北戴河,yy,差一点,不太敢

    collectionView Cell 设置颜色,蓝色,但是其他cell颜色也蓝色了,因为只写了if 没写else if (indexPath.item == 0) { cell.background ...

  6. Calculate its MTBF assuming 2000 FITS for each DRAM

    COMPUTER ORGANIZATION AND ARCHITECTURE DESIGNING FOR PERFORMANCE NINTH EDITION A common unit of meas ...

  7. [转载]:Delphi xe7并行编程快速入门

    现在多数设备.计算机都有多个CPU单元,即使是手机也是多核的.但要在开发中使用多核的优势,却需要一些技巧,花费时间编写额外的代码.好了,现在可以使用Delphi做并行编程了. 在Delphi.C++ ...

  8. Git相关的项目

    1.posh-git Git的PowerShell扩展 项目地址: https://github.com/dahlbyk/posh-git 可以用psget快速安装扩展模块,psget下载安装地址 h ...

  9. 原生js实现跑马灯抽奖效果

    目前好多的微信活动都有一些抽奖活动,其中就有跑马灯. <!DOCTYPE html> <html> <head> <title>跑马灯效果</ti ...

  10. ubuntu 64bit arm-linux-gcc: No such file or directory 解决

    通过下面这个解决 ubuntu 64bit  arm-linux-gcc: No such file or directory 安装 sudo apt-get install lsb-core解决 h ...