PyVista多子图场景下add_background_image无法正确显示背景图问题
问题原因
pyvista.Plotter.add_background_image() 默认作用于整个Plotter的全局渲染画布,而非单个子图,每次调用都会覆盖上一次设置的背景图,因此仅最后一次传入的图片会全局生效,最终错误显示在首个子图区域。
解决方案
通用兼容方案(适配所有pyvista版本)
最稳妥的实现方式是在图片子图中添加一个覆盖整个视口的平面,将目标图片作为纹理贴到平面上,不同子图的平面相互独立,不会互相干扰,显示效果和背景图完全一致。
修正后代码如下:
import pyvista as pv filenames = ['filename1.jpg','filename2.jpg','filename3.jpg'] mesh = pv.PolyData('meshfile.ply') p = pv.Plotter(shape='1|3') # 渲染网格子图 p.subplot(0) p.add_mesh(mesh) # 批量添加图片子图 for idx, img_path in enumerate(filenames): p.subplot(idx + 1) # 读取图片为纹理 img_texture = pv.read_texture(img_path) # 创建覆盖整个子图视口的平面 view_plane = pv.Plane(direction=(0, 0, 1), i_size=2, j_size=2) # 绑定纹理,关闭光照模拟背景效果 p.add_mesh(view_plane, texture=img_texture, lighting=False) # 隐藏坐标轴、锁定视角,和背景图表现一致 p.hide_axes() p.view_xy() p.enable_parallel_projection() p.reset_camera(render=False) p.show()
简化方案(仅适配pyvista 0.39及以上版本)
新版本add_background_image支持传入viewport参数指定作用的子图视口,无需手动创建平面,代码更简洁:
import pyvista as pv filenames = ['filename1.jpg','filename2.jpg','filename3.jpg'] mesh = pv.PolyData('meshfile.ply') p = pv.Plotter(shape='1|3') p.subplot(0) p.add_mesh(mesh) for idx, img_path in enumerate(filenames): p.subplot(idx + 1) # 获取当前子图的视口范围,传入背景图接口 current_viewport = p.renderer.GetViewport() p.add_background_image(img_path, viewport=current_viewport) p.show()
内容的提问来源于stack exchange,提问作者Arttu
相关产品推荐
相关产品推荐

