【问题标题】:Using glMatrixMode() in succession?连续使用glMatrixMode()?
【发布时间】:2019-10-10 19:35:49
【问题描述】:

如何连续使用两种不同的矩阵模式?即,假设我想使用glOrtho() 对投影矩阵进行一些操作。所以我打电话给glMatrixMode(GL_PROJECTION),然后执行操作。据我了解,使用glPushMatrix() 会将这些更改应用于投影矩阵。现在我想对模型视图矩阵进行一些更改。我对如何正确执行此操作感到困惑。我是弹出矩阵然后调用glMatrixMode 还是直接继续使用glMatrixMode

【问题讨论】:

  • glPushMatrix() 不应用任何更改。任何矩阵运算都会改变当前模式下的当前矩阵。但是每个矩阵模式都有一堆矩阵。 glPushMatrix 将当前矩阵推入堆栈,glPopMatrix 将其弹出。对投影矩阵使用模式GL_PROJECTION,对视图和模型矩阵使用GL_MODELVIEW。请注意,每个顶点首先由模型视图转换,然后由投影矩阵转换。顺序很重要。
  • 不要担心Legacy OpenGL 矩阵堆栈。几十年来,这已被弃用。如果你还不知道,那么就没有必要再研究它了。阅读ShaderVertex Specification。一个很好的教程是LearnOpenGL

标签: c opengl opengl-compat


【解决方案1】:

glPushMatrixglPopMatrix 用于存储/恢​​复当前选择的矩阵。它用于例如子网格(如机械臂),您需要返回到根子网格的状态...

您所描述的是glMatrixMode 的用途。所以你的代码应该是这样的:

glMatrixMode(GL_PROJECTION);
// here your stuff for setting projection
glMatrixMode(GL_MODELVIEW);
// here your stuff for setting modelview

您应该在处理矩阵的每个代码块之前调用glMatrixMode。不要期望当前矩阵设置为您将其设置为最后的东西。这会在以后导致混乱......例如,许多绘图算法会在运行时更改模型视图和/或纹理矩阵,并且在您的代码中您可以有这样的东西:

glMatrixMode(GL_MODELVIEW);
// here your stuff for setting modelview
glMatrixMode(GL_PROJECTION);
// here your stuff for setting projection

object1.draw();

// and here the current matrix could be changed from the object1.draw()

【讨论】:

    【解决方案2】:
        glMatrixMode(GL_PROJECTION);    glPushMatrix(); glLoadIdentity();
        glOrtho(a, b, c,d,  e,f);// 
        glMatrixMode(GL_MODELVIEW);     glPushMatrix(); glLoadIdentity();
    
    
    //----------
    //----------
    
        glMatrixMode(GL_PROJECTION);    glPopMatrix();
        glMatrixMode(GL_MODELVIEW);     glPopMatrix();
    

    【讨论】:

      【解决方案3】:
      float mat_proj[16];
      float mat_model[16];    
      
      glGetFloatv(GL_PROJECTION_MATRIX,mat_proj );
      glGetFloatv(GL_MODELVIEW_MATRIX ,mat_model);
      glMatrixMode(GL_PROJECTION);glLoadIdentity();
      glOrtho(a,b,c,d,e,f);
      glMatrixMode(GL_MODELVIEW);glLoadIdentity(); 
      //---------
      //---------
      glMatrixMode(GL_PROJECTION);   glLoadMatrixf(mat_proj);
      glMatrixMode(GL_MODELVIEW);    glLoadMatrixf(mat_model);
      

      【讨论】:

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