Глюцилиндр с повернутой текстурой

#c #opengl #texture-mapping #glu

#c #opengl #отображение текстуры #glu

Вопрос:

Я хочу нарисовать цилиндр, используя 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-отображение квадрика?

Текстура используется в других местах и, следовательно, не может быть отредактирована.

Ответ №1:

В дополнение к более широко используемым 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);
  

Комментарии:

1. Я не знаю почему, но поворот на 90 градусов приводит к получению цилиндра только одного цвета. Поворот на -90 градусов работает нормально, и выглядит так, как хотелось бы.

2. Хм, да, поскольку координаты текстуры находятся в диапазоне [0.0, 1.0], поворот их вокруг начала координат может дать вам неожиданные результаты, поскольку они окажутся за пределами этого диапазона. Вероятно, было бы неплохо, если бы у вас был режим переноса GL_REPEAT . В противном случае вам, возможно, придется добавить некоторые переводы. Я мог бы обновить ответ позже сегодня, чтобы подробнее остановиться на этом.