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為遠平面。
引用
1. redbook:http://www.glprogramming.com/red/chapter03.html