OpenGL的glMatrixMode(GL_PROJECTION)和glMatrixMode(GL_MODELVIEW)有什么区别?

3
glRotatef() 放在 glMatrixMode(GL_PROJECTION); 之后有什么区别?
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glRotatef(red, green, blue);

glRotatef()放在glMatrixMode(GL_MODELVIEW);之后。

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glRotatef(red, green, blue);
2个回答

4

根据文档

glMatrixMode()函数指定当前矩阵。

GL_MODELVIEW - Applies subsequent matrix operations to the modelview matrix stack.

GL_PROJECTION - Applies subsequent matrix operations to the projection matrix stack.

这些是什么意思?

如果将当前矩阵模式设置为投影模式(例如,glMatrixMode(GL_PROJECTION)),则需要更改投影矩阵。自然而然的,其中一个应该是下一行:

正交投影:

  • glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far);
  • gluOrtho2D(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top);

透视投影:

  • void glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far);
  • void gluPerspective(GLdouble fov, GLdouble aspect, GLdouble near, GLdouble far);

如果将当前矩阵模式设置为模型视图模式(例如,glMatrixMode(GL_MODELVIEW)),则表示我在模型视图矩阵中,可以应用基本操作来转换我的对象,例如:

  • glRotatef();
  • glTranslatef();
  • glScalef();

在您的问题中,如果在gl_projection之后使用rotatef而不是gl_modelview,则会旋转投影矩阵,从而损坏投影矩阵。


0

OpenGL将投影矩阵和模型视图矩阵分别存储,通过调用glMatrixMode()函数,您可以指定要使用以下调用来操作的矩阵。

因此,在第一个示例中,您将旋转应用于投影矩阵,在第二个示例中,您将其应用于模型视图矩阵(这更常见)。

此外,请查看此答案以获取澄清glMatrixMode(GL_PROJECTION)和glMatrixMode(GL_MODELVIEW)之间的区别


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接