Как говорит SuperMaximo93, важно разделить матрицы преобразования, чтобы все объекты рисовались с их собственным уникальным преобразованием.glPushMatrix()
- это относительно простой способ справиться с этим.
Я должен добавить, что также важно, чтобы вы вызывали ваши функции преобразования (glTranslatef / Rotatef / Scalef / etc) в правильном порядке.
OpenGL умножает матрицы преобразования в пост-порядке (в отличие от pre -заказа).Поэтому, когда вы вызываете glRotatef()
, текущая матрица, C , умножается на матрицу вращения, представляющую вызов glRotate()
, M , следующим образом:
C x M
и позиция (или вектор), v , преобразованная вызовом, преобразуется следующим образом:
C x M xv
Это заставляет вас вызывать функции преобразования в порядке, который может показаться обратным тому, что должно быть выполнено.Например:
glTranslatef(0.0f, 1.0f, 0.0f);
glRotatef(30.0f, 0.0f, 0.0f, 1.0f);
drawMyObject();
Эффект кода выше будет таким, что нарисованный объект будет сначала повернут на 30 градусов против часовой стрелки, , а затем переведен вверх на экранна 1,0 (при условии, что положительное значение вверх по оси Y), в отличие от того, что сначала переводится вверх, а затем поворачивается вдоль центра экрана на 30 градусов против часовой стрелки.
См. также http://www.opengl.org/sdk/docs/man/xhtml/glMultMatrix.xmlдля получения дополнительной документации по этому вопросу.