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。
如上图,A1B1C1D1为近平面,A2B2C2D2为远平面。
相关阅读:
OpenGL 渲染篇
Ubuntu 13.04 安装 OpenGL
Ubuntu下OpenGL编程基础解析
如何在Ubuntu使用eclipse for c++配置OpenGL