向网格添加索引

时间:2016-04-25 14:11:19

标签: c++ openframeworks

我试图找出如何将索引添加到已包含其所有顶点的形状。我可以通过顶点看到我将它们全部放在我需要它们的地方但是我有一个奇怪的神器,因为没有正确添加索引。但是,我不确定如何正确添加它们。

Surface::Surface()
{
    int size = 200;
    ofPoint p1(0, 0, 0), p2(0, 0, size), p3(size, 0, size), p4(200, 0, 0);

    s1 = new Curve(p1, p2);
    s2 = new Curve(p2, p3);
    s3 = new Curve(p4, p3);
    s4 = new Curve(p1, p4);

    for(double i = 0; i <= size; i++){
        for(double j = 0; j <= size; j++){
            mesh.addVertex(getPoint(i, j));
        }
    }

    int width = size, height = size;
    for (int y = 0; y<=height; y++){
        for (int x=0; x<=width; x++){
            mesh.addIndex(x+y*width);
            mesh.addIndex((x+1)+y*width);
            mesh.addIndex(x+(y+1)*width);

            mesh.addIndex((x+1)+y*width);
            mesh.addIndex((x+1)+(y+1)*width);
            mesh.addIndex(x+(y+1)*width);
        }
    }
}

绘制顶点给出了什么:

enter image description here

但索引连接太多点,我不确定索引应该连接哪些。绘制线框:

enter image description here

也许这个问题适合凹形?当他们想要为网格添加索引时,每个人似乎或多或少都做同样的事情

1 个答案:

答案 0 :(得分:1)

在每个维度中添加大小+ 1个顶点:

for(double i = 0; i <= size; i++){
    for(double j = 0; j <= size; j++){
        mesh.addVertex(getPoint(i, j));
    }
}

但是每个维度中的索引大小+ 2个顶点为x和y可以等于大小,并且在循环内添加1:

int width = size, height = size;
for (int y = 0; y<=height; y++){
    for (int x=0; x<=width; x++){
        mesh.addIndex(x+y*width);
        mesh.addIndex((x+1)+y*width);
        mesh.addIndex(x+(y+1)*width);

        mesh.addIndex((x+1)+y*width);
        mesh.addIndex((x+1)+(y+1)*width);
        mesh.addIndex(x+(y+1)*width);
    }
}

这将导致垃圾顶点被索引。要修复,只需将循环条件更改为&lt;宽度和&lt;高度。

int width = size, height = size;
for (int y = 0; y<height; y++){
    for (int x=0; x<width; x++){
        mesh.addIndex(x+y*width);
        mesh.addIndex((x+1)+y*width);
        mesh.addIndex(x+(y+1)*width);

        mesh.addIndex((x+1)+y*width);
        mesh.addIndex((x+1)+(y+1)*width);
        mesh.addIndex(x+(y+1)*width);
    }
}

从概念上讲,您需要创建一个比顶点更原始的基元。最简单的形式是if size == 1.你需要创建2个顶点但只需要1个quad。