glOrtho、glFrustum && glPerspective

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是视野角度。

时间: 2024-10-29 19:10:09

glOrtho、glFrustum && glPerspective的相关文章

OpenCASCADE Camera

OpenCASCADE Camera [email protected] Abstract. OpenCASCADE introduce a new class Graphic3d_Camera for the Visualization module. The camera class provides object-oriented approach to setting up projection and orientation properties of 3D view. The pap

【转】OpenGL相关函数库介绍

原文:http://blog.chinaunix.net/uid-20638550-id-1909182.html OpenGL 函数库相关的API有核心库(gl).实用库(glu).辅助库(aux).实用工具库(glut).窗口库(glx.agl.wgl)和扩展函数库等. 从图1可以看出,gl是核心,glu是对gl的部分封装.glx.agl.wgl 是针对不同窗口系统的函数.glut是为跨平台的OpenGL程序的工具包,比aux功能强大.扩展函数库是硬件厂商为实现硬件更新利用OpenGL的扩

openGL从零学起之入门介绍

最近项目中涉及到了一些特效,如字体描边.场景调色和精灵的一些着色等,接触到了openGl部分,再加上之前有过unity3d的开发经验,就越发的对openGl感兴趣,应该说是对3D感兴趣吧.其实自己一直都感兴趣的就是虚拟现实的仿真技术和人工智能,希望以后能有机会进入这两个领域.废话不多说,直接开始openGl之旅,这个以前没接触过,有什么理解不到位或者完全错误的地方,请大神们直接指出,在此谢过了. 当前,三维图形编程工具中最为突出的是SGI公司的OpenGL(Open Graphics Langu

OpenGL的一些基本概念

首先厘清几个库文件之间的关系,即 gl, glu, glut,glaux 之间的区别 gl glu glut glu32 glut32 glut opengl 后缀为.a 或.lib. 带32,.lib后缀的一般是window平台下的,而.a后缀一般是linux平台下. 以下说明中带*后缀的函数表示该函数有多种版本 下表列出一些后缀字母,它们分别指定了OpenGL的ISO C实现所提供的数据类型 后缀 数据类型 典型的对应C语言类型 OpenGL类型 b 8位整数 singed char GLb

opengl基本库介绍

开发基于OpenGL的应用程序,必须先了解OpenGL的库函数.它采用C语言风格,提供大量的函数来进行图形的处理和显示.OpenGL库函数的命名方式非常有规律.所有OpenGL函数采用了以下格式: <库前缀><根命令><可选的参数个数><可选的参数类型> 库前缀,有gl.glu.aux.glut.wgl.glx.agl等等,分别表示该函数属于OpenGL那个开发库.    从函数名后面中还可以看出需要多少个参数以及参数的类型.I代表int型,f代表float

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

http://blog.csdn.net/he_wen_jian/article/details/8594880 GLUT工具箱提供几种图形3维图形的函数: void glutWireSphere(GLdouble radius, GLint slices, GLint stacks);  丝状球void glutSolidSphere(GLdouble radius, GLint slices, GLint stacks); 实心球void glutWireCube(GLdouble size

【转】OPENGL基本API概述

本文信息资源来源于网络,欢迎转载!转载时请保留本文链接(http://www.shopliyang.com.cn/)! OpenGL中的gl库是核心库,glu是实用库,glut是实用工具库. gl是核心,glu是对gl的部分封装,glut是OpenGL的跨平台工具库. gl中包含了最基本的3D函数,而glu似乎对gl的辅助,如果数学功底好,在不用glu的情况下,也是可以做出同样的效果.glut是基本的窗口界面, 是独立于gl和glu的,如果不喜欢用glut可以用MFC和Win32窗口等代替:但是

openGL学习过程中资料总结

1.网络学习资料 OpenGL中投影函数glOrtho().glFrustum()以及gluPerspective()以及函数的用法 原文地址:https://www.cnblogs.com/guanglun/p/12095765.html

OpenGl And 视图

OpenGl And 视图 标签(空格分隔): game 简介 本文主要介绍坐标系的观念, 以及在openGL中的视图及其相关的变换. 大纲 视图.模型.投影变换概念 Opengl中对各种变换的支持 视图变换 在一个三维坐标系中, 一个模型的展示并不只有一个视图就可以了.而是存在视图变换,投影变换,模型变换的过程. 顶点坐标--->(模型视图矩阵)---->视觉坐标--->(投影矩阵)---->裁剪坐标---->(透视坐标)---->规范化设备坐标---->视口变