【问题标题】:How to do texture mapping for cylinder created by GL_TRIANGLE_STRIP in OpenGL and how to taper a cylinder如何为OpenGL中的GL_TRIANGLE_STRIP创建的圆柱体进行纹理映射以及如何使圆柱体变细
【发布时间】:2021-02-14 05:30:41
【问题描述】:

我目前正在尝试从海绵宝宝方裤的房子中创建一个 squidward 模型。

我已经用 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();

这是纹理应该看起来的样子:

这是圆柱体上的样子

【问题讨论】:

    标签: c++ opengl graphics glut


    【解决方案1】:

    纹理坐标是二维的,必须在 [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?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多