gluCylinder旋转纹理

时间:2014-07-03 14:13:34

标签: 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-mapping?

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

1 个答案:

答案 0 :(得分:1)

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