Marching Cubes Terrassing/Ridge Effect

I am implementing a marching cubes algorithm generally based on the implementation of Paul Bourke with some major adjustments:

  • precalculation of the scalarfield (floating point values)
  • avoiding duplicated vertices in the final list using a std::map
  • vertex storing to visualize the final mesh in Ogre3D
  • Basically I changed nearly 80% of his code. My resulting mesh has some ugly terrasses and I am not sure how to avoid them. I assumed that using floating points for the scalar field would do the job. Is this a common effect? How can you avoid it?

    抽象行军立方体

    calculating the vertex positions on the edges. (cell.val[p1] contains the scalar value for the given vertex):

    //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]);
            }
    

    You can find the complete sourcecode here: https://github.com/DieOptimistin/MarchingCubes I use Ogre3D as library for this example.


    As Andy Newmann said, the devil was in the linear interpolation. Correct is:

    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/37256.html

    上一篇: Scikit Image Marching Cubes输出

    下一篇: 行进立方体Terrassing / Ridge效应