glLoadIdentity()在OpenGL中做什么?

时间:2009-03-10 03:04:36

标签: opengl graphics

我是OpenGL的新手,我对代码中的所有随机函数都感到不知所措。他们工作,我知道何时使用它们,但我不知道为什么我需要它们或它们实际上做了什么。

我知道glLoadIdentity()用身份矩阵替换当前的矩阵,但究竟是做什么的呢?如果每个程序都需要它,除非另有说明,为什么默认情况下不是单位矩阵?除非我知道他们做了什么,否则我不喜欢在我的代码中使用函数。我应该注意到,我正在将OpenGL专门用于丰富的2D客户端,所以请原谅我的无知,如果这对于3D非常明显。

对于glMatrixMode(GL_PROJECTION) VS glMatrixMode(GL_MODELVIEW)也有点困惑。

6 个答案:

答案 0 :(得分:134)

就投影和模型视图矩阵而言,单位矩阵基本上将矩阵重置为其默认状态。

如您所知,glTranslateglRotate始终与矩阵的当前状态相关。例如,如果您调用glTranslate,则表示您正在从矩阵的当前“位置”进行翻译,而不是从原点进行翻译。但是如果你想从原点开始,那就是你打电话给glLoadIdentity(),然后你可以从现在位于原点的矩阵glTranslate或者来自矩阵的glRotate现在面向默认方向。

我认为Boon的答案,它相当于1,并不完全正确。矩阵实际上看起来像这样:

1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1

这是单位矩阵。 Boon在数学上是正确的,任何矩阵乘以该矩阵(或看起来像这样的矩阵;对角线,其他所有0)将产生原始矩阵,但我不相信他解释了为什么这很重要。 / p>

这一点很重要的原因是因为OpenGL将所有位置和旋转乘以每个矩阵;所以当你绘制一个多边形(glBegin(GL_FACE),一些点,glEnd())时,它会通过将它与MODELVIEW相乘将其转换为“世界空间”,然后通过乘法将其从3D转换为2D它使用PROJECT矩阵,并在屏幕上显示2D点,以及用于绘制像素的深度(来自屏幕'相机')。但是当这些矩阵中的一个是单位矩阵时,这些点与单位矩阵相乘,因此不会改变,因此矩阵没有影响;它不会转换点,它不会旋转它们,它会保持原样。

我希望这可以澄清一点!

答案 1 :(得分:39)

标识矩阵相当于1的数字。如您所知,任何乘以1的数字本身就是(e.g. A x 1 = A)

矩阵( MatrixA x IdentityMatrix = MatrixA)也是如此。

因此,在将其他矩阵乘以矩阵堆栈之前,加载单位矩阵是一种将矩阵初始化为正确状态的方法。

glMatrixMode(GL_PROJECTION):处理透视变换或正交变换使用的矩阵。

glMatrixMode(GL_MODELVIEW):处理模型 - 视图转换使用的矩阵。也就是说,将对象(也称为模型)转换为视图坐标空间(或相机空间)。

答案 2 :(得分:6)

投影矩阵用于创建观看量。想象一下现实世界中的场景。你并没有真正看到周围的一切,只有你眼睛允许你看到的东西。如果你是一条鱼,你可以看到更广泛的东西。因此,当我们说我们设置投影矩阵时,我们意味着我们设置了我们想要从我们创建的场景中看到的内容。我的意思是你可以在世界的任何地方绘制物体。如果它们不在视图卷内,您将看不到任何内容。在创建视图体积时,可以想象您创建了6个定义视野的剪裁平面。

对于模型视图矩阵,它用于对您世界中的模型(对象)进行各种转换。像这样你只需要定义一次你的对象然后翻译它或旋转它或缩放它。

在绘制场景中的对象之前,您可以使用投影矩阵来设置视图体积。然后绘制对象并相应地更改模型视图矩阵。当然,您可以在绘制模型的中途更改矩阵,例如,如果要绘制场景然后绘制一些文本(使用某些方法可以在正交投影中更容易工作),然后更改回模型视图矩阵。

至于名称模型视图,它与建模和查看转换的二元性有关。如果你将相机拉回5个单位,或者将物体向前移动5个单位,它基本上是相同的。

希望我已经有所了解

答案 3 :(得分:2)

单位矩阵用于将矩阵“初始化”为合理的默认值。

要实现的一个重要事项是矩阵乘法在某种意义上是可加性的。例如,如果你取一个以单位矩阵开头的矩阵,将它乘以一个旋转矩阵,然后乘以一个缩放矩阵,最后得到一个旋转的矩阵,并对它乘以的矩阵进行缩放。

答案 4 :(得分:0)

简而言之,单位矩阵是一个矩阵,当您将一个向量/矩阵与其相乘时,结果就是那个向量/矩阵。等于带乘法的数字1或带加法的数字0。

glLoadIdentity()是已弃用的函数,建议您管理自己的矩阵。

答案 5 :(得分:-1)

glLoadIdentity()函数确保每次进入投影模式时,矩阵将重置为单位矩阵,以便新的查看参数不会与前一个相结合。