如何通过For循环生成三角形条带的顶点与索引以绘制平面?
嗨,能手动写出三角条带的索引说明你已经搞懂核心逻辑了!要扩展到-π到π(x轴)、-π/2到π/2(y轴)的大平面,用循环批量生成顶点和索引确实是最高效的方式,我来给你拆解具体步骤:
1. 先批量生成顶点网格
首先把平面拆成规则的网格,先定义x、y方向的分段数(数值越大,网格越密,精度越高),然后计算每个网格单元的步长,最后用双层循环遍历所有网格点生成顶点:
#include <vector> #include <cmath> // 用来使用M_PI // 假设你的Point3类定义(如果不是,替换成你自己的实现) struct Point3 { float x, y, z; Point3(float x_, float y_, float z_) : x(x_), y(y_), z(z_) {} }; int main() { // 定义网格分段数,可根据需求调整 const int numXSegments = 100; // x从-π到π分成100段,对应101个顶点 const int numYSegments = 50; // y从-π/2到π/2分成50段,对应51个顶点 // 计算每个方向的步长 const float xStep = (2 * M_PI) / numXSegments; const float yStep = M_PI / numYSegments; std::vector<Point3> vertices; vertices.reserve((numXSegments + 1) * (numYSegments + 1)); // 预分配内存提升效率 // 双层循环生成所有顶点:先遍历y轴的每一行,再遍历x轴的每一列 for (int y = 0; y <= numYSegments; ++y) { const float currentY = -M_PI/2 + y * yStep; for (int x = 0; x <= numXSegments; ++x) { const float currentX = -M_PI + x * xStep; vertices.emplace_back(currentX, currentY, 0.0f); // z轴固定为0,符合平面需求 } }
这段代码会生成一个从左下角(-π, -π/2, 0)到右上角(π, π/2, 0)的规则顶点网格,顺序是逐行从左到右排列的。
2. 生成三角条带的索引序列
三角条带的核心优势是用极少的索引生成大量三角形:前3个顶点生成第一个三角形,之后每新增1个顶点就和前两个顶点生成一个新三角形(顺序会自动交替保证朝向正确)。对于网格来说,我们可以按行生成条带,每一行的顶点和下一行的顶点组成一条连续的条带:
std::vector<int> indices; // 预估算索引数量:每一行需要2*(numXSegments+1)个索引,加上衔接用的重复顶点 indices.reserve(2 * (numXSegments + 1) * numYSegments + (numYSegments - 1)); for (int y = 0; y < numYSegments; ++y) { // 遍历当前行的所有x顶点,依次添加当前行和下一行的对应顶点 for (int x = 0; x <= numXSegments; ++x) { const int currentRowVertex = y * (numXSegments + 1) + x; const int nextRowVertex = (y + 1) * (numXSegments + 1) + x; indices.push_back(currentRowVertex); indices.push_back(nextRowVertex); } // 每一行条带结束后,添加一个重复顶点(下一行的最后一个顶点),避免和下一行条带衔接时生成错误三角形 if (y != numYSegments - 1) { indices.push_back((y + 1) * (numXSegments + 1) + numXSegments); } } // 之后就可以把vertices和indices传给你的渲染API了(比如OpenGL的glDrawElements) return 0; }
3. 小细节调整
- 三角形朝向问题:如果渲染时发现平面看不到(被背面剔除了),可以调换
currentRowVertex和nextRowVertex的添加顺序,或者在循环里加入一个flip变量,每隔一行反转顶点顺序。 - 分段数调整:
numXSegments和numYSegments可以根据你的精度需求修改,比如要更平滑的平面就调大数值,要性能优先就调小。 - 对比手动方式:你之前的代码用的是三角列表(Triangle List),每个三角形需要3个索引;而三角条带的索引数量只有大概2倍的顶点行数,内存占用和渲染效率都会更高。
内容的提问来源于stack exchange,提问作者V P
相关产品推荐
相关产品推荐

