行进立方体Terrassing / Ridge效应

我正在实施一种基于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作为库。


    正如Andy Newmann所说,魔鬼在线性插值。 正确的是:

    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]);
    
    链接地址: http://www.djcxy.com/p/37255.html

    上一篇: Marching Cubes Terrassing/Ridge Effect

    下一篇: help: how to smooth a mesh generated by Marching Cubes in real