Я хочу нарисовать цилиндр, используя gluQuadric и gluCylinder.
Этот цилиндр должен быть текстурированным.
Мой код розыгрыша следующий:
pTexture->Enable();
pTexture->Bind();
glPushMatrix();
glRotatef(-90.0f, 1.0f, 0.0f, 0.0f);
gluQuadricOrientation(quadric, GLU_OUTSIDE);
gluQuadricNormals(quadric, true);
gluQuadricTexture(quadric, true);
gluCylinder(quadric, getRadius(), getRadius(), getHeight(), 16, 1);
glPopMatrix();
pTexture->Unbind();
pTexture->Disable();
Моя проблема с этим сейчас, когда текстура повернута на 90 градусов. Как я могу повернуть UV-отображение квадрики?
Текстура используется в других местах и поэтому не может быть отредактирована.
В дополнение к более широко используемым GL_MODELVIEW
а также GL_PROJECTION
матричные стеки, есть также GL_TEXTURE
стек матрицы, который можно использовать для применения преобразований к координатам текстуры. Например, это повернет координаты текстуры на 90 градусов:
glMatrixMode(GL_TEXTURE);
glRotatef(90.0f, 0.0f, 0.0f, 1.0f);
glMatrixMode(GL_MODELVIEW);
Так как координаты текстуры обычно находятся в единичном квадрате [0.0, 1.0] x [0.0, 1.0], использование только этого может иметь нежелательные побочные эффекты. Вращение происходит против часовой стрелки вокруг начала координат, поэтому наш квадрат юнитов будет повернут на квадрат со степенью [-1.0, 0.0] x [0.0, 1.0]. Таким образом, в дополнение к вращению, квадрат был смещен на (0,0, -1,0). Это безвредно, если режим обтекания GL_REPEAT
, но будет плохо при использовании режима обтекания, как GL_CLAMP_TO_EDGE
, Мы можем исправить это, применив перевод в противоположном направлении после поворота (помните, что преобразование, указанное последним, применяется первым):
glMatrixMode(GL_TEXTURE);
glTranslatef(1.0f, 0.0f, 0.0f);
glRotatef(90.0f, 0.0f, 0.0f, 1.0f);
glMatrixMode(GL_MODELVIEW);
Кроме того, в зависимости от ориентации вашего изображения вместо этого вам может потребоваться повернуть на -90 градусов. В этом случае единичный квадрат с экстентом [0,0, 1,0] x [0,0, 1,0] будет повернут в квадрат с экстентом [0,0, 1,0] x [-1,0, 0,0]. Применяя тот же тип корректирующего перевода для этого случая, мы получаем:
glMatrixMode(GL_TEXTURE);
glTranslatef(0.0f, 1.0f, 0.0f);
glRotatef(-90.0f, 0.0f, 0.0f, 1.0f);
glMatrixMode(GL_MODELVIEW);