Разница между glMatrixMode(GL_PROJECTION); и glMatrixMode(GL_MODELVIEW);

В чем разница между 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 ответа

Решение

Когда вы смотрите на сцену, с точки зрения GL, у вас есть камера и объектив.

ModelView - это матрица, представляющая вашу камеру (положение, направление и вектор вверх).

ProjectionView - это матрица, представляющая объектив вашей камеры (диафрагма, дальнее поле, ближнее поле и т. Д.).

Смотрите здесь для получения дополнительной информации о тех...

В простых примерах, подобных вашему, это не имеет большого значения. Однако, в общем, вам нужно попросить OpenGL вычислить материал, используя умножения матриц и инверсии. Например, если вы хотите преобразовать точку на экране в точку системы координат GL, GL потребуется матрица проекции и матрица модели и умножить их на определенный порядок. В этом случае вы должны использовать их соответственно, потому что умножения матриц не коммутируемы.

Конечно, вы не получили другой результат. Вы на самом деле ничего не сделали с матрицей. Вы устанавливаете его на идентичность... который является значением по умолчанию.

В общем случае вы должны помещать проекционные матрицы только в GL_PROJECTION матрица. Преобразования, которые идут из пространства модели в пространство камеры, должны войти в GL_MODELVIEW матрица.

Если вы не знаете, что такое матрица проекции, или если вы не уверены, что такое матрица, я бы посоветовал поискать подходящие учебные материалы по OpenGL. И избегая использования фиксированной функции GL.

Другие вопросы по тегам