1. ホーム
  2. c++

[解決済み] glMatrixMode(GL_PROJECTION) とglMatrixMode(GL_MODELVIEW)の相違点

2022-02-17 01:46:49

質問

とはどう違うのですか? 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) ?

解決方法は?

ある風景を見るとき、GL的には、カメラとレンズがあります。

ModelViewは、カメラ(位置、ポインティング、アップベクトル)を表す行列です。

ProjectionView はカメラのレンズを表す行列です(絞り、遠景、近景など)。

参照 ここで をご覧ください。

あなたのような単純な例では、それは多くの違いを生むことはありません。しかし、一般的には、OpenGLに行列の乗算と逆行列を使った計算を依頼する必要があります。例えば、画面上の点をGL座標系の点に変換したい場合、GLは投影行列とモデル行列を必要とし、特定の順序でそれらを乗算します。その場合、行列の乗算は非可換であるため、適宜使い分ける必要があります。