【发布时间】:2022-11-25 06:55:43
【问题描述】:
我用 pyvista.Plotter() 添加了一个网格
p.add_mesh(mesh, show_edges=True, color='linen', pbr=True, metallic=0.8, roughness=0.1, diffuse=1)
为什么这个细胞连接点不同于这个环形线圈周围的类似细胞连接处?
【问题讨论】:
我用 pyvista.Plotter() 添加了一个网格
p.add_mesh(mesh, show_edges=True, color='linen', pbr=True, metallic=0.8, roughness=0.1, diffuse=1)
为什么这个细胞连接点不同于这个环形线圈周围的类似细胞连接处?
【问题讨论】:
这可能是由于表面法线的计算方式,以及您的网格连接沿着该边缘关闭。
您经常生成此类封闭曲面的方法是根据一些广义坐标进行参数化,在这种情况下,其中之一是方位角。你的方位角扫描开始的地方(遵循物理约定:phi = 0对应于+x轴)和结束(phi = 2*pi,再次+x轴)重叠,但如果你不注意确保连接越过这个边界,你就没有一个封闭的环形线圈,而是一个打开的管子,它自己折回,在两个开口端相遇的地方有一个接缝。这会影响如何在边界面上估计表面法线。
如果您检查mesh.extract_feature_edges(boundary_edges=True, non_manifold_edges=True, feature_edges=False, manifold_edges=False).plot(),您可能会在伪影发生的地方看到一个垂直环。根据您的网格,使用较小的 tolerance 值调用 mesh = mesh.clean() 可能就足够了,因为如果您在接缝处的点正确重叠,那么这可以合并您的边界点并融合您的边界面以移除虚假边缘。 (您可能还必须自己重新计算法线,但可能不需要;我不完全确定。)
恰当的例子:这是一个使用挤压多边形的具体示例(这就是您的网格看起来的样子,或者足够接近):
import pyvista as pv
# generate toroid
square = pv.Polygon(n_sides=4).translate((0, -2, 0))
toroid = square.extrude_rotate(resolution=8, rotation_axis=(1, 0, 0), capping=False)
# let's see what we've got
plotter = pv.Plotter()
plotter.add_mesh(toroid, color='lightblue', smooth_shading=True)
plotter.view_yz()
plotter.show()
从阴影中可以明显看出有些不对劲。这是隐藏的边界边缘:
print(toroid.n_open_edges)
# 8
open_edges = toroid.extract_feature_edges(
boundary_edges=True,
non_manifold_edges=True,
feature_edges=False,
manifold_edges=False,
)
plotter = pv.Plotter()
plotter.add_mesh(toroid, color='lightblue', smooth_shading=True)
plotter.add_mesh(open_edges, color='red', line_width=5, render_lines_as_tubes=True)
plotter.view_yz()
plotter.show()
并以较小的公差进行清理(以允许浮点错误)解决了这个问题:
cleaned = toroid.clean(tolerance=1e-12)
print(cleaned.n_open_edges)
# 0
plotter = pv.Plotter()
plotter.add_mesh(cleaned, color='lightblue', smooth_shading=True)
plotter.view_yz()
plotter.show()
【讨论】: