生成带有顶点和索引的球体?
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 球体的结果,请在检查结果后尝试并重试。
我目前正在开发一个 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 球体的结果,请在检查结果后尝试并重试。