网格中缺少三角形

我目前正在通过在OpenGL中渲染示例数据集来理解和实现使用C ++的Marching Cubes算法。

我遇到了一个问题,我渲染的网格缺少三角形。 我看到几乎一半的三角形缺失,可以在下面看到。

填充三角形和创建四边形是解决问题的正确方法,还是我错过了明显的东西?

我使用的边界交点表来自以下链接:http://paulbourke.net/geometry/polygonise/

我没有使用12位条目的边缘标志阵列,而是使用了12条if语句(其中显示了2条语句)。 我使用三维数组中的索引来确定x,y,z基于边值(0-11)的值,

    if ((edge.point1 == 0 && edge.point2 == 1) ||
        (edge.point1 == 1 && edge.point2 == 0))
    {
        p1.x = x;   p1.y = y; p1.z = z;
        p2.x = x+1; p2.y = y; p2.z = z;
    }
    else if ((edge.point1 == 1 && edge.point2 == 2) ||
             (edge.point1 == 2 && edge.point2 == 1))
    {
        p1.x = x+1; p1.y = y;   p1.z = z;
        p2.x = x+1; p2.y = y+1; p2.z = z;
    }

此外,插值功能如下。

point interpolate(point p1, point p2, unsigned char isovalue)
{
    point p;

    unsigned char d1 = getDataValue(p1.x, p1.y, p1.z);
    unsigned char d2 = getDataValue(p2.x, p2.y, p2.z);

    if (abs(double(isovalue)-double(d1)) == 0)
        return(p1);
    if (abs(double(isovalue)-double(d2))  == 0)
        return(p2);
    if (abs(double(d1)-double(d2))  == 0)
        return(p1);

    double val = double(isovalue - d1) / double(d2 - d1);

    p.x = p1.x + val * (p2.x - p1.x);
    p.y = p1.y + val * (p2.y - p1.y);
    p.z = p1.z + val * (p2.z - p1.z);

    return p;
}

显示缺少三角形的三角形网格

整个渲染数据集与缺少三角形问题

更新:

找到一个例子后,我修改了我的代码,并能够渲染所有三角形。 现在,我看到了一个问题,当我旋转我的对象时,对象开始反转z轴并将对象显示出来。

为什么物体在旋转过程中开始反转z值?

缺少三角形问题已解决,但z轴上存在反转问题


对于这种类型的空间分区算法,您可能希望使用一个非常简单的模型(球体或立方体),然后逐步调试您的实现并检查每个阶段的输入/输出。 有时忽略一个小细节可能会弄乱结果。 作为一个想法找到以下答案:

  • 你的单元配置是否正确计算?
  • 您是否在单元格配置和输出三角形之间的映射上执行了正确的操作?
  • 你所有的三角形都是按照时钟方式/计数器时钟顺序吗?
  • 链接地址: http://www.djcxy.com/p/37175.html

    上一篇: Missing Triangles in Mesh

    下一篇: Obtaining a unique buffer index for multiple threads accessing a voxel