网格简化:边缘折叠条件

jay*_*ark 3 c++ algorithm mesh computational-geometry

我试图通过进行一系列边缘折叠来实现网格简化算法.目前,我正在浏览每个三角形,然后折叠最短的边缘,算法是稳定的(不会超出界限).但超越一点,它开始创造破碎(洞)的文物.确定边缘是否可折叠的正确方法是什么,这样才不会导致非流形伪影(或网格)?

注意:我使用半边数据结构.另外,我不想使用任何外部库,如OpenMeshCGAL.我有理由不使用它们.

Nic*_*ler 26

边缘崩溃有两个主要条件:

连接

在折叠边的每一侧,只能合并一对边.这可以通过计算两个合并顶点的联合邻居顶点来检查(必须恰好有两个).请考虑下面的示例,其中红色边缘正在折叠:

边缘折叠无效

橙色和青色边缘之间的三角形不再是多面体.

几何

在边缘坍塌期间,三角形不得翻转.这可以通过计算翻转之前的三角形法线与保持三角形的翻转之间的角度来检查.

这是一个在崩溃期间翻转绿色三角形法线的示例:

正常翻转

  • 折叠边缘有两个入射顶点.对于两个顶点,收集相邻顶点并计算两个顶点的交集.此交叉点应恰好包含两个顶点. (5认同)