基于VTK沿重叠接缝缝合两网格且不改动非接缝区域的方法
VTK实现异节点间距网格接缝缝合方案
核心原则是仅操作接缝邻接的局部区域,完全保留非接缝区域的原有网格结构,全程不做全局重剖分,具体实现步骤如下:
步骤1:精准定位接缝邻接的待修改区域
- 先用
vtkAppendPolyData将粗、密两个网格拼接为单个vtkPolyData对象,初始阶段不执行任何点合并操作,保留两个网格的原始拓扑。 - 调用拼接后网格的
BuildLinks()方法构建单元-点、单元-单元的邻接索引,遍历所有三角面的边,统计每条边所属的三角面数量:仅被1个三角面引用的边即为网格边界边,按来源分别标记为粗网格边界、密网格边界。 - 给两类边界边构建空间单元格定位器(用
vtkStaticCellLocator即可),遍历两类边界边,将空间距离小于容差(取模型包围盒对角线长度的1e-6,不要用固定值)的边对标记为接缝边。所有和接缝边直接相连的三角面,统一标记为待删除面。 - 收集所有待删除面包含的顶点、所有接缝边上的顶点,组成局部重剖分的专用点集,不要纳入任何非接缝区域的点,从根源上避免后续操作影响原有网格结构。
步骤2:局部约束三角剖分闭合间隙
- 从拼接网格中移除所有标记为待删除的三角面,剩余的面全部保留,不做任何修改,这部分就是最终网格里不需要变动的主体结构。
- 整理剖分需要的约束边集合:一是两侧网格上标记为接缝的所有边,二是待删除面移除后,剩余保留网格上和剖分区域接壤的所有边界边。约束边的作用是保证剖分结果和原有保留网格完全拓扑连通,不会出现新的缝隙,同时约束剖分范围不会越界。
- 不要使用全局模式的
vtkDelaunay2D做剖分:针对收集到的局部点集,单独传入vtkDelaunay2D,关闭BoundingTriangulation选项,不要使用默认的全局XY平面做投影。先对局部点集做协方差分析,拟合点集对应的局部切平面,将所有局部点投影到该切平面上完成二维Delaunay剖分,再将生成的三角面顶点映射回原始三维坐标——这个处理可以适配z≠F(x,y)的非平面区域,不会出现面翻转、原有结构破坏的问题。 - 将剖分生成的新三角面,和之前保留的未修改网格面合并,调用
vtkCleanPolyData,设置和之前一致的点合并容差,仅合并接缝处空间位置完全重合的重复点即可,注意不要把容差设置过大,避免误合并非接缝区域的独立点。
之前尝试方案失效的原因
- 直接调用
vtkDelaunay2D做全局重剖分:默认没有添加约束边,且使用全局XY平面做投影,不仅会破坏原有网格的拓扑结构,遇到非平面区域时必然出现面错乱的问题。 - 基于
vtkFeatureEdges的边界分段匹配方案:vtkFeatureEdges默认会提取所有满足特征角阈值的边,不止是接缝边界,且分段后默认按点序匹配,由于两侧网格节点间距不一致,点序列长度、顺序都无法对齐,自然找不到正确的重叠分段。 vtkDecimatePro方案:该类的设计目标是全局网格简化,会无差别修改全网格的面结构,完全不符合仅修改接缝区域的需求。
关键调优提示
- 所有涉及空间判断的容差都要基于模型包围盒的相对比例设置,不要使用固定绝对值,才能适配任意形态的随机接缝。
- 邻接关系判断必须依赖
BuildLinks()生成的拓扑索引,不要单纯靠点坐标距离判断邻接,避免浮点误差导致误标记待删除面。 - 每次局部剖分都要单独计算对应区域的局部投影切平面,不要复用全局投影平面,保证非平面区域的剖分结果正确。
内容的提问来源于stack exchange,提问作者Derek Eden
相关产品推荐
相关产品推荐

