c++ - 具有旋转纹理的 gluCylinder

标签 c++ opengl texture-mapping 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 贴图?

纹理在其他地方使用,因此无法编辑。

最佳答案

除了使用比较广泛的GL_MODELVIEWGL_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);

关于c++ - 具有旋转纹理的 gluCylinder,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24556114/

相关文章:

c++ - 我正在尝试使用 C++ 中的输入文件创建词典

c++ - 交错 std::map 插入和迭代

c++ - 澄清 C++ 中 cin 的基本行为

c - OpenGL : error with invalid format but NULL data

opengl - 物体不会旋转?

c++ - 纹理不会出现 - GLUT OpenGL

c++ - 使用 stringstream 从字符串中提取单个值

c# - 'CsGL.OSLib' 抛出异常

3d - Direct3D:使用单个 DrawIndexedPrimitives 调用绘制纹理立方体。可能的?

opengl - OpenGL 中的纹理映射意外错误