一。OPENGL約定
1.
void gluPerspective( GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar );
此函數生成透視投影矩陣並將此矩陣與當前矩陣相乘,設M爲當前矩陣,T爲透視投影矩陣,有:M=M*T。
約定:此函數約定視點在座標原點,視向(視軸的方向)爲負Z方面,zNear, zFar 約定爲正但卻是表示負Z方向。
二。矩陣轉換規則
當有多個變換組合的時候,我們依次使用gltranslate, glrotate, glmultmatrix依次進行變換, 但發現變換組合卻和我們調用的變換次序相反,如:T11爲平移變換, T12爲旋轉變換,我們依次調用T11->T12, opengl轉換的順序爲T12->T11。
如1。1所示,我們依次調用T11->T12,當前矩陣M應該是:M=M*M11 , M=M*M12,推出M= M*M11*M12, 按照DX的規則,變換次序應該爲T11->T12,但OG卻是相反。
結果從glMultMatrix 函數獲得啓發, 原來OG將變換矩陣轉置後才進行相乘。如下所示:
設So爲原始座標, T1爲轉換矩陣,ST爲經T1轉換後的座標, OG的轉換應該是這樣計算的:ST = So* { T1^T }^T。(^T爲轉置符號)。如果是變換組合就成了So* { T1^T * T2^T * T3^T * ... }^T, 由於公式A^T^T = A; A^T * B^T = (B*A)^T,
得 ST=
So* { T1^T * T2^T * T3^T * ... }^T =
So* { ... * T3 * T2 * T1}^T^T =
So* { ... * T3 * T2 * T1}
得出OG的變換順序和調用順序是相反的,所以應該特別注意。