三角带三角剖分

sjk*_*jkm 0 java android 2d opengl-es triangulation

我想将三角形​​条带的顶点转换为独立三角形,以便我可以使用 OpenGL 的GL_TRIANGLES原始类型绘制它们。

但是,以下两个代码都不起作用,我不明白为什么:

for(int i = 0; i < triangleStripVertices.size() - 2; i++) {
    triangleVertices.add(triangleStripVertices.get(i));
    triangleVertices.add(triangleStripVertices.get(i + 1));
    triangleVertices.add(triangleStripVertices.get(i + 2));
}
Run Code Online (Sandbox Code Playgroud)

而这个也不起作用:

for(int i = 0; i < triangleStripVertices.size() - 2; i++) {
    if(i % 2 == 1) {
        triangleVertices.add(triangleStripVertices.get(i));
        triangleVertices.add(triangleStripVertices.get(i + 2));
        triangleVertices.add(triangleStripVertices.get(i + 1));         
    } else {
        triangleVertices.add(triangleStripVertices.get(i));
        triangleVertices.add(triangleStripVertices.get(i + 1));
        triangleVertices.add(triangleStripVertices.get(i + 2));
    }
}
Run Code Online (Sandbox Code Playgroud)

我在这里做错了什么?

损坏的输出如下所示:

损坏的输出

rad*_*al7 5

您的尝试已经很接近了,但是您还缺少一点。三角形条带有一个“最旧顶点”的概念,即一个三角形处理完就去掉的那个。由于需要保持条带中三角形的面度(有时称为顶点缠绕)相同,因此最旧的顶点不是列表中的下一个;它在列表中最老的和第二老的之间翻转。

例如,假设您有一个顶点索引列表

GLuint indices = { 0, 1, 2, 3, 4, 5 };
Run Code Online (Sandbox Code Playgroud)

然后你glDrawElements()用那个清单打电话。将使用上述列表中的顶点索引渲染以下三角形:(0, 1, 2), (2, 1, 3), (2, 3, 4), (4, 3, 5)。

因此,要将三角形条带展开为一组三角形,您需要考虑到这一点。这是一个可以执行您想要的操作的代码段:

for (int i = 0; i < triangleStripVertices.size() - 2; i++) {
    if (i % 2) {
        triangleVertices.add(triangleStripVertices.get(i + 1));
        triangleVertices.add(triangleStripVertices.get(i));
        triangleVertices.add(triangleStripVertices.get(i + 2));         
    } 
    else {
        triangleVertices.add(triangleStripVertices.get(i));
        triangleVertices.add(triangleStripVertices.get(i + 1));
        triangleVertices.add(triangleStripVertices.get(i + 2));
    }
}
Run Code Online (Sandbox Code Playgroud)