如何正确绘制3D空间中相交的填充多边形?
3D相交多边形正确渲染方案
你遇到的是matplotlib 3D模块的固有架构局限:它采用画家算法做渲染,仅会对每个完整多边形的平均深度值做整体排序,不会计算多边形之间的空间相交关系,因此相交区域的遮挡关系一定会出错,Poly3DCollection本身没有任何参数可以修复这个问题。
你当前运行代码得到的错误效果如下:
以下是两种可行的解决方法:
方法1:使用支持原生3D深度计算的库(推荐)
直接换用PyVista、Mayavi这类原生支持3D空间相交计算的可视化库,无需手动处理三角剖分,自动完成相交区域的遮挡判断,完全适配动态生成多边形的场景。
对应示例代码如下:
import numpy as np import pyvista as pv # 定义两个相交的正方形顶点,和你的测试数据完全一致 verts1 = np.array([ [0, 0, 0.5], [1, 0, 0.5], [1, 1, 0.5], [0, 1, 0.5] ]) verts2 = verts1[:, [1, 2, 0]] # 自动生成平面多边形网格,无需手动剖分 poly1 = pv.PolyData(verts1).delaunay_2d() poly2 = pv.PolyData(verts2).delaunay_2d() # 渲染 plotter = pv.Plotter() plotter.add_mesh(poly1, color="red") plotter.add_mesh(poly2, color="green") plotter.show()
方法2:必须使用matplotlib的折中方案
如果只能依赖matplotlib做渲染,需要先对所有多边形做自动布尔切割,拆分出互不相交的子面片后再渲染:
- 用
trimesh库将多边形转换为网格对象,调用对应的布尔运算接口自动切割相交区域 - 将切割后的所有子面片按实际深度排序后,再传入
Poly3DCollection渲染
这种方案性能开销更高,仅适合多边形数量少的场景。
内容的提问来源于stack exchange,提问作者flawr
相关产品推荐
相关产品推荐

