gpt4 book ai didi

c++ - 绘制圆柱体的顶部和底部

转载 作者:行者123 更新时间:2023-12-02 10:19:16 27 4
gpt4 key购买 nike

我正在尝试创建一个类,该类可以以过程方式创建棱镜(如果精度足够高,则可以创建圆柱体),但是仅显示3d模型的侧面(而不显示顶部和底部)。这是使用openGL和c++。并不是为了提高效率,只是修改以前的一个 Realm 。

#define numSlices 2
Prism::Prism() {
init(3);
}

Prism::Prism(int prec) {
init(prec);
}

float Prism::toRadians(float degrees) { return (degrees * 2.0f * 3.14159f) / 360.0f; }

void Prism::init(int prec) {
prec = (prec < 3) ? 3 : prec;

numVertices = (prec + 1) * (numSlices+1);
numIndices = prec * numSlices * 6;
for (int i = 0; i < numVertices; i++) { vertices.push_back(glm::vec3()); }
for (int i = 0; i < numVertices; i++) { texCoords.push_back(glm::vec2()); }
for (int i = 0; i < numVertices; i++) { normals.push_back(glm::vec3()); }
for (int i = 0; i < numVertices; i++) { tangents.push_back(glm::vec3()); }
for (int i = 0; i < numIndices; i++) { indices.push_back(0); }

// calculate triangle vertices
for (int i = 0; i <= numSlices; i++) {
for (int j = 0; j <= prec; j++) {
float y = i;
float x = -(float)cos(toRadians(j * 360.0f / (float)prec));
float z = (float)sin(toRadians(j * 360.0f / (float)prec));
vertices[i * (prec + 1) + j] = glm::vec3(x, y, z);
texCoords[i * (prec + 1) + j] = glm::vec2(((float)j / prec), ((float)i / numSlices));

}
}

// calculate triangle indices
for (int i = 0; i < numSlices; i++) {
for (int j = 0; j < prec; j++) {
indices[6 * (i * prec + j) + 0] = i * (prec + 1) + j;
indices[6 * (i * prec + j) + 1] = i * (prec + 1) + j + 1;
indices[6 * (i * prec + j) + 2] = (i + 1) * (prec + 1) + j;
indices[6 * (i * prec + j) + 3] = i * (prec + 1) + j + 1;
indices[6 * (i * prec + j) + 4] = (i + 1) * (prec + 1) + j + 1;
indices[6 * (i * prec + j) + 5] = (i + 1) * (prec + 1) + j;
}
}

}

任何与已经编写的代码紧密相关的技巧或解决方案将不胜感激。

最佳答案

要渲染圆柱体的顶部和底部,您可以创建一个“三角形风扇”,该三角形风扇从圆柱体顶部/底部中心的顶点开始,并为每个侧面创建一个三角形。

修改您的代码:(未经测试,我可能在整理订单时犯了错误)

int bottom_center = vertices.length(); vertices.push_back(glm::vec3(0,0,0));
int top_center = vertices.length(); vertices.push_back(glm::vec3(0,numSlices,0));

// Bottom
for (int j = 0; j < prec; j++) {
int base = 0;
indices.push_back(bottom_center);
indices.push_back(base+j);
indices.push_back(base+j+1);
}

// Top
for (int j = 0; j < prec; j++) {
int base = numSlices * (prec+1);
indices.push_back(top_center);
indices.push_back(base+j);
indices.push_back(base+j+1);
}

有关更多解决的示例,请参见 http://www.songho.ca/opengl/gl_cylinder.html

关于c++ - 绘制圆柱体的顶部和底部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60923724/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com