歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

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。

如上圖,A1B1C1D1為近平面,A2B2C2D2為遠平面。

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

Copyright © Linux教程網 All Rights Reserved