2014-01-24 65 views
1
glDisable(GL_DEPTH_TEST); 
glViewport(0/*left*/, 0/*botton*/, 200/*width*/, 200/*height*/); //T4 
glMatrixMode(GL_PROJECTION);  
glLoadIdentity(); 
gluPerspective(90 /*fov*/, 1/*aspect*/, 1/*fp*/, 1000/*bp*/); //T3 
glMatrixMode(GL_MODELVIEW); 
glLoadIdentity();  
gluLookAt(0/*eyex*/,0/*eyey*/,0/*eyez*/, 0/*lax*/,0/*lay*/,-1/*laz*/, 0/*upx*/,1/*upy*/,0/*upz*/); //T2 
glTranslatef(-15.0, -10.0, -49.0); //T1 
glBegin(GL_POINTS); 
glVertex4f(0, 0, -1, 1); 
glEnd(); 

給定此代碼,矩陣乘法的發生順序是什麼?我需要知道什麼才能遵循並驗證紙張上的計算結果?OpenGL中矩陣乘法的順序

我懷疑下面的順序,但還沒有想出一個方法來驗證它: V = [0,0,-1,1]

T4 * T3 * T2 * T1 * v 

這是正確的嗎?

+0

因此,在這種情況下,視口只是重新縮放並從-1 .. + 1轉換爲0..200。 – Kalevi

回答

3

這大部分是正確的,但glViewport (...)本身並沒有定義矩陣。這是一個簡單的偏見和規模操作。它定義了X和Y中的總寬度,高度和偏移量。還有一個缺失的組件,即深度範圍。

乘法按照該順序發生,但由於這些是列主矩陣和乘法後,所以您在概念上從右側開始,然後向左側移動。交出T4,因爲它本身不是矩陣,所有這些的最終結果是一個剪輯空間頂點座標。您仍然需要將v.xyz除以v.w,然後執行視口轉換以完全複製GL執行的操作。

可以實現視口變換使用矩陣,但你也需要在glDepthRange (...)其偏見與因子和規模從NDC空間Z座標到窗口空間。

下面是這樣一個矩陣會是什麼樣子:

        Row-major viewport matrix

整個過程在這裏更好的細節討論,4.1 Coordinates Transformation下。

+0

@Kalevi:在我鏈接到的網站上有幾件事情是錯誤的,特別是剪輯音量的討論。在GL中,我們在所有方向上具有[-1,1]的NDC體積。在D3D中,它在XY中是[-1,1],在Z中是[0,1]。[This site](http://www.songho.ca/opengl/gl_transform.html)更準確,但不像可視化並且缺乏對視口轉換矩陣的討論(這對OpenGL也是錯誤的,因爲Y不是那樣倒置的)。 –

+0

@Kalevi:因此,它應該是'h/2' **而不是**'-h/2','(maxZ-minZ)/ 2'和'maxZ + minZ/2' **不** **'minZ '。我會盡力找到一篇更好的文章來鏈接到明天。如果您在實際執行我所討論的內容時遇到困難,請隨時留下評論。 –