Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ glMatrixMode(GL_投影)和glMatrixMode(GL_模型视图)之间的差异_C++_Math_Opengl_Graphics - Fatal编程技术网

C++ glMatrixMode(GL_投影)和glMatrixMode(GL_模型视图)之间的差异

C++ glMatrixMode(GL_投影)和glMatrixMode(GL_模型视图)之间的差异,c++,math,opengl,graphics,C++,Math,Opengl,Graphics,glMatrixMode(GL\u投影)和glMatrixMode(GL\u模型视图)之间有什么区别 #包括 #包括 #包括 #定义密钥_escape27 void display(); 无效键盘(无符号字符,int,int); int main(int argc,字符**argv){ glutInit(&argc,argv); glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_深度); glutInitWindowSize(600400); g

glMatrixMode(GL\u投影)
glMatrixMode(GL\u模型视图)
之间有什么区别

#包括
#包括
#包括
#定义密钥_escape27
void display();
无效键盘(无符号字符,int,int);
int main(int argc,字符**argv){
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_深度);
glutInitWindowSize(600400);
glutCreateWindow(“Opengl测试”);
glutDisplayFunc(显示器);
键盘Func(键盘);
glutMainLoop();
返回0;
}
无效显示(){
浮动x,y,z;
int i;
x=0;
y=-0.8;
z=0;
glMatrixMode(GL_投影);
glLoadIdentity();
glClear(GLU颜色缓冲位);
gl3f(1,1,0);
glBegin(总分);

对于(i=0;i当然,您没有得到不同的结果。您实际上没有对矩阵做任何操作。您将其设置为identity…这是默认值

通常,您只应将投影矩阵放入
GL\u投影
矩阵。从模型空间到摄影机空间的变换应放入
GL\u模型视图
矩阵


如果您不知道投影矩阵是什么,或者您不确定矩阵是什么,我建议您查找。并避免使用固定函数GL。

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

ModelView是表示相机(位置、指向和上方向向量)的矩阵

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

请参阅以获取有关这些的更多信息


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

MODELVIEW矩阵和投影矩阵都会影响最终场景。如果您查看示例,您将看到有人同时操作这两个矩阵,例如……您可能最好从一个有用的示例开始,但如果您愿意的话若要更改代码以使其对其中一个矩阵执行操作,请尝试在操纵当前矩阵的glLoadIdentity()之后添加行,如链接文章中所示。
glFrustum
用于投影,和/或
glTranslated
glRotated
用于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;
    }
}
#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;
    }
}