我是OpenGL的新手,我对代码中的所有随机函数都有点不知所措.他们工作,我知道何时使用它们,但我不知道为什么我需要它们或他们实际做什么.
我知道glLoadIdentity()
用当前矩阵替换当前矩阵,但究竟是做什么的呢?如果每个程序都需要它,除非另有说明,为什么默认情况下不是单位矩阵?除非我知道他们做了什么,否则我不喜欢在我的代码中使用函数.我应该注意到,我专门为丰富的2D客户端使用OpenGL,所以请原谅我的无知,如果这对于3D非常明显.
关于glMatrixMode(GL_PROJECTION)
VS 也有点困惑glMatrixMode(GL_MODELVIEW)
.
就投影和模型视图矩阵而言,单位矩阵基本上将矩阵重置回其默认状态.
正如您所希望的那样,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点,以及用于绘制像素的深度(来自屏幕"相机").但是当这些矩阵中的一个是单位矩阵时,这些点与单位矩阵相乘,因此不会改变,因此矩阵没有影响; 它不会转换点,它不会旋转它们,它会保持原样.
我希望这可以澄清一点!
对于数字,标识矩阵相当于1.正如你知道的任何号码1是本身相乘(e.g. A x 1 = A)
,
矩阵也是如此( MatrixA x IdentityMatrix = MatrixA)
.
因此,在将其他矩阵乘以矩阵堆栈之前,加载单位矩阵是一种将矩阵初始化为正确状态的方法.
glMatrixMode(GL_PROJECTION)
:处理透视变换或正交变换使用的矩阵.
glMatrixMode(GL_MODELVIEW)
:处理模型视图转换使用的矩阵.也就是说,将对象(也称为模型)转换为视图坐标空间(或相机空间).
投影矩阵用于创建查看量.想象一下现实世界中的场景.你并没有真正看到周围的一切,只有你眼睛允许你看到的东西.如果你是一条鱼,你可以看到更广泛的东西.因此,当我们说我们设置投影矩阵时,我们意味着我们设置了我们想要从我们创建的场景中看到的内容.我的意思是你可以在世界的任何地方绘制物体.如果它们不在视图卷内,您将看不到任何内容.创建视图体积时,想象您创建了6个定义视野的剪裁平面.
对于模型视图矩阵,它用于对您世界中的模型(对象)进行各种转换.像这样你只需要定义一次你的对象然后翻译它或旋转它或缩放它.
在绘制场景中的对象之前,可以使用投影矩阵来设置视图体积.然后绘制对象并相应地更改模型视图矩阵.当然,您可以在绘制模型的中途更改矩阵,例如,如果您想要绘制场景然后绘制一些文本(使用某些方法可以在正交投影中更容易工作),然后更改回模型视图矩阵.
至于名称模型,它与建模和查看转换的二元性有关.如果你将相机拉回5个单位,或者将物体向前移动5个单位,它基本上是相同的.
希望我能说清楚一点