您的案例的便利功能似乎有点太方便了。
引擎盖下的作用是plot_normals()
它访问cave.point_normals
,而后者又调用cave.compute_normals()
. include的默认参数compute_normals()
consistent_normals=True
,根据文档确实
执行一致的多边形排序。
还有一些其他参数暗示运行此过滤器时可能会发生黑魔法(例如auto_orient_normals
和non_manifold_ordering
,即使默认值看起来很安全)。
所以似乎发生的是你的网格(它是非流形的,即它有开放的边缘)打破了compute_normals
试图与默认的“多边形排序的强制执行”有关的魔法。由于您已经在 Blender 中强制执行了正确的顺序,因此您可以告诉 pyvista(好吧,VTK)不要理会您的多边形,只需按原样计算法线即可。这是不可能的plot_normals()
,所以你需要做更多的工作:
import pyvista as pv
# read data
cave = pv.read("OC_wellsliced.stl")
# compute normals
# cave = cave.compute_normals() # default (wrong) behaviour
cave = cave.compute_normals(consistent_normals=False) # correct behaviour
# plot the normals manually; plot_normals() won't work
plotter = pv.Plotter()
plotter.add_mesh(cave, color='silver')
plotter.add_mesh(cave.glyph(geom=pv.Arrow(), orient='Normals'), color='black')
plotter.view_vector([-1, -1, 1])
plotter.show()
您可以取消注释默认调用compute_normals()
以重现plot_normals()
. 更重要的是,您现在可以'Normals'
在网格上调用点和元胞数组,您可以将其用于任何类型的后处理。这些保证是理智的,因为它们正是我们在上图中绘制的。
我现在注意到您还说“在非常不同的 [...] 方向”;我专注于标志翻转。不幸的是,很难在 Blender 屏幕截图中看到法线,所以我无法解决这个问题。点法线(与面法线相反)可能在两者之间的计算方式不同。对于平面多边形单元格,单元格法线应该明确定义。