You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:22:33