OpenGL中矩阵乘法的顺序

时间:2014-01-24 00:18:30

标签: c++ c opengl

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();

鉴于此代码,矩阵乘法的顺序是什么?我必须知道如何在纸上跟踪和验证计算结果?

我怀疑是按照顺序,但还没有找到验证方法: V = [0,0,-1,1]

T4 * T3 * T2 * T1 * v

这是对的吗?

1 个答案:

答案 0 :(得分:3)

这大多是正确的,但是glViewport (...)本身并没有定义矩阵。这是一个简单的偏差和缩放操作。它定义了X和Y中的总宽度,高度和偏移量。还有另一个缺少的组件,即深度范围。

乘法按顺序发生,但由于这些是列主矩阵并且后乘,所以从概念上说,从右边开始,然后向左行进。交叉T4因为它不是一个矩阵,所有这一切的最终结果是一个剪辑空间顶点坐标。您仍然需要将v.xyz除以v.w,然后执行视口转换以完全复制GL所执行的操作。

可以使用矩阵实现视口变换,但您还需要考虑glDepthRange (...),它将Z坐标从NDC空间偏移并缩放到窗口空间。

以下是这样的矩阵:

Row-major viewport matrix

此处详细讨论了整个过程,4.1 Coordinates Transformation