注記
最後まで移動して、完全なサンプルコードをダウンロードしてください。または、JupyterLiteまたはBinderを介してブラウザでこの例を実行します。
衝突#
2つのメッシュ間の衝突検出を実行します。
この例では、collision
フィルターを使用して、一方の球からもう一方の球に衝突する面を検出します。
注記
vtk.vtkCollisionDetectionFilter の性質上、このメソッドの繰り返し使用は、vtk.vtkCollisionDetectionFilter
を直接使用する場合よりも遅くなります。フィルターの最初の更新では、vtkOBBTree の2つのインスタンスが作成され、その後、入力メッシュの変換または行列を変更することで更新できます。
このメソッドは変換がないことを前提としており、単一の衝突テストには使いやすいですが、繰り返し衝突を迅速に計算するには、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