[英]gluCylinder with rotated texture
我想使用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
这样的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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.