5

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)か?

4

2 に答える 2

11

シーンを見ているとき、GL の観点からは、カメラとレンズがあります。

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

ProjectionView は、カメラのレンズ (絞り、遠視野、近視野など) を表すマトリックスです。

それらの詳細については、こちらを参照してください...

あなたのような単純な例では、大きな違いはありません。ただし、一般的には、OpenGL に行列の乗算と反転を使用して計算を依頼する必要があります。たとえば、画面上の点を GL 座標系の点に変換する場合、GL は射影行列とモデル行列を必要とし、それらを特定の順序で乗算します。その場合、行列の乗算は可換でないため、それに応じて使用する必要があります。

于 2012-05-02T05:37:48.540 に答える
4

もちろん、異なる結果は得られませんでした。あなたは実際にマトリックスで何もしませんでした。デフォルト値である identity... に設定します。

一般に、行列には​​射影行列のみを配置する必要がありますGL_PROJECTION。モデルの空間からカメラ空間への変換は、GL_MODELVIEWマトリックスに入る必要があります。

射影行列とは何かがわからない場合、または行列とは何かがわからない場合は、適切な OpenGL 学習教材を調べることをお勧めします。また、固定機能 GL の使用を回避します。

于 2012-05-02T05:36:40.993 に答える