glLoadIdentity()在OpenGL中做什么?

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

我知道glLoadIdentity()用当前matrixreplace当前matrix,但是到底是什么呢? 如果每个程序都需要它,为什么默认情况下不是身份matrix,除非另有说明? 我不喜欢在我的代码中有function,除非我知道他们做了什么。 我应该注意到,我正在使用OpenGL专门用于丰富的2D客户端,所以如果这对于3D来说非常明显,那么请原谅我的无知。

还有一点困惑glMatrixMode(GL_PROJECTION) VS glMatrixMode(GL_MODELVIEW)

就投影和模型视图matrix而言,单位matrix基本上将matrix重置为其默认状态。

正如你所希望的那样, glTranslateglRotate总是相对于matrix的当前状态。 所以举例来说,如果你调用glTranslate ,你正在从matrix当前的“位置”转换,而不是从原点。 但是如果你想从原点重新开始,那么当你调用glLoadIdentity() ,然后你可以glTranslate从现在位于原点的matrix,或glRotate从现在以默认方向定向的matrix。

我认为,恩恩的答案,这是相当于1,是不完全正确的。 matrix看起来像这样:

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

这是身份matrix。 在math上,恩赐是正确的,任何matrix乘以matrix(或者看起来像这样的matrix;对angularmatrix,其他所有的0)都将产生原始matrix,但我不相信他解释了为什么这很重要。

这之所以重要,是因为OpenGL将所有的位置和旋转乘以每个matrix; 所以当你绘制一个多边形( glBegin(GL_FACE) ,一些点, glEnd() )时,它将其转换为“世界空间”,并将其与MODELVIEW相乘,然后通过将其乘以PROJECTmatrix,并给出它在屏幕上的2D点,以及它用来绘制像素的深度(来自屏幕“相机”)。 但是当这些matrix中的一个是单位matrix时,这些点与单位matrix相乘,因此不会改变,所以matrix不起作用。 它不会转换点,它不旋转它们,它保持原样。

我希望这个澄清更多一点!

标识matrix相当于数字1。 如你所知,与1相乘的任何数字本身(eg A x 1 = A)

matrix( MatrixA x IdentityMatrix = MatrixA)

因此,加载一个单位matrix是一种将matrix初始化为正确状态的方法,然后再将其他matrix乘以matrix堆栈。

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

glMatrixMode(GL_MODELVIEW) :处理由模型视图转换使用的matrix。 也就是说,把你的对象(又名模型)转换到视图坐标空间(或相机空间)。

投影matrix用于创build您的观看音量。 想象一下现实世界中的一幕。 你不能真正看到你周围的一切,只有你的眼睛让你看到。 如果你是一个鱼,例如你看到更广泛的事情。 所以当我们说我们设置投影matrix时,我们意味着我们设定了我们想要从我们创build的场景中看到的东西。 我的意思是你可以在你的世界任何地方绘制物体。 如果它们不在视图内,则不会看到任何内容。 当您创build视图音量时,想象您将创build6个剪辑平面来定义您的视野。

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

在绘制场景中的对象之前,您可以使用投影matrix来设置视图体积。 然后你绘制你的对象,相应地改变模型视图matrix。 当然,如果你想绘制一个场景,然后绘制一些文本(在某些方法中,你可以在正交投影中更容易工作),那么你可以在绘制模型的过程中改变matrix,然后返回到模型视图matrix。

至于名模视图,它与build模和查看转换的二重性有关。 如果您将相机拉回5个单位,或将物体向前移动5个单位,则实质上是相同的。

希望我已经阐明了一些想法

身份matrix用于将matrix“初始化”为理智的默认值。

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