pyvista.PolyDataFilters.collision#

PolyDataFilters.collision(other_mesh, contact_mode=0, box_tolerance=0.001, cell_tolerance=0.0, n_cells_per_node=2, generate_scalars=False, progress_bar=False)[ソース]#

2つの多面体サーフェス間の衝突判定を行います.

もし collision_mode が all contacts に設定されている場合,出力は接触そいている線になります.もし collision_mode がファーストコンタクトやハーフコンタクトに設定されている場合は,コンタクトの出力は頂点になります.

警告

現在は3角形のみが処理されます.ストリップやポリゴンをトライアングルに変換するには PolyDataFilters.triangulate() を使用してください. それ以外の場合は,このメソッド内でメッシュの変換が行われます.

パラメータ:
other_meshpyvista.DataSet

衝突をテストする他のメッシュ. 他のメッシュがサーフェスでない場合は,その外面が抽出され,3角測量されます.

contact_modeint, default: 0

接触モード. 以下のいずれかになります.

  • 0 - すべての接触.2点/コリジョンで全ての接触セルペアを見つけます

  • 1 - ファーストコンタクト.ファーストコンタクトポイントを素早く見つけます.

  • 2 - ハーフコンタクト.接触しているすべてのセルペアを,1コリジョンにつき1ポイントで見つける.

box_tolerancefloat, default: 0.001

全体座標でのOBB(Oriented Bounding Box)ツリーの許容範囲.

cell_tolerancefloat, default: 0.0

セルの許容量(2乗値).

n_cells_per_nodeint, default: 2

各OBBのセルの数.

generate_scalarsbool, default: False

コンタクトセルを可視化するフラグ. もし True ならば,接触しているセルは赤から青へと色づけされ,最初に決定された衝突は赤になります. この配列は "collision_rgba" として格納される.

注釈

これにより,メッシュ内の他のセルアレイが削除されます.

progress_barbool, default: False

進行状況を示す進行状況バーを表示します.

戻り値:
pyvista.PolyData

"ContactCells" という名前の field_data 属性のコリジョンを含みますメッシュです. この配列は,コリジョンがある場合にのみ存在します.

int

衝突の数.

備考

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

このメソッドは変換を前提としていないので,単一の衝突テストには使いやすいですが,繰り返される衝突を高速に計算するには pyvistavtk の組み合わせを使うことをお勧めします. 詳しくは, Collision Detection Example を参照してください.

球体と立方体の背面の衝突を計算し,最初の10個の衝突のセルインデックスを出力します.

>>> import numpy as np
>>> import pyvista as pv
>>> mesh_a = pv.Sphere(radius=0.5)
>>> mesh_b = pv.Cube((0.5, 0.5, 0.5)).extract_cells([0, 2, 4])
>>> collision, ncol = mesh_a.collision(mesh_b, cell_tolerance=1)
>>> collision['ContactCells'][:10]
pyvista_ndarray([464,   0,   0,  29,  29,  27,  27,  28,  28,  23])

"ContactCells" のフィールドデータを使ってコリジョンマスクを作成し,コリジョンをプロットします. 衝突のあったセルは赤で表示されます.

>>> scalars = np.zeros(collision.n_cells, dtype=bool)
>>> scalars[collision.field_data['ContactCells']] = True
>>> pl = pv.Plotter()
>>> _ = pl.add_mesh(
...     collision,
...     scalars=scalars,
...     show_scalar_bar=False,
...     cmap='bwr',
... )
>>> _ = pl.add_mesh(
...     mesh_b,
...     color='lightblue',
...     line_width=5,
...     opacity=0.7,
...     show_edges=True,
... )
>>> pl.show()
../../../_images/pyvista-PolyDataFilters-collision-1_00_00.png

あるいは, generate_scalars を有効にした後,デフォルトの 'collision_rgba' 配列を使って衝突をプロットするだけでも構いません.

>>> collision, ncol = mesh_a.collision(
...     mesh_b, cell_tolerance=1, generate_scalars=True
... )
>>> collision.plot()
../../../_images/pyvista-PolyDataFilters-collision-1_01_00.png

このフィルターを使用したその他の例については, 衝突 を参照してください.