在GL_PROJECTION下,我执行了以下操作
glu.gluPerspective(90,aspect,1,10);
glu.gluLookAt(0,0,3,0,0,0,0,1,0);
这段代码本来是正常工作的,但当我改变了顺序后,屏幕上就没有任何物体显示出来,我旋转了相机,也没有看到任何东西。
我知道交换两个矩阵的顺序会改变矩阵相乘的顺序,但我想知道为什么第一个情况可以工作而第二个情况不行。谢谢。
在GL_PROJECTION下,我执行了以下操作
glu.gluPerspective(90,aspect,1,10);
glu.gluLookAt(0,0,3,0,0,0,0,1,0);
这段代码本来是正常工作的,但当我改变了顺序后,屏幕上就没有任何物体显示出来,我旋转了相机,也没有看到任何东西。
我知道交换两个矩阵的顺序会改变矩阵相乘的顺序,但我想知道为什么第一个情况可以工作而第二个情况不行。谢谢。
由于矩阵乘法是反交换的,您将无法得到正确的P' = 视图矩阵 × 投影矩阵 × 模型矩阵 × P
P'
,导致其落在规范视图体积内,从而出现黑屏。注意:OpenGL中的所有矩阵乘法都按以下方式进行:假设当前矩阵为C,使用glMultMatrix*()或任何变换命令指定的矩阵为M。乘法后,最终矩阵始终为CM。由于矩阵乘法通常不是可交换的,所以顺序很重要。
[ 200, 0, −100 ]
[ 0, 200, −100 ]
[ 0, 0, 1 ]
模型 × 视图 = S200, 200 × T−100, −100
[ 200, 0, −20000 ]
[ 0, 200, −20000 ]
[ 0, 0, 1 ]
在
glu.gluPerspective(90,aspect,1,10);
glu.gluLookAt(0,0,3,0,0,0,0,1,0);
在编程中,首先将案例的第一个模型/世界坐标(在R^3中)转换为视图坐标(也是R^3)。然后,投影将视图坐标映射到透视空间(P^4),然后通过透视除法将其缩小到NDC坐标。这通常是它应该工作的方式。
现在看一下:
glu.gluLookAt(0,0,3,0,0,0,0,1,0);
glu.gluPerspective(90,aspect,1,10);
GL_PROJECTION
应该只包含投影变换,模型和视图变换应该放在GL_MODELVIEW
中。虽然这样做也可以工作,但遵循惯例是正确的事情。 - legends2k