【问题标题】:gluCylinder with rotated texture具有旋转纹理的 gluCylinder
【发布时间】:2014-07-04 13:24:31
【问题描述】:

我想使用 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 映射?

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

【问题讨论】:

    标签: c++ opengl texture-mapping glu


    【解决方案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);
    

    【讨论】:

    • 我不知道为什么,但旋转 +90 度会导致圆柱体只有一种颜色。旋转 -90 度可以正常工作,并且看起来符合要求。
    • 嗯,是的,因为纹理坐标在 [0.0, 1.0] 范围内,围绕原点旋转它们可能会给您带来令人惊讶的结果,因为它们最终会超出该范围。如果你的换行模式是GL_REPEAT 可能会很好。否则,您可能需要添加一些翻译。我可能会在今天晚些时候更新答案以详细说明。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-19
    • 2014-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多