当前位置:  开发笔记 > 编程语言 > 正文

glLoadIdentity()在OpenGL中做什么?

如何解决《glLoadIdentity()在OpenGL中做什么?》经验,为你挑选了3个好方法。

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

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

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



1> Ricket..:

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

正如您所希望的那样,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点,以及用于绘制像素的深度(来自屏幕"相机").但是当这些矩阵中的一个是单位矩阵时,这些点与单位矩阵相乘,因此不会改变,因此矩阵没有影响; 它不会转换点,它不会旋转它们,它会保持原样.

我希望这可以澄清一点!



2> Boon..:

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

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

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

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

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



3> 小智..:

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

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

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

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

希望我能说清楚一点

推荐阅读
落单鸟人
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有