gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 06:48:08 26 4
gpt4 key购买 nike

我想使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com