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);更改此代码?
答案 0 :(得分:11)
当您观看场景时,从GL的角度来看,您有一个相机和一个镜头。
ModelView是表示相机的矩阵(位置,指向和向上矢量)。
ProjectionView是代表相机镜头的矩阵(光圈,远场,近场等)。
有关这些内容的详情,请参阅here
在像你这样的简单例子中,这并没有多大区别。但是,通常,您需要通过使用矩阵乘法和反演来要求OpenGL计算内容。例如,如果要将屏幕上的点转换为GL坐标系的点,GL将需要投影矩阵和模型矩阵,并将它们乘以特定的顺序。在这种情况下,必须相应地使用它们,因为矩阵乘法是不可交换的。
答案 1 :(得分:4)
当然你没有得到不同的结果。你实际上并没有用矩阵做任何事情。您将其设置为identity ...这是默认值。
通常,您应该只将投影矩阵放入GL_PROJECTION
矩阵中。从模型空间到相机空间的变换应该进入GL_MODELVIEW
矩阵。
如果您不知道投影矩阵是什么,或者您不确定矩阵是什么,我建议查找proper OpenGL learning materials。并避免使用固定功能GL。