注意
转到最后 下载完整的示例代码。 或者通过 JupyterLite 或 Binder 在浏览器中运行此示例。
碰撞#
执行两个网格之间的碰撞检测。
此示例使用 collision
过滤器来检测一个球体与另一个球体碰撞的面。
注意
由于 vtk.vtkCollisionDetectionFilter 的性质,重复使用此方法将比直接使用 vtk.vtkCollisionDetectionFilter
速度慢。 过滤器的第一次更新将创建两个 vtkOBBTree 实例,这些实例可以通过修改输入网格的变换或矩阵来随后更新。
此方法假设没有变换,并且对于单个碰撞测试更容易使用,但建议将 pyvista
和 vtk
结合使用来快速计算重复碰撞。 请参见 碰撞检测示例
import numpy as np
import pyvista as pv
pv.set_plot_theme("document")
创建主网格和次要“移动”网格。
碰撞面将在该球体上绘制,为此我们初始化一个初始 "collisions"
掩码。
设置绘图器打开电影,并在移动球体后写入帧。
pl = pv.Plotter()
pl.enable_hidden_line_removal()
pl.add_mesh(sphere0, show_scalar_bar=False, cmap="bwr")
pl.camera_position = "xz"
pl.add_mesh(sphere1, style="wireframe", color="green", line_width=5)
# for this example
pl.open_gif("collision_movie.gif")
# alternatively, to disable movie generation:
# pl.show(auto_close=False, interactive=False)
delta_x = 0.05
for i in range(int(2 / delta_x)):
sphere1.translate([delta_x, 0, 0])
col, n_contacts = sphere0.collision(sphere1)
collision_mask = np.zeros(sphere0.n_cells, dtype=bool)
if n_contacts:
collision_mask[col["ContactCells"]] = True
sphere0["collisions"] = collision_mask
pl.write_frame()
# alternatively, disable movie plotting and simply render the image
# pl.render()
pl.close()
脚本的总运行时间:(0 分钟 8.973 秒)
估计内存使用量:393 MB