繁体   English   中英

带旋转纹理的gluCylinder

[英]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_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这样的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM