【问题标题】:Difference between glMatrixMode(GL_PROJECTION) and glMatrixMode(GL_MODELVIEW)glMatrixMode(GL_PROJECTION) 和 glMatrixMode(GL_MODELVIEW) 的区别
【发布时间】:2012-05-11 14:16:24
【问题描述】:

glMatrixMode(GL_PROJECTION)glMatrixMode(GL_MODELVIEW) 有什么区别?

#include <stdio.h>
#include <GL/gl.h>
#include <GL/glut.h>

#define KEY_ESCAPE 27

void display();
void keyboard(unsigned char,int,int);

int main(int argc, char **argv) {
    glutInit(&argc, argv);                                    
    glutInitDisplayMode(GLUT_RGB|GLUT_DOUBLE|GLUT_DEPTH );
    glutInitWindowSize(600,400);                  
    glutCreateWindow("Opengl Test");                              
    glutDisplayFunc(display);
    glutKeyboardFunc(keyboard);
    glutMainLoop();
    return 0;
}
void display() {
    float x,y,z;
    int i;
    x=0;
    y=-0.8;
    z=0;
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(1,1,0);
    glBegin(GL_POINTS);
    for(i=0;i<98;i++) {
        glVertex3f(x,y,z);
        x=x+0.01;
    }
    glEnd();
    glutSwapBuffers();    
}
void keyboard(unsigned char key, int mousePositionX, int mousePositionY) {
    switch ( key ) {
        case KEY_ESCAPE:
            exit ( 0 );  
            break;      
        default:      
            break;
    }
}

示例 2:

#include <stdio.h>
#include <GL/gl.h>
#include <GL/glut.h>

#define KEY_ESCAPE 27

void display();
void keyboard(unsigned char,int,int);

int main(int argc, char **argv) {
    glutInit(&argc, argv);                                    
    glutInitDisplayMode(GLUT_RGB|GLUT_DOUBLE|GLUT_DEPTH );
    glutInitWindowSize(600,400);                  
    glutCreateWindow("Opengl Test");                              
    glutDisplayFunc(display);
    glutKeyboardFunc(keyboard);
    glutMainLoop();
    return 0;
}
void display() {
    float x,y,z;
    int i;
    x=0;
    y=-0.8;
    z=0;
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(1,1,0);
    glBegin(GL_POINTS);
    for(i=0;i<98;i++) {
        glVertex3f(x,y,z);
        x=x+0.01;
    }
    glEnd();
    glutSwapBuffers();    
}
void keyboard(unsigned char key, int mousePositionX, int mousePositionY) {
    switch ( key ) {
        case KEY_ESCAPE:
            exit ( 0 );  
            break;      
        default:      
            break;
    }
}

对于这两个代码,我得到了相同的结果。 谁能说明这些glMatrixMode(GL_MODELVIEW)glMatrixMode(GL_PROJECTION) 的区别?

【问题讨论】:

    标签: c++ math opengl graphics


    【解决方案1】:

    当您从 GL 的角度看场景时,您有一个相机和一个镜头。

    ModelView 是代表您的相机(位置、指向和向上矢量)的矩阵。

    ProjectionView 是代表相机镜头(光圈、远场、近场等)的矩阵。

    有关这些的更多信息,请参阅here...

    在像您这样的简单示例中,这并没有太大区别。但是,一般来说,您需要让 OpenGL 使用矩阵乘法和求逆来计算东西。例如,如果你想将屏幕上的一个点转换为 GL 坐标系的一个点,GL 将需要一个投影矩阵和一个模型矩阵,并将它们乘以特定的顺序。在这种情况下,您必须相应地使用它们,因为矩阵乘法是不可交换的。

    【讨论】:

    • MODELVIEW 矩阵和 PROJECTION 矩阵都会影响最终场景。如果您查看示例,您会看到人们同时操纵这两者,例如GL_MODELVIEW and GL_PROJECTION。您可能最好从一个有用的示例开始,但是如果您想更改代码以使其对其中一个矩阵执行某些操作,请尝试在 glLoadIdentity() 之后添加行来操作当前矩阵,如链接帖子中所示. glFrustum 用于 PROJECTION,和/或 glTranslatedglRotated 用于 MODELVIEW。
    【解决方案2】:

    当然你没有得到不同的结果。您实际上并没有对矩阵做任何事情。您将其设置为身份...这是 默认 值。

    一般来说,您应该只将投影矩阵放入GL_PROJECTION 矩阵中。从模型空间到相机空间的变换应该进入GL_MODELVIEW 矩阵。

    如果您不知道什么是投影矩阵,或者不确定什么是矩阵,我建议您查找proper OpenGL learning materials。并且避免使用固定功能的GL。

    【讨论】:

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