2014-01-24 74 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 '。我会尽力找到一篇更好的文章来链接到明天。如果您在实际执行我所讨论的内容时遇到困难,请随时留下评论。 –