首页 文章

glLoadIdentity()在OpenGL中做什么?

提问于
浏览
125

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

我知道 glLoadIdentity() 用身份矩阵替换当前的矩阵,但究竟是做什么的呢?如果每个程序都需要它,为什么我的代码中没有函数,除非我知道它们做了什么 . 我应该注意到,我专门为丰富的2D客户端使用OpenGL,所以请原谅我的无知,如果这对于3D非常明显 .

关于 glMatrixMode(GL_PROJECTION) VS glMatrixMode(GL_MODELVIEW) 也有点困惑 .

5 回答

  • 131

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

    正如您所知, glTranslateglRotate 始终相对于矩阵的当前状态 . 因此,例如,如果你调用 glTranslate ,当你调用 glLoadIdentity() 时,你正在从矩阵's current '位置', not from the origin. But if you want to start over at the origin, that'转换,然后你可以从现在位于原点的矩阵 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相乘,然后将其转换为"world space",然后通过将其与PROJECT矩阵相乘将其从3D转换为2D,并将其转换为屏幕上的2D点以及用于绘制像素的深度(来自屏幕'camera') . 但是当这些矩阵中的一个是单位矩阵时,这些点与单位矩阵相乘,因此不会改变,因此矩阵没有影响;它不会转换点,它不会旋转它们,它会保持原样 .

    我希望这可以澄清一点!

  • 39

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

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

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

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

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

  • 6

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

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

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

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

    希望我能说清楚一点

  • 2

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

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

  • -1

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

相关问题