如何在 OpenGL 中为 GL_TRIANGLE_STRIP 创建的圆柱体做纹理映射以及如何使圆柱体变细

How to do texture mapping for cylinder created by GL_TRIANGLE_STRIP in OpenGL and how to taper a cylinder

我目前正在尝试从海绵宝宝的房子里创建章鱼哥的模型。

我用 GL_TRIANGLE_STRIPs 创建了一个圆柱体,因为不允许我使用任何预定义的 OpenGL 模型来创建形状。

我正在尝试为圆柱体上的每个三角形做纹理贴图,但纹理被拉伸了,而不是它应该的样子。

这是我的圆柱体代码

glPushMatrix();
    glTranslated(xPos, yPos, TABLETOP_Z - cubeLen);
    glScaled(cubeLen / 2, cubeLen / 2, 1.0);
        
    glBegin(GL_TRIANGLE_STRIP);
        glTexCoord3f(xPos, yPos, TABLETOP_Z);
        glTexCoord3f(xPos, yPos, TABLETOP_Z);

        for (int i = 0; i <= 32; i++) {
            double x_next = 1.0 * cos((i + 1) * 2.0 * PI/ (32 - 2.0));
            double y_next = 1.0 * sin((i + 1) * 2.0 * PI / (32 - 2.0));

            if (i % 2 == 0) {
                glTexCoord3f(x_next, y_next, TABLETOP_Z + cubeLen);
                glVertex3f(x_next, y_next, TABLETOP_Z + cubeLen);

            } else {
                glTexCoord3f(x_next, y_next, TABLETOP_Z);
                glVertex3f(x_next, y_next, TABLETOP_Z);
            }
        }

    glEnd();
    glPopMatrix();

纹理应该是这样的:

这是它在圆柱体上的样子

纹理坐标是二维的,必须在 [0.0, 1.0] 范围内:

glBegin(GL_TRIANGLE_STRIP);
for (int i = 0; i <= 32; i++) {
    double x_next = 1.0 * cos((i + 1) * 2.0 * PI/ (32 - 2.0));
    double y_next = 1.0 * sin((i + 1) * 2.0 * PI / (32 - 2.0));

    if (i % 2 == 0) {
        glTexCoord3f((float)i / 32.0f, 1.0f);
        glVertex3f(x_next, y_next, TABLETOP_Z + cubeLen);

    } else {
        glTexCoord3f((float)i / 32.0f, 0.0f);
        glVertex3f(x_next, y_next, TABLETOP_Z);
    }
}
glEnd();

How do opengl texture coordinates work?