【问题标题】:Marching Cubes Terrassing/Ridge Effect行进立方体梯形/山脊效应
【发布时间】:2015-06-16 09:55:40
【问题描述】:

我正在实现一个行进立方体算法,通常基于Paul Bourke 的实现,并进行了一些重大调整:

  • 标量场的预计算(浮点值)
  • 使用 std::map 避免最终列表中的重复顶点
  • 顶点存储以在 Ogre3D 中可视化最终网格

基本上我更改了他近 80% 的代码。我生成的网格有一些难看的 terrasses,我不知道如何避免它们。我认为对标量字段使用浮点可以完成这项工作。这是常见的效果吗?如何避免?

计算边上的顶点位置。 (cell.val[p1] 包含给定顶点的标量值):

//if there is an intersection on this edge
        if (cell.iEdgeFlags & (1 << iEdge))
        {
            const int* edge = a2iEdgeConnection[iEdge];

            int p1 = edge[0];
            int p2 = edge[1];

            //find the approx intersection point by linear interpolation between the two edges and the density value
            float length = cell.val[p1] / (cell.val[p2] + cell.val[p1]);
            asEdgeVertex[iEdge] = cell.p[p1] + length  * (cell.p[p2] - cell.p[p1]);
        }

你可以在这里找到完整的源代码:https://github.com/DieOptimistin/MarchingCubes 我在这个例子中使用 Ogre3D 作为库。

【问题讨论】:

  • 它当然可以变得平滑,但你能把它缩小到几行代码,这些代码给你一个你不同意的像素位置,而不是屏幕截图吗?帮你调试截图真的好难……
  • 我编辑了这个问题。由于无需任何额外的平滑算法就可以使其平滑,我假设我在计算顶点位置时存在错误。
  • 你有上下文中的原始比较来渲染相同的场景进行比较吗?如果是这样,请发布屏幕截图。我猜想以某种方式缓存的顶点位置被错误地选择了,或者沿着立方体边缘的插值是基于错误的值。
  • 你的方法看起来很理智。检查您的线性插值实际上是否正常工作,并检查它在其间插值的值是否符合您的预期。那真的是什么?我假设它是场强的等值面,但场方程是什么?
  • 应该长度 = v[p1] / (v[p2] - v[p1]) ?不是+?

标签: c++ ogre3d marching-cubes


【解决方案1】:

正如安迪纽曼所说,魔鬼在线性插值中。正确的是:

float offset;
float delta = cell.val[p2] - cell.val[p1];

if (delta == 0) offset = 0.5;
else offset = (mTargetValue - cell.val[p1]) / delta;

asEdgeVertex[iEdge] = cell.p[p1] + offset* (cell.p[p2] - cell.p[p1]);

【讨论】:

    猜你喜欢
    • 2014-08-01
    • 2016-08-03
    • 1970-01-01
    • 1970-01-01
    • 2020-10-08
    • 2016-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多