glMatrixMode(GL_PROJECTION)和glMatrixMode(GL_MODELVIEW)之间的区别

7
"

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) 之间的区别吗?

2个回答

11

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

ModelView是表示您的相机(位置、朝向和上向量)的矩阵。

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

在这里了解更多信息...

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


无论是MODELVIEW矩阵还是PROJECTION矩阵都会影响最终场景。如果您查看一些示例,您将看到人们操纵这两个矩阵,例如GL_MODELVIEW和GL_PROJECTION。您最好从一个有用的示例开始,但如果您想通过其中一个矩阵来修改代码以使其实现某些功能,可以在glLoadIdentity()之后添加操纵当前矩阵的行,如链接帖子中所示。对于PROJECTION,使用glFrustum,对于MODELVIEW,使用glTranslatedglRotated - ToolmakerSteve

5
当然你没有得到不同的结果。你实际上并没有对矩阵进行任何操作。你将其设置为单位矩阵...这是默认值。
一般来说,应该只将投影矩阵放入GL_PROJECTION矩阵中。从模型空间到相机空间的变换应该放入GL_MODELVIEW矩阵中。
如果你不知道投影矩阵是什么,或者不确定矩阵是什么,我建议查阅 proper OpenGL学习材料。并避免使用固定功能GL。

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