作为程序网格生成器的一部分,处理双轮廓以将有符号距离函数转换为网格。
希望一些有关算法经验的人可以在接近结束时帮助解决这个问题。
我们有
体素网格边缘切割点和函数表面与边缘交叉的法线
一个。我们访问网格的每个角落,并沿x,y和z轴投影边缘
湾在功能中表现出符号变化的每个边缘都被认为是活跃的
每个体素内的顶点,计算为由体素边缘上的切点和法线定义的平面的最近交点
一个。我们发现每个体素通过访问每个活动边缘来生成顶点
湾相对于边缘打开的轴逆时针方向绕边缘缠绕。
通过缠绕每个活动边缘来生成网格,以将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();
}
这几乎可行。拍摄物体的光线场景:
现在这里是导入网格实验室的网格。注意黑色三角形 - 它朝向错误的方向。锋利的边缘有时似乎是一个问题。我尝试了其他各种方法: 1.平均边缘切点法线,和 2.找到最接近三角形质心的切点并使用它的正常值,
没有什么比下图更好。
了解如何完善算法的这一部分的任何建议或想法。