glLoadIdentity()在OpenGL中做什么?


132

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

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

glMatrixMode(GL_PROJECTION)VS 也有些困惑glMatrixMode(GL_MODELVIEW)

Answers:


139

就投影矩阵和模型视图矩阵而言,恒等矩阵实质上将矩阵重置为其默认状态。

如您所希望的那样,glTranslate并且glRotate总是相对于矩阵的当前状态。因此,例如,如果调用glTranslate,则是从矩阵的当前“位置”开始翻译,而不是从原点开始翻译。但是,如果要从原点开始,那就是在调用时glLoadIdentity(),然后可以glTranslate从现在位于原点的矩阵中,也可以从glRotate现在朝默认方向定向的矩阵中。

我认为Boon的答案(等于1)并不完全正确。矩阵实际上如下所示:

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

那就是身份矩阵。从数学上来说,Boon是正确的,任何与该矩阵相乘的矩阵(或看起来类似的矩阵;对角矩阵,其他均为0)都将产生原始矩阵,但是我不相信他解释了为什么这很重要。

之所以如此重要,是因为OpenGL将每个矩阵的所有位置和旋转都相乘。因此,例如当您绘制多边形(glBegin(GL_FACE),某些点glEnd())时,通过将其与MODELVIEW相乘将其转换为“世界空间”,然后通过将其与PROJECT矩阵相乘将其从3D转换为2D,这样就得出了屏幕上的2D点以及用于绘制像素的深度(从屏幕“相机”开始)。但是,当这些矩阵之一是恒等矩阵时,这些点会与恒等矩阵相乘,因此不会改变,因此该矩阵无效。它不会平移点,不会旋转点,而是保持原样。

我希望这可以澄清更多!


1
这意味着,OpenGL维护一个“主”或“全局”矩阵,并且每个后续矩阵都相对于该“主”或“全局”矩阵应用。我对吗?
user366312 2015年

41

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

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

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

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

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


6

投影矩阵用于创建您的观看量。想象一下现实世界中的场景。您并没有真正看到周围的一切,只有您的眼睛可以看到。例如,如果您是一条鱼,那么您会发现范围更广。因此,当我们说建立投影矩阵时,意味着要建立我们想要从所创建的场景中看到的东西。我的意思是您可以在世界上的任何地方绘制对象。如果它们不在视图体积之内,您将看不到任何东西。创建视图体积时,假设您创建了6个剪切平面来定义您的视场。

至于modelview矩阵,它用于对您的世界中的模型(对象)进行各种转换。这样,您只需定义一次对象,然后对其进行平移或旋转或缩放即可。

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

至于名称modelview,它与建模和查看转换的双重性有关。如果将摄像机向后拉5个单位,或将对象向前移动5个单位,则基本上是相同的。

希望我能有所启发


2

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

要意识到的一件重要事情是,矩阵乘法在某种意义上是可加的。例如,如果您采用以单位矩阵开头的矩阵,将其乘以旋转矩阵,然后将其乘以缩放矩阵,则最终得到一个矩阵,该矩阵旋转并缩放与其相乘的矩阵。


0

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

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


-1

glLoadIdentity() 该功能可确保每次进入投影模式时,矩阵都将重置为恒等矩阵,以使新的观看参数不会与之前的观看参数组合。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.