PyVista合并拉伸多边形时侧壁消失问题求助
问题原因
PyVista中+=运算符执行的是带自动清理的合并操作,等价于调用merge(merge_points=True)。当多个拉伸后的几何体存在位置重叠且法向相反的面(比如两个拉伸体的侧壁刚好贴合),或者重复添加了同一个几何体(你的代码中第一个拉伸体被手动赋值后,循环又从x=0开始再次添加,导致完全重叠的面),合并过程会将这些面判定为冗余面并删除,最终表现为侧壁消失。
解决建议
1. 修复重复添加的问题
你的代码先将第一个拉伸体赋值给merged,随后循环又从x=0开始再次添加该几何体,导致完全重叠的面被清理。修改循环起始索引,跳过已添加的第一个几何体:
# 原循环: # for x in range(len(data_x)): # 修改为: for x in range(1, len(data_x)):
2. 禁用自动顶点合并(或调整合并公差)
如果需要保留重叠面,改用merge方法并关闭merge_points参数,避免自动删除冗余面:
# 替换 merged += extrusion 为: merged = merged.merge(extrusion, merge_points=False)
如果希望合并顶点但保留必要的面,可以调整merge_tol参数(控制顶点合并的距离公差),比如设置merge_tol=1e-6,避免误合并非重叠顶点:
merged = merged.merge(extrusion, merge_points=True, merge_tol=1e-6)
3. 使用MultiBlock容器先收集再合并
先将所有拉伸体存入pv.MultiBlock,再统一合并,这种方式更可控:
# 替换原有合并逻辑 block = pv.MultiBlock() for x in range(len(data_x)): z = np.zeros_like(data_x[x]) points_3d = np.column_stack((data_x[x], data_y[x], z)) face = [len(data_x[x])] + list(range(len(data_x[x]))) polygon = pv.PolyData(points_3d, faces=[face]) extrusion = polygon.extrude((0, 0, 1), capping=True) block.append(extrusion) merged = block.merge(merge_points=False) # 按需设置merge_points
验证方法
修改后可在Colab中添加可视化代码,确认侧壁是否保留:
plotter = pv.Plotter() plotter.add_mesh(merged, color='lightblue', show_edges=True) plotter.show()
内容的提问来源于stack exchange,提问作者Manel Vilella
相关产品推荐
相关产品推荐

