#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
. В противном случае вам, возможно, придется добавить некоторые переводы. Я мог бы обновить ответ позже сегодня, чтобы подробнее остановиться на этом.