OpenGL 投影矩阵的理解

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:

相关阅读

OpenGL 渲染篇

Ubuntu 13.04 安装 OpenGL

OpenGL三维球体数据生成与绘制【附源码】

Ubuntu下OpenGL编程基础解析

如何在Ubuntu使用eclipse for c++配置OpenGL

《OpenGL超级宝典》学习笔记

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/05da46b021bea34b0f512ea4c84a12d9.html