OpenGL glMatrixMode(GL_PROJECTION) против glMatrixMode(GL_MODELVIEW)
В чем разница между размещением glRotatef() после glMatrixMode(GL_PROJECTION);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glRotatef(red, green, blue);
и размещение glRotatef() после glMatrixMode(GL_MODELVIEW);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glRotatef(red, green, blue);
2 ответа
Из документации:
glMatrixMode()
указывает, какая матрица является текущей матрицей.
GL_MODELVIEW - Applies subsequent matrix operations to the modelview matrix stack.
GL_PROJECTION - Applies subsequent matrix operations to the projection matrix stack.
Что они означают?
Если вы установите текущий режим матрицы в качестве проекции (например, glMatrixMode(GL_PROJECTION)
), вы должны изменить матрицу проекции. Естественно, одна из них должна быть следующей строки:
Для ортогональной проекции:
glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far);
gluOrtho2D(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top);
Для перспективного проецирования:
void glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far);
void gluPerspective(GLdouble fov, GLdouble aspect, GLdouble near, GLdouble far);
Если вы установите текущий режим матрицы как modelView(например, glMatrixMode(GL_MODELVIEW)
), вы говорите, что я нахожусь в матрице вида модели и могу применять базовые операции для преобразования моих объектов, например:
glRotatef();
glTranslatef();
glScalef();
В вашем вопросе, если вы используете rotatef после gl_projection вместо gl_modelview, вы поворачиваете матрицу проекции, что может повредить вашу матрицу проекции.
`
OpenGL хранит матрицы Projection и ModelView отдельно, при вызове glMatrixMode() вы указываете, какой матрицей вы хотите манипулировать с помощью следующих вызовов. Таким образом, в первом примере вы применяете вращение к матрице проекции, а во втором вы применяете его к матрице ModelView (что будет более распространенным)
Также посмотрите на этот ответ для уточнения Разница между glMatrixMode (GL_PROJECTION); и glMatrixMode (GL_MODELVIEW);