opengl - glLoadIdentity() 在 OpenGL 中做什么?

标签 opengl graphics

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

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

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

最佳答案

单位矩阵,就投影和模型 View 矩阵而言,本质上是将矩阵重置回其默认状态。

正如您希望知道的那样,glTranslateglRotate 始终与矩阵的当前状态相关。例如,如果您调用 glTranslate,您将从矩阵的当前“位置”进行翻译,而不是从原点进行翻译。但是,如果您想从原点重新开始,那就需要调用 glLoadIdentity(),然后您可以从现在位于原点的矩阵进行 glTranslate,或者来自矩阵的 glRotate,现在定向为默认方向。

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

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

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

这很重要的原因是因为 OpenGL 将每个矩阵的所有位置和旋转相乘;因此,当您绘制一个多边形(glBegin(GL_FACE)、某些点、glEnd())时,它会通过将其与 MODELVIEW 相乘来将其转换为“世界空间” ,然后通过将其与 PROJECT 矩阵相乘,将其从 3D 转换为 2D,从而获得屏幕上的 2D 点以及用于绘制像素的深度(来自屏幕“相机”)。但当这些矩阵之一是单位矩阵时,点与单位矩阵相乘,因此不会改变,因此矩阵没有任何作用;它不会平移点,不会旋转点,而是保持原样。

我希望这能澄清一点!

关于opengl - glLoadIdentity() 在 OpenGL 中做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/628796/

相关文章:

c++ - MVP 矩阵在着色器之外不工作?

c++ - OpenGL 覆盖 Windows 的按钮

python - PCA 线拟合聚类算法

java - 如何停止运球?

java - 在线框中绘制隐藏线作为点画

c++ - 如何刷新 GLUT 空闲函数内的窗口

Java-图形绘制

objective-c - Cocoa 绘图, "lock"鼠标在特殊事件上

c++ - Qt5.5中的QOpenGLWidget渲染QImage文件

java - 相对于面板java绘制椭圆