【问题标题】:OpenGL glMatrixMode(GL_PROJECTION) vs glMatrixMode(GL_MODELVIEW)OpenGL glMatrixMode(GL_PROJECTION) 与 glMatrixMode(GL_MODELVIEW)
【发布时间】:2015-06-30 11:54:12
【问题描述】:

glRotatef()放在glMatrixMode(GL_PROJECTION);

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

并将 glRotatef() 放在 glMatrixMode(GL_MODELVIEW);

之后
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glRotatef(red, green, blue);

【问题讨论】:

    标签: opengl rotation transform matrix-multiplication


    【解决方案1】:

    OpenGL 分别存储 Projection 和 ModelView 矩阵,调用 glMatrixMode() 可以指定要使用以下调用操作的矩阵。 因此,在第一个示例中,您将旋转应用于投影矩阵,而在第二个示例中,您将其应用于 ModelView 矩阵(这将更常见)

    另请参阅此答案以进行澄清Difference between glMatrixMode(GL_PROJECTION); and glMatrixMode(GL_MODELVIEW);

    【讨论】:

      【解决方案2】:

      来自documentation

      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 而不是 gl_modelview 之后使用 rotatef,则会旋转您的投影矩阵,这会破坏您的投影矩阵。

      `

      【讨论】:

        猜你喜欢
        • 2012-05-11
        • 1970-01-01
        • 2013-06-01
        • 1970-01-01
        • 2016-06-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多