我是OpenGL的新手,我对代码中的所有随机函数都有点不知所措 . 他们工作,我知道何时使用它们,但我不知道为什么我需要它们或他们实际做什么 .
我知道 glLoadIdentity()
用身份矩阵替换当前的矩阵,但究竟是做什么的呢?如果每个程序都需要它,为什么我的代码中没有函数,除非我知道它们做了什么 . 我应该注意到,我专门为丰富的2D客户端使用OpenGL,所以请原谅我的无知,如果这对于3D非常明显 .
关于 glMatrixMode(GL_PROJECTION)
VS glMatrixMode(GL_MODELVIEW)
也有点困惑 .
5 回答
就投影和模型视图矩阵而言,单位矩阵基本上将矩阵重置回其默认状态 .
正如您所知,
glTranslate
和glRotate
始终相对于矩阵的当前状态 . 因此,例如,如果你调用glTranslate
,当你调用glLoadIdentity()
时,你正在从矩阵's current '位置', not from the origin. But if you want to start over at the origin, that'转换,然后你可以从现在位于原点的矩阵glTranslate
,或者从现在定位于矩阵的矩阵glRotate
默认方向 .我认为Boon的答案,它相当于1,并不完全正确 . 矩阵实际上看起来像这样:
这就是单位矩阵 . Boon在数学上是正确的,任何矩阵乘以该矩阵(或看起来像这样的矩阵;对角线,其他所有0)将产生原始矩阵,但我不相信他解释了为什么这很重要 .
这很重要的原因是因为OpenGL将所有位置和旋转乘以每个矩阵;因此,当您绘制一个多边形(
glBegin(GL_FACE)
,某些点,glEnd()
)时,它会将其与MODELVIEW相乘,然后将其转换为"world space",然后通过将其与PROJECT矩阵相乘将其从3D转换为2D,并将其转换为屏幕上的2D点以及用于绘制像素的深度(来自屏幕'camera') . 但是当这些矩阵中的一个是单位矩阵时,这些点与单位矩阵相乘,因此不会改变,因此矩阵没有影响;它不会转换点,它不会旋转它们,它会保持原样 .我希望这可以澄清一点!
对于数字,标识矩阵相当于1 . 如你所知,任何乘以1的数字本身就是
(e.g. A x 1 = A)
,矩阵
( MatrixA x IdentityMatrix = MatrixA)
也是如此 .因此,在将其他矩阵乘以矩阵堆栈之前,加载单位矩阵是一种将矩阵初始化为正确状态的方法 .
glMatrixMode(GL_PROJECTION)
:处理透视变换或正交变换使用的矩阵 .glMatrixMode(GL_MODELVIEW)
:处理模型 - 视图转换使用的矩阵 . 也就是说,将对象(也称为模型)转换为视图坐标空间(或相机空间) .投影矩阵用于创建查看量 . 想象一下现实世界中的场景 . 你并没有真正看到周围的一切,只有你眼睛允许你看到的东西 . 如果你是一条鱼,你可以看到更广泛的东西 . 因此,当我们说我们设置投影矩阵时,我们意味着我们设置了我们想要从我们创建的场景中看到的内容 . 我的意思是你可以在世界的任何地方绘制物体 . 如果它们不在视图卷内,您将看不到任何内容 . 创建视图体积时,想象您创建了6个定义视野的剪裁平面 .
对于模型视图矩阵,它用于对您世界中的模型(对象)进行各种转换 . 像这样你只需要定义一次你的对象然后翻译它或旋转它或缩放它 .
在绘制场景中的对象之前,可以使用投影矩阵来设置视图体积 . 然后绘制对象并相应地更改模型视图矩阵 . 当然,您可以在绘制模型的中途更改矩阵,例如,如果您想要绘制场景然后绘制一些文本(使用某些方法可以在正交投影中更容易工作),然后更改回模型视图矩阵 .
至于名称模型,它与建模和查看转换的二元性有关 . 如果你将相机拉回5个单位,或者将物体向前移动5个单位,它基本上是相同的 .
希望我能说清楚一点
单位矩阵用于将矩阵“初始化”为合理的默认值 .
一件重要的事情意识到矩阵乘法在某种意义上是附加的 . 例如,如果您采用以单位矩阵开头的矩阵,则将其乘以旋转矩阵,然后将其乘以缩放矩阵,最后得到一个旋转的矩阵,并对其乘以的矩阵进行缩放 .
glLoadIdentity()
函数确保每次进入投影模式时,矩阵将被重置为单位矩阵,以便新的查看参数不会与前一个相结合 .