glLoadIdentity()在OpenGL中做什么?
我是OpenGL的新手,我有点不知所措的代码中的所有随机函数。 他们工作,我知道什么时候使用他们,但我不知道为什么我需要他们或他们实际上做什么。
我知道glLoadIdentity()
用当前matrixreplace当前matrix,但是到底是什么呢? 如果每个程序都需要它,为什么默认情况下不是身份matrix,除非另有说明? 我不喜欢在我的代码中有function,除非我知道他们做了什么。 我应该注意到,我正在使用OpenGL专门用于丰富的2D客户端,所以如果这对于3D来说非常明显,那么请原谅我的无知。
还有一点困惑glMatrixMode(GL_PROJECTION)
VS glMatrixMode(GL_MODELVIEW)
。
就投影和模型视图matrix而言,单位matrix基本上将matrix重置为其默认状态。
正如你所希望的那样, glTranslate
和glRotate
总是相对于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。