glMatrixMode(GL_PROJECTION)之间的差异; 和glMatrixMode(

2019-09-16 22:48发布

什么是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); 改变这种代码?

Answer 1:

当你正在寻找一个场景,从GL一点,你有一个摄像头和一个镜头。

模型视图是表示相机的矩阵(位置,指向,并且向上矢量)。

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

见这里就这些详细信息...

在像你这样简单的例子,并不能使许多差异。 然而,在一般情况下,你需要问的OpenGL利用矩阵乘法和反演计算的东西。 举例来说,如果你想在屏幕上点变换到GL的点的坐标系,GL将需要一个投影矩阵和模型矩阵,并通过特定的顺序将它们相乘。 在这种情况下,你必须相应地使用它们,因为矩阵乘法是不可可交换。



Answer 2:

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

在一般情况下,你应该只把投影矩阵到GL_PROJECTION矩阵。 从模型空间到摄像机空间去变换应该进入GL_MODELVIEW矩阵。

如果你不知道什么是投影矩阵是,或者如果你不确定矩阵是什么,我建议查找正确的OpenGL的学习材料 。 并避免使用固定功能GL的。



文章来源: Difference between glMatrixMode(GL_PROJECTION); and glMatrixMode(GL_MODELVIEW);