You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确绘制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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 04:09:04