衝突#

2つのメッシュ間の衝突検出を実行します。

この例では、collisionフィルターを使用して、一方の球からもう一方の球に衝突する面を検出します。

注記

vtk.vtkCollisionDetectionFilter の性質上、このメソッドの繰り返し使用は、vtk.vtkCollisionDetectionFilter を直接使用する場合よりも遅くなります。フィルターの最初の更新では、vtkOBBTree の2つのインスタンスが作成され、その後、入力メッシュの変換または行列を変更することで更新できます。

このメソッドは変換がないことを前提としており、単一の衝突テストには使いやすいですが、繰り返し衝突を迅速に計算するには、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によって生成されたギャラリー