SharpGL學習筆記(四) 正射投影


 

上節談到投影變換分為透視投影(perspective projection)和正射投影(orthographic projection)兩種.

透視投影我們已經介紹過了, 現在談談正視投影.

正射投影,又叫平行投影.這種投影是一個矩形長方體的平行管道. 它最大的特點是, 無論物體距離相機多遠投影后的物體大小尺寸不變.

 正視投影函數有兩個, 一個是Ortho, 原形如下:

Ortho(double left, double right, double bottom, double top, double near, double far)

其參數 left,right,bottom, top的意義見下圖所示. 

near, far 可以認為是Z軸方向上的近裁剪平面和遠裁剪平面.

 

 下面這張示意圖是把三維體放置在視景體中, 看上去更形象些.

 

 

筆者為了理解什么是正射投影以及Ortho函數的效果, 在網上翻遍了資料, 都是籠統的文字敘述, 或者是表達有誤. 甚至找不到一個直觀示意效果圖.

后來還是在3dsmax的攝像機屬性中看到了"正交投影" 這個屬性.  在3dsmax和autoCAD中, Ortho這個單詞都被翻譯為"正交". 因此"正交"和"正射"表達的是一個東西.

 

事實證明, 有了3dsmax這樣的工具, 可以有效的實踐一些原理上的東西, 確實對學習OpenGL很有幫助. 

請看下面的實驗, 它幫助筆者理解了什么是正射投影? 它的效果是怎么樣的? 這樣的疑惑.

 

 下圖是在3dsmax創建的一個場景:
 注意其Camera01視圖,  它顯示的是攝像機在透視投影下看到一個立方體(線框顯示)

 

同樣的場景, 把攝像機改為"正交投影", 可以看到現在的立方體完全沒有了透視效果. 這是因為這立方體相當於放置在一個矩形長方體管道中, 投影完全平行, 沒有了像透視投影那樣的角度發散的效果.

這就是正射投影的最大特點: 無論物體距離相機有多遠投影后的物體大小尺寸不變.

 

 

下面我們用代碼來繼續討論一下Ortho() 函數.

先上個透視投影的效果圖, 如下:

這個三角形是畫在Z為0的世界坐標系平面上的, 因此LookAt的前三個參數設置0,0,1, 表示攝像機xy指向世界坐標系原點, 攝像機的Z向世界坐標系統的Z正方向走1個單位, 即遠離了三角形一個單位, 因此我們能看到三角形了.

 

現在我們把Perspective改為Ortho.

gl.Ortho(-2, 2, -3,3, -2, -5);
gl.LookAt(0, 0, 1, 0, 0, -10, 0, 1, 0);

跑起來, 屏幕上什么都沒有.

這是因為LookAt的第三個參數eyez, 沒有位於Ortho參數near和far(即-2, -5)之間的原因. 

gl.LookAt(0, 0, -3, 0, 0, -10, 0, 1, 0);

eyez改為-3就可以看到三角形了.

 

我來總結一下:

經過 gl.Ortho(-2, 2, -3,3, -2, -5) 正射投影之后, 三角形就被置於這個矩形長方體(-2, 2, -3,3, -2, -5)的視景體中了, 以后LooAt 就是在看這個視影體中的內容, 如果攝像機的視點設置有超出這視景體的部分將看不到, 相當於被剪切了.

 

另外一個函數是 Ortho2D(), 它和Ortho不同的是缺少最后兩上參數Near, Far, 這個Ortho2D()實際上是默認near為-1, far為1的Ortho()函數. 

筆者並不清楚它有什么作用, 如果以后遇到好的例子, 我會在這里續寫這個知識點.

 

 

本節源代碼直接使用上節的源碼

 

原創文章,出自"博客園, 豬悟能'S博客" : http://www.cnblogs.com/hackpig/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM