OpenGL中的glLoadIdentity()函数是什么作用?

145

我是OpenGL的新手,我的代码中有很多随意的函数,让我感到有点不知所措。它们都能工作,我知道该在何时使用它们,但我不知道为什么需要它们或者它们实际上是做什么。

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

同时,我还有一点困惑,就是glMatrixMode(GL_PROJECTION)glMatrixMode(GL_MODELVIEW)的区别。

6个回答

153

在投影矩阵和模型视图矩阵中,单位矩阵本质上将矩阵重置回其默认状态。

正如您所知,glTranslateglRotate 始终相对于矩阵的当前状态。例如,如果您调用glTranslate,则是从矩阵的当前“位置”进行平移,而不是从原点开始。但是,如果您想从原点重新开始,这就是调用glLoadIdentity()的时候,然后可以从矩阵进行glTranslate,该矩阵现位于原点,或者从定向为默认方向的矩阵glRotate

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

1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
那是单位矩阵。Boon在数学上是正确的,任何矩阵乘以那个矩阵(或者看起来像那个矩阵; 对角线为1,其余为0)将得到原始矩阵,但我不认为他解释了这为什么很重要。
这很重要的原因是因为OpenGL通过每个矩阵乘以所有位置和旋转。例如,当你绘制一个多边形(glBegin(GL_FACE),一些点,glEnd()),它通过与MODELVIEW相乘将其转换为“世界空间”,然后通过与PROJECT矩阵相乘将其从3D转换为2D,这使其具有屏幕上的2D点以及深度(来自屏幕'相机'),它用于绘制像素。但是当其中一个矩阵是单位矩阵时,点被乘以单位矩阵,因此不会改变,因此矩阵没有效果;它不会转换点,不会旋转点,它将它们保持不变。
我希望这能更加清晰!

2
这意味着OpenGL维护一个“主”或“全局”矩阵,每个后续的矩阵都是相对于该“主”或“全局”矩阵应用的。我说得对吗? - user366312

42

单位矩阵是数字的等效于1。就像你知道的,任何与1相乘的数都是它本身 (例如 A x 1 = A)

对于矩阵也是一样的 (MatrixA x IdentityMatrix = MatrixA).

因此,在将更多矩阵乘入矩阵堆栈之前,加载单位矩阵是初始化矩阵到正确状态的一种方法。

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

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


7
投影矩阵用于创建视图体积。想象一下现实世界中的场景。你并没有真正看到周围的一切,只能看到眼睛所允许你看到的。例如,如果你是一条鱼,你会看到更多的东西。因此,当我们说设置投影矩阵时,我们的意思是设置我们想从我们创建的场景中看到的内容。我的意思是,你可以在你的世界中任何地方绘制对象。如果它们不在视图体积内,你将什么也看不到。当你创建视图体积时,想象一下你创建了6个裁剪平面来定义你的视野。
至于模型视图矩阵,它用于对你的世界中的模型(对象)进行各种变换。这样,你只需要定义一次对象,然后对其进行平移、旋转或缩放即可。
在绘制场景中的对象之前,您将使用投影矩阵来设置视图体积。然后,您绘制您的对象并相应地更改模型视图矩阵。当然,如果您想绘制一个场景,然后绘制一些文本(使用某些方法可以更容易地在正交投影中工作),然后再切换回模型视图矩阵,您可以在绘制模型的过程中更改矩阵。
至于模型视图名称,它与建模和观察转换的二元性有关。如果你将相机向后移动5个单位,或者将物体向前移动5个单位,本质上是相同的。
希望我已经解释清楚了一些内容。

3

身份矩阵用于将矩阵初始化为一个合理的默认值。

需要明确的一点是,矩阵乘法在某种意义上是可加的。例如,如果您取一个以身份矩阵开始的矩阵,将其乘以旋转矩阵,然后将其乘以缩放矩阵,最终得到的矩阵将会对与其相乘的矩阵进行旋转和缩放。


1

简单概括其他人所说的,单位矩阵是一种矩阵,当你将向量/矩阵与其相乘时,结果是相同的向量/矩阵。这相当于用乘法表示的数字1或用加法表示的数字0。

glLoadIdentity()是一个已弃用的函数,鼓励您自己管理矩阵。


0

glLoadIdentity()函数确保每次进入投影模式时,矩阵都将重置为单位矩阵,以便新的视图参数不会与先前的参数组合。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接