【问题标题】:Marching Cubes Implementation - Missing Triangles in MeshMarching Cubes 实现 - 网格中缺少三角形
【发布时间】:2014-02-12 00:19:10
【问题描述】:

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

我遇到了我渲染的网格缺少三角形的问题。我看到几乎一半的三角形缺失,如下所示。

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

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

我有 12 个 if 语句(其中显示了 2 个),而不是使用 12 位条目的边缘标志数组。我使用 3D 数组的索引来根据边缘值 (0-11) 确定 x、y、z 的值

    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 值?

【问题讨论】:

  • 它们是丢失了,还是倒退了?您是否尝试过禁用剔除?或者,您的 Element/ElementArray 缓冲区的数据类型是什么?如果您使用 GLushort 并输入超过 64k 的索引,就会开始发生奇怪的事情。
  • 不看代码就很难提出任何建议。我想代码很长,所以也许将您的问题发布在 Code Review 上会更好?
  • 大卫,谢谢您的回复。我会看看它是否可能是剔除或计算错误。我使用的数据类型是 unsigned char (0-255) - 1 Byte。 3D 阵列的每个单元格最多为 255,数据为 255 宽 x 255 高 x 240 深。而且,彼得,我以前没有尝试过代码审查,但会试一试。感谢您的帮助。
  • @PeterR.Bloomfield:这个问题与代码审查无关。如果问题是关于解决问题,最好在这里。 CR 仅适用于工作代码。

标签: c++ opengl 3d marching-cubes


【解决方案1】:

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

  • 您的单元配置计算是否正确?
  • 您是否在单元格配置和输出三角形之间执行了正确的一对一映射?
  • 所有三角形都是顺时针/逆时针排列的吗?

【讨论】:

  • 我进一步调查了丢失三角形的原因,并了解到有歧义的情况会导致丢失三角形。我偶然发现了一种称为渐近决策解析的技术,但所有示例均以 2D 形式提供。我将如何为有歧义的立方体实现 3D 解析器?谢谢。
  • 对于有歧义的立方体,您从中心抽取另一个样本。在这里查看我的出版物:webhome.cs.uvic.ca/~blob/publications/egpgv12.pdf
  • 感谢您的帮助和论文。我想提另一个观察。我尝试在没有任何歧义的情况下运行我的代码(来自标准查找表)并观察到丢失的三角形。我还使用带有子案例的 LookupTable.h 和 MarchingCubes.c 将 afni.nimh.nih.gov/pub/dist/src/SUMA/MarchingCubes 的代码集成到我的代码中,但仍然观察到丢失的三角形。我不知道是否可以查看我更新的代码。如果是这样,我将不胜感激。我已经把代码上传到gist.github.com/anonymous/9056336
  • 我尝试的另一个修改是通过从直角三角形创建四边形来“填充”缺失的三角形。当然,我假设三角形是直角三角形。这种方法我也没有成功。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-02
  • 2022-10-12
  • 2012-02-02
  • 1970-01-01
相关资源
最近更新 更多