GlLoadIdentity()在 OpenGL 中做什么?

我对 OpenGL 还是个新手,我对代码中的随机函数感到有点不知所措。它们管用,我知道什么时候该使用它们,但我不知道我为什么需要它们,也不知道它们实际上是做什么的。

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

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

93839 次浏览

恒等矩阵等价于数字1。任何乘以1的数字本身就是 (e.g. A x 1 = A),

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

因此,加载一个恒等矩阵是一种方法,可以将矩阵初始化到正确的状态,然后再将更多的矩阵相乘到矩阵堆栈中。

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

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

根据投影矩阵和模型视图矩阵,恒等矩阵实质上将矩阵重置回默认状态。

正如您希望知道的,glTranslateglRotate总是相对于矩阵的当前状态。例如,如果你调用 glTranslate,你是从矩阵的当前“位置”翻译,而不是从原点翻译。但是如果你想从原点开始,那就是你调用 glLoadIdentity()的时候,然后你可以从现在位于原点的矩阵,调用 glTranslate,或者从现在朝向默认方向的矩阵,调用 glRotate

我认为布恩的答案,它等于1,并不完全正确。矩阵实际上是这样的:

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

这就是单位矩阵。从数学上讲,布恩是正确的,任何矩阵乘以那个矩阵(或者一个看起来像那样的矩阵; 对角线的矩阵,所有其他的0)都会得到原始矩阵,但我不相信他解释了为什么这很重要。

这一点之所以重要,是因为 OpenGL 通过每个矩阵将所有位置和旋转相乘; 例如,当你绘制一个多边形(glBegin(GL_FACE),一些点,glEnd())时,它将其与 MODELVIEW 相乘,将其转换为“世界空间”,然后将其从3D 转换为2D,将其与 PROJECT 矩阵相乘,从而得到屏幕上的2D 点,以及用于绘制像素的深度(从屏幕“摄像头”)。但是当其中一个矩阵是恒等矩阵时,这些点与恒等矩阵相乘,因此不会改变,所以矩阵没有影响; 它不平移这些点,不旋转它们,它让它们保持原样。

我希望这能澄清一点!

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

需要认识到的一件重要事情是,矩阵乘法在某种意义上是相加的。例如,如果一个矩阵从单位矩阵开始,乘以一个旋转矩阵,然后乘以一个缩放矩阵,最终得到一个旋转矩阵,并缩放它所乘的矩阵。

投影矩阵用于创建查看卷。想象一下现实世界中的一个场景。你并不能真正看到你周围的一切,只能看到你眼睛允许你看到的东西。例如,如果你是一条鱼,你会看到更广阔的东西。所以当我们说我们建立投影矩阵的时候,我们的意思是我们建立了我们想要从我们创建的场景中看到的东西。我的意思是你可以在你的世界的任何地方画东西。如果它们不在视图卷内,您将看不到任何东西。当您创建视图卷时,想象一下您创建了6个定义视图域的剪辑平面。

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

在绘制场景中的物体之前,您需要使用投影矩阵来设置视图体积。然后绘制对象并相应地更改模型视图矩阵。当然,如果你想画一个场景,然后画一些文字(使用一些方法你可以在正投影图中更容易地工作) ,你可以在画模型的过程中改变你的矩阵,然后回到模型视图矩阵。

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

希望我给了你一些启示

glLoadIdentity()函数保证每次进入投影模式时,矩阵将被重置为恒等矩阵,使新的观察参数不与前一个相结合。

简而言之,恒等矩阵就是这样一个矩阵,当你把一个向量/矩阵与它相乘时,结果就是同一个向量/矩阵。它相当于数字1加上乘法,或者数字0加上加法。

GlLoadIdentity ()是一个不推荐的函数,建议您管理自己的矩阵。