OpenGL:什么是MatrixMode?

时间:2011-03-20 07:59:38

标签: opengl

有几种模式可供选择:

Modelview
Projection
Texture
Color

他们是什么意思?什么是最常用的?你知道哪些简单的初学者读物?

4 个答案:

答案 0 :(得分:16)

OpenGL使用多个矩阵来转换几何和相关数据。那些矩阵是:

  • 模型视图 - 将对象几何体置于全局未投影空间
  • 投影 - 将全局坐标投影到剪辑空间;你可能会认为它是一种镜头
  • 纹理 - 之前调整纹理坐标;主要用于实现纹理投影(即投影纹理就好像它是投影仪中的幻灯片一样)
  • 颜色 - 调整顶点颜色。很少碰到

所有这些矩阵一直在使用。由于它们遵循所有相同的规则,OpenGL只有一组矩阵操作函数:glPushMatrixglPopMatrixglLoadIdentityglLoadMatrixglMultMatrix,{{1 }},glTranslateglRotateglScaleglOrtho

glFrustum选择这些操作对哪个矩阵进行操作。假设您想编写一些C ++命名空间包装器,它可能如下所示:

glMatrixMode

稍后在C ++程序中,您可以编写

namespace OpenGL {
  // A single template class for easy OpenGL matrix mode association
  template<GLenum mat> class Matrix
  {
  public:
    void LoadIdentity() const 
        { glMatrixMode(mat); glLoadIdentity(); }

    void Translate(GLfloat x, GLfloat y, GLfloat z) const
        { glMatrixMode(mat); glTranslatef(x,y,z); }
    void Translate(GLdouble x, GLdouble y, GLdouble z) const
        { glMatrixMode(mat); glTranslated(x,y,z); }

    void Rotate(GLfloat angle, GLfloat x, GLfloat y, GLfloat z) const
        { glMatrixMode(mat); glRotatef(angle, x, y, z); }
    void Rotate(GLdouble angle, GLdouble x, GLdouble y, GLdouble z) const
        { glMatrixMode(mat); glRotated(angle, x, y, z); }

    // And all the other matrix manipulation functions
    // using overloading to select proper OpenGL variant depending on
    // function parameters, and all the other C++ whiz.
    // ...
  };

  // 
  const Matrix<GL_MODELVIEW>  Modelview;
  const Matrix<GL_PROJECTION> Projection;
  const Matrix<GL_TEXTURE>    Texture;
  const Matrix<GL_COLOR>      Color;
}

不幸的是,C ++无法模板命名空间,或者在实例上应用void draw_something() { OpenGL::Projection::LoadIdentity(); OpenGL::Projection::Frustum(...); OpenGL::Modelview::LoadIdentity(); OpenGL::Modelview::Translate(...); // drawing commands } (或using)(其他语言都有这个),否则我会编写类似(无效的C ++)

with

我认为最后一段剪切的(伪)代码清楚地表明:void draw_something_else() { using namespace OpenGL; with(Projection) { // glMatrixMode(GL_PROJECTION); LoadIdentity(); // glLoadIdentity(); Frustum(...); // glFrustum(...); } with(Modelview) { // glMatrixMode(GL_MODELVIEW); LoadIdentity(); // glLoadIdentity(); Translate(...); // glTranslatef(...); } } 是一种glMatrixMode OpenGL语句。

答案 1 :(得分:3)

作为旁注,在OpenGL 3.3及更高版本中不推荐使用矩阵模式(以及矩阵堆栈功能的其余部分)。

答案 2 :(得分:2)

它们的所有由OpenGL内部使用,但是否需要更改它们取决于您的应用程序。

您始终需要设置“投影”矩阵以确定您的视野以及您正在查看的空间范围。通常,您将设置Modelview矩阵以选择“相机”方向,并在场景中定位对象。

纹理和颜色矩阵不太常用。在我当前的项目中,我使用Texture矩阵在我的位图中翻转Y.我个人从未使用过Color矩阵。

答案 3 :(得分:0)

您可以在http://www.opengl.org/sdk/docs/man/xhtml/glMatrixMode.xml

找到答案

modelview用于建模。投影用于投影像3d的东西。纹理的纹理。着色的颜色。但还有更多。请阅读我给你的链接。欢呼声。