如何在双重轮廓中获得正确的三角形

时间:2016-12-30 00:40:56

标签: algorithm graphics 3d mesh

作为程序网格生成器的一部分,处理双轮廓以将有符号距离函数转换为网格。

希望一些有关算法经验的人可以在接近结束时帮助解决这个问题。

我们有

  1. 体素网格边缘切割点和函数表面与边缘交叉的法线

    一个。我们访问网格的每个角落,并沿x,y和z轴投影边缘

    湾在功能中表现出符号变化的每个边缘都被认为是活跃的

  2. 每个体素内的顶点,计算为由体素边缘上的切点和法线定义的平面的最近交点

    一个。我们发现每个体素通过访问每个活动边缘来生成顶点

    湾相对于边缘打开的轴逆时针方向绕边缘缠绕。

  3. 通过缠绕每个活动边缘来生成网格,以将4个相邻体素内的顶点连接成四边形。

  4. 当生成每个面时,我必须确定面朝哪个方向,以便构成四边形的三角形的缠绕顺序正确。

    首先我们得到每个体素顶点的平均法线:

                float3 faceNormal = new float3(0f,0f,0f);
                float nCount = 0f;
                for (int eachVoxel = 0; eachVoxel < 4; eachVoxel++)
                {
                    vid = edgeVoxels[eachVoxel];
                    var theVoxel = _voxelsById[vid];
    
                    faceNormal += theVoxel.VertexNormal.xyz;
                    nCount += 1f;
    
    
                }
    
                faceNormal /= nCount;
                faceNormal /= faceNormal.Length();
    

    然后我们确定是否需要颠倒顺序:

                float faceAngle = float3.Dot(_axis[edge.EdgeDir], faceNormal);
                if (faceAngle > 0.0f)
                {
                    distinctMeshVoxels = distinctMeshVoxels.Reverse();
                }
    

    这几乎可行。拍摄物体的光线场景:

    raymarched image

    现在这里是导入网格实验室的网格。注意黑色三角形 - 它朝向错误的方向。锋利的边缘有时似乎是一个问题。我尝试了其他各种方法: 1.平均边缘切点法线,和 2.找到最接近三角形质心的切点并使用它的正常值,

    没有什么比下图更好。

    mesh with bad triangles

    了解如何完善算法的这一部分的任何建议或想法。

0 个答案:

没有答案
相关问题