OpenGL 投影矩阵的理解

opengl透视投影的视棱锥:

OpenGL 投影矩阵的理解

 

关于投影矩阵设置接口glFrustum / gluPerspective,我常常被问到两个问题:

1. 视棱锥中近平面很小,远平面很大,跟透视投影中“近大远小” 难道不矛盾?

[1]中3.3.1节 Perspective Projection一节中第一句:透视投影最显著特征是透视缩短,物体距离照相机越远,它在最终图像上看上去就越小。这就是常说的近大远小现象。 

这节中间一段话给出了这个问题答案:

Objects that are closer to the viewpoint appear larger because they occupy a proportionally larger amount of the viewing volume than those that are farther away, in the larger part of the frustum.

和远处的物体相比,靠近视点的物体占据了视椎体中相对较大的区域,看上去更大一些。物体大小不变,透视投影中离视点越近在视椎体中所占比例越大;反之离视点越远在视椎体中所占比例越小。近大远小指的是比例,所以跟近、远平面实际大小无关。 

2. znear和zfar红皮书上为何明确说明不能为负?

gluPerspective函数介绍的一句话: 

near and far values the distances between the viewpoint and the clipping planes, along the negative z-axis. They should always be positive. 

They should always be positive:near和far是表示视点到远近投影平面的距离,gluPerspective 设置视棱锥时,默认视点在(0,0,0)位置(虽然后续可以通过gluLookAt改变视点位置),距离当然不能为负。

along the negative z-axis:视点在原点,视线方向为负z轴,沿着z轴负方向,从近到远定义了两个切割平面为znear和zfar。

OpenGL 投影矩阵的理解

如上图,A1B1C1D1为近平面,A2B2C2D2为远平面。

引用
 
1. redbook:http://www.glprogramming.com/red/chapter03.html

相关阅读

OpenGL 渲染篇 http://www.linuxidc.com/Linux/2011-10/45756.htm

Ubuntu 13.04 安装 OpenGL http://www.linuxidc.com/Linux/2013-05/84815.htm

OpenGL三维球体数据生成与绘制【附源码】 http://www.linuxidc.com/Linux/2013-04/83235.htm

Ubuntu下OpenGL编程基础解析 http://www.linuxidc.com/Linux/2013-03/81675.htm

如何在Ubuntu使用eclipse for c++配置OpenGL http://www.linuxidc.com/Linux