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
这是对的吗?
答案 0 :(得分:3)
这大多是正确的,但是glViewport (...)
本身并没有定义矩阵。这是一个简单的偏差和缩放操作。它定义了X和Y中的总宽度,高度和偏移量。还有另一个缺少的组件,即深度范围。
乘法按顺序发生,但由于这些是列主矩阵并且后乘,所以从概念上说,从右边开始,然后向左行进。交叉T4
因为它不是一个矩阵,所有这一切的最终结果是一个剪辑空间顶点坐标。您仍然需要将v.xyz
除以v.w
,然后执行视口转换以完全复制GL所执行的操作。
您可以使用矩阵实现视口变换,但您还需要考虑glDepthRange (...)
,它将Z坐标从NDC空间偏移并缩放到窗口空间。
以下是这样的矩阵:
此处详细讨论了整个过程,4.1 Coordinates Transformation。