生成带有顶点和索引的球体?

Generating spheres with vertices and indices?

我目前正在开发一个 OpenGL 项目,我目前应该在其中生成具有顶点和索引的球体。

所有的顶点代表一个点,indices告诉显卡把link3个点看成一个三角形。 示例:indices:{0,1,2} = 它将用第一个、第二个和第三个点组成一个三角形。

我已经设法制作了一个具有正确顶点的 UV 球体,但我不知道如何获得索引。

这是我目前的结果:

这是我的代码:

Mesh ObjectFactory::createSphere() {

    // Texture loaded and binded to the shaderprogram
    Texture textures[]{
        Texture("resources/pop_cat.png", "diffuse", 0, GL_RGBA, GL_UNSIGNED_BYTE),
    };

    int numHorizontalSegments = 20;
    int numVerticalSegments = 20;
    Vertex vertices[numVerticalSegments * numVerticalSegments] = {};
    GLuint indices[numVerticalSegments * numVerticalSegments] = {};
    int i = 0;

    for (int h = 0; h < numHorizontalSegments; h++) {
        float angle1 = (h + 1) * M_PI / (numHorizontalSegments + 1);
        for (int v = 0; v < numVerticalSegments; v++) {
            i++;
            float angle2 = v * (2 * M_PI) / numVerticalSegments;
            float x = sinf(angle1) * cosf(angle2);
            float y = cosf(angle1);
            float z = sinf(angle1) * sinf(angle2);
            vertices[i] = Vertex{glm::vec3(x, y, z), glm::vec3(0.83f, 0.70f, 0.44f), glm::vec2(0.0f, 0.0f)};

            indices[i] = i;
        }
    }

    // Store mesh data in vectors for the mesh
    std::vector<Vertex> verts(vertices, vertices + sizeof(vertices) / sizeof(Vertex));
    std::vector<GLuint> ind(indices, indices + sizeof(indices) / sizeof(GLuint));
    std::vector<Texture> tex(textures, textures + sizeof(textures) / sizeof(Texture));
    // Create sphere mesh
    return {verts, ind, tex};
}

非常感谢您的帮助!

您通过计算多个垂直图层中的水平圆创建了一个顶点球体,即 UV 球体。好

您只是为每个顶点添加一次索引,每个顶点总共有一个索引,这不符合概念。
你需要重复做的是在你的顶点数组中找到三个索引,它们构成一个可用的三角形。
除其他外,这意味着您将多次命名相同的顶点索引。主要是六次,因为你的大部分顶点将是六个三角形的一部分。至少一个朝向“左上”,一个朝向“右上”、“左下”、“右下”;而通常有两个双向;例如右上角的两个三角形。
“主要是六个”,因为像“北极”和“南极”这样的边缘情况;它参与了许多三角形和四边形。

让我们看看您的 UV 球的一部分:

      V03----------V02----------V01---------V00 
       |            |        __/ |        __/|
       |            |     __/    |  c  __/   |
       |            |  __/       |  __/      |
       |            | /        f | /     d   |
      V13----------V12----------V11----------V10 
       |            |        __/ | e      __/|
       |            |  a  __/    |     __/   |
       |            |  __/       |  __/      |
       |            | /      b   | /         |
      V23----------V22----------V21----------V20 
       |            |            |           |
       |            |            |           |
       |            |            |           |
       |            |            |           |
      V33----------V32----------V31---------V30 

你可以看到对于中间的四边形(由两个三角形“a”和“b”表示),
你需要六个索引条目,虽然它只有 4 个顶点,并且每个顶点将被更频繁地使用,来自其他接触四边形。

对于三角形“a”,你得到顶点 V11、V12、V22 的索引(注意方向,取决于你想要表面的位置,总是“逆时针”或总是“顺时针”都会让你您只需要尝试几次即可获得所需的结果)。
对于三角形“b”,您将获得顶点 V11、V22、V21 的索引。

此外,对于三角形“c”、“d”、“e”和“f”,顶点 V11 必须再次成为索引;参加六个三角形或四个四边形。

你成功地完成了你的 UV 球体,所以我认为我不需要提供循环和选择代码来完成它。您设法可视化了 UV 球体的结果,请在检查结果后尝试并重试。