Разница между 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.