2016-11-25 85 views
0

我一直在玩OpenGL和矩陣操作,我理解P * V * M的概念,但我不明白爲什麼改變'camera'的Z位置沒有縮放的效果。OpenGL Orthographical Projection

當使用透視投影時,更改相機的Z值會產生縮放效果(如我所料)。

glm::mat4 Projection = glm::perspective(45.0f, 4.0f/3.0f, 0.1f, 100.0f); 
glm::mat4 View  = glm::lookAt(
          glm::vec3(0,0,3), // changing 3 to 8 will zoom out 
          glm::vec3(0,0,0), 
          glm::vec3(0,1,0) 
         ); 
glm::mat4 Model  = glm::mat4(1.0f); 
gml::mat4 MVP  = Projection * View * Model; 

但是,當我使用正投影,改變3到8或任何東西它沒有縮小的效果。我知道他們是非常不同的預測,但我正在尋找一個解釋(背後爲什麼不起作用的數學會特別有用)。

glm::mat4 Projection = glm::ortho(
    0.0f, 
    128.0f, 
    0.0f, 
    72.0f, 
    0.0f, 
    100.0f 
); 

回答

1

這就是拼寫預測的工作原理。讓我們先從一個透視變換:

您可以通過下面的一條直線到相機獲取對象的投影:

enter image description here

如果移動相機接近,那麼你會看到投影面積增加:

enter image description here

正投影的工作方式不同。您可以通過下面的一條直線垂直於像平面獲得投影:

enter image description here

而且很明顯,投影面積的大小不取決於相機有多遠遠離對象。這是因爲投影線總是平行的,並保持物體在圖像平面的兩個方向上的大小。

+0

所以要放大的正投影的方法就是通過改變傳遞到'GLM :: ortho'的數字? – TomShar

2

當您將Z座標從3更改爲8時,實際上並沒有縮小,而只是將相機移得更遠。您可以通過更改glm::perspective的第一個參數來移動相機而無需移動相機。

正交相機沒有位置(您可以將其視爲無限遠),因此無法以相同的方式「移動」正交相機。您可以通過更改傳遞到glm::ortho的邊界來縮小。只需傳遞更大的數字到glm::ortho

1

看看會發生什麼,當你移動透視相機:

perspective camera

這裏:(XE,你們,ZE) - 點眼座標系。 (XP,YP,ZP) - 該點的投影 n - 要近平面 牛逼距離 - 距離截

你可以看到,當你接近攝像頭,XP和YP將增長的頂部平面。相反,改變正交相機的z位置不會影響xp和yp,但仍然會影響zp,因此會改變深度緩衝區中的值。

orthogonal camera

+0

所以放大正交投影的方法就是改變glm :: ortho傳遞的數字。 – TomShar