作为程序网格生成器的一部分,工作在双重轮廓上,将有符号距离函数转换为网格。
希望一些对算法有经验的人能帮到这一点,接近尾声。
我们有
当每一张脸产生时,我必须确定该面朝哪个方向,以便使组成该四面的三角形的卷绕顺序是正确的。
首先,我们得到了每个体素顶点的平均正态:
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.找到离三角形质心最近的切点,然后使用它是正常的,
没有什么比下面的图片更好了。

感谢关于如何完善这部分算法的任何建议或想法。
发布于 2022-10-11 15:57:12
在双轮廓法中,首先检测边缘的符号变化,这些边被重建的三维曲面交叉。每条这样的边缘在表面上产生一个四角体。构成该四角体的三角形是定向的,使得边的顶点与正定值位于相对于三角形的正半空间中。
下面是双轮廓的一个简单教程,以了解更多细节。
https://stackoverflow.com/questions/41389138
复制相似问题