碰撞#

执行两个网格之间的碰撞检测。

此示例使用 collision 过滤器来检测一个球体与另一个球体碰撞的面。

注意

由于 vtk.vtkCollisionDetectionFilter 的性质,重复使用此方法将比直接使用 vtk.vtkCollisionDetectionFilter 速度慢。 过滤器的第一次更新将创建两个 vtkOBBTree 实例,这些实例可以通过修改输入网格的变换或矩阵来随后更新。

此方法假设没有变换,并且对于单个碰撞测试更容易使用,但建议将 pyvistavtk 结合使用来快速计算重复碰撞。 请参见 碰撞检测示例

import numpy as np
import pyvista as pv

pv.set_plot_theme("document")

创建主网格和次要“移动”网格。

碰撞面将在该球体上绘制,为此我们初始化一个初始 "collisions" 掩码。

sphere0 = pv.Sphere()
sphere0["collisions"] = np.zeros(sphere0.n_cells, dtype=bool)

# This mesh will be the moving mesh
sphere1 = pv.Sphere(radius=0.6, center=(-1, 0, 0))

设置绘图器打开电影,并在移动球体后写入帧。

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()
plot collisions

脚本的总运行时间:(0 分钟 8.973 秒)

估计内存使用量:393 MB

画廊由 Sphinx-Gallery 生成