PyVista设置nan_opacity=0无法实现含NaN网格区域透明的问题求助
PyVista设置nan_opacity=0无法实现含NaN网格区域透明的问题求助
我最近在测试PyVista处理带NaN值的多层网格渲染,按照预期,设置nan_opacity=0.0应该让NaN对应的网格区域完全透明,这样三层非重叠的网格应该能组合成一个红、蓝、绿三段式的球体,但实际运行后只得到了一个全绿色的球体(如下方图片所示)。
以下是我的测试代码:
import pyvista as pv import numpy as np def test_pyvista_layers(): """Test how PyVista handles multiple mesh layers with NaN values and opacity settings""" # Create a simple sphere sphere = pv.Sphere(radius=1.0) total_points = sphere.n_points # Create three meshes with known patterns mesh1 = sphere.copy() mesh2 = sphere.copy() mesh3 = sphere.copy() # Test 1: Basic overlap with different values and NaN values1 = np.full(total_points, np.nan) # Initialize with NaN values1[:total_points//3] = 1 # Set first third to 1 values2 = np.full(total_points, np.nan) # Initialize with NaN values2[total_points//3:2*total_points//3] = 2 # Set middle third to 2 values3 = np.full(total_points, np.nan) # Initialize with NaN values3[2*total_points//3:] = 3 # Set final third to 3 # Validate NaN counts and non-overlap nan_count1 = np.sum(np.isnan(values1)) nan_count2 = np.sum(np.isnan(values2)) nan_count3 = np.sum(np.isnan(values3)) print(f"\nNaN Counts:") print(f"Layer 1: {nan_count1} NaN values ({(nan_count1/total_points)*100:.1f}% of points)") print(f"Layer 2: {nan_count2} NaN values ({(nan_count2/total_points)*100:.1f}% of points)") print(f"Layer 3: {nan_count3} NaN values ({(nan_count3/total_points)*100:.1f}% of points)") # Check for overlap between non-NaN regions overlap_12 = np.sum(~np.isnan(values1) & ~np.isnan(values2)) overlap_23 = np.sum(~np.isnan(values2) & ~np.isnan(values3)) overlap_13 = np.sum(~np.isnan(values1) & ~np.isnan(values3)) print("\nOverlap Check:") print(f"Overlap between layers 1-2: {overlap_12} points") print(f"Overlap between layers 2-3: {overlap_23} points") print(f"Overlap between layers 1-3: {overlap_13} points") # Validate complete coverage total_coverage = np.sum(~np.isnan(values1) | ~np.isnan(values2) | ~np.isnan(values3)) print(f"\nTotal Coverage: {total_coverage} points ({(total_coverage/total_points)*100:.1f}% of surface)") plotter = pv.Plotter() # Add meshes with point data and NaN handling mesh1.point_data['values'] = values1 mesh2.point_data['values'] = values2 mesh3.point_data['values'] = values3 # Add meshes with nan_opacity=0 to make NaN values completely transparent plotter.add_mesh(mesh1, color='red', opacity=1.0, label='Layer 1', nan_opacity=0.0) plotter.add_mesh(mesh2, color='blue', opacity=1.0, label='Layer 2', nan_opacity=0.0) plotter.add_mesh(mesh3, color='green', opacity=1.0, label='Layer 3', nan_opacity=0.0) return plotter test_plotter = test_pyvista_layers() test_plotter.show()
运行代码后,控制台输出验证了各层的NaN值分布是正确的,且三层的非NaN区域完全没有重叠,覆盖了整个球体的所有点:
NaN Counts:
Layer 1: 562 NaN values (66.7% of points)
Layer 2: 561 NaN values (66.6% of points)
Layer 3: 561 NaN values (66.6% of points)Overlap Check:
Overlap between layers 1-2: 0 points
Overlap between layers 2-3: 0 points
Overlap between layers 1-3: 0 pointsTotal Coverage: 842 points (100.0% of surface)
但实际渲染出的效果却是这样的全绿色球体:
我尝试了各种不同的渲染方式,也仔细查阅了PyVista的文档,但都没能解决这个问题。有没有人能告诉我哪里出问题了,或者该怎么正确实现预期的三段式球体渲染效果?
备注:内容来源于stack exchange,提问作者Jonathan
相关产品推荐
相关产品推荐

