在OpenGL中用三角形绘制的圆柱体

时间:2016-11-21 16:45:19

标签: opengl procedural-generation

它绘制了一个带有堆叠和边缘的圆柱体,但问题是堆叠连接到一个点而不是一个新点。 也许一张图片会更好地展示它: Cylinder

以下是我如何渲染副本,因为磁盘是单独渲染的:

for (int i = 1; i <= height; ++i) {
        for (int j = 0; j < edges; ++j) {
            glBegin(GL_TRIANGLES); {
                // 0 bottom 
                glVertex3f(x + radius * cos(theta + interval), y , z + radius * sin(theta + interval));
                // 1 bottom
                glVertex3f(x + radius * cos(theta), y + y_value * i, z + radius * sin(theta));
                // 2 top
                glVertex3f(x + radius * cos(theta), y + y_value * i, z + radius * sin(theta));
                // 2 top
                glVertex3f(x + radius * cos(theta), y + y_value * i, z + radius * sin(theta));
                // 3 top
                glVertex3f(x + radius * cos(theta + interval), y + y_value * i, z + radius * sin(theta + interval));
                // 0 bottom 
                glVertex3f(x + radius * cos(theta + interval), y , z + radius * sin(theta + interval));
            } glEnd();
            theta += interval;
        }
        theta = 0.0;
    }

我已经试图解决它好几天而且我的想法用完了。你知道我做错了吗?

更新: 我使用ybungalobill建议将其改为使用四边形进行渲染。现在我正在努力应对紫外线测绘。并且希望一旦这部分得到解决,它就很容易转换成三角形。 这就是我现在所拥有的: enter image description here

这就是我用于UV映射的代码:

u = 0.0,
v = 0.0,
u_inter = 1.0 / edges,
v_inter = 1.0 / y_value;  // (y_value = height / edges)

    for (int i = 1; i <= height; ++i) {
        for (int j = 0; j < edges; ++j) {
            glBegin(GL_QUAD_STRIP); {
                // 0 bottom 
                glTexCoord2f(u, v);
                // 1 bottom
                glTexCoord2f(u + u_inter, v);
                // 2 top
                glTexCoord2f(u + u_inter, v + v_inter);
                // 3 top
                glTexCoord2f(u, v + v_inter);
            } glEnd();
            theta += interval;
            u += u_inter;
        }
        v += v_inter;
        theta = 0.0;
    }

1 个答案:

答案 0 :(得分:1)

float y0 = y + y_value * (i-1);
float y1 = y + y_value * i;
// 0 bottom 
glVertex3f(x + radius * cos(theta + interval), y0, z + radius * sin(theta + interval));
// 1 bottom
glVertex3f(x + radius * cos(theta), y0, z + radius * sin(theta));
// 2 top
glVertex3f(x + radius * cos(theta), y1, z + radius * sin(theta));
// 2 top
glVertex3f(x + radius * cos(theta), y1, z + radius * sin(theta));
// 3 top
glVertex3f(x + radius * cos(theta + interval), y1, z + radius * sin(theta + interval));
// 0 bottom 
glVertex3f(x + radius * cos(theta + interval), y0, z + radius * sin(theta + interval));