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);

Другие вопросы по тегам