注釈
Go to the end をクリックすると完全なサンプルコードをダウンロードできます.
ブール演算#
閉じた(多様な)曲面でブーリアン演算を行う.
ブール/位相演算(交差,結合,切断)法は, pyvista.PolyData
メッシュタイプに対してのみ実装され,任意の pyvista.PolyData
メッシュから直接アクセス可能である. pyvista.PolyDataFilters
をチェックして,次のフィルタを確認してください.
基本的に,ブーリアン結合,切断,交差はすべて同じ操作です.ただ,オブジェクトの異なる部分が最終的に保持されるだけです.
演算子 -
は,PyVistaの任意の2つの pyvista.PolyData
メッシュの間で使用することができ,最初のメッシュを2番目のメッシュでカットします. これらのメッシュはすべて3角形のメッシュでなければなりません.これは pyvista.PolyData.is_all_triangles
で確認できます.
注釈
マージでは, +
演算子をPyVistaの任意の2つのメッシュ間で使用できます.この演算子は,任意の2つのメッシュを結合するために .merge()
フィルタを呼び出すだけです.これは単に boolean_union
フィルタを呼び出すだけでのPyVistaの |
演算子とは異なり、結果に対して追加の計算を行うことなく2つのメッシュを重ね合わせます。 PyVista の &
演算子は単に boolean_intersection
を呼び出します。
警告
ブーリアン演算が思った通りに反応しない(例えば,間違った部分が消えてしまう)場合,メッシュの1つが法線を内側に向けている可能性があります.法線を可視化するには, pyvista.PolyDataFilters.plot_normals()
を使用してください.
ブール演算和#
pyvista.PolyDataFilters.boolean_union()
フィルタを使用して, A
と B
のブール結合を行います.
2つの多様体メッシュ A
と B
の結合は, A
にあるメッシュ, B
にあるメッシュ,または A
と B
の両方にあるメッシュとなります.
論理和にはオペランドの順序は関係ありません(演算は可換です).
result = sphere_a | sphere_b
pl = pv.Plotter()
_ = pl.add_mesh(sphere_a, color='r', style='wireframe', line_width=3)
_ = pl.add_mesh(sphere_b, color='b', style='wireframe', line_width=3)
_ = pl.add_mesh(result, color='lightblue')
pl.camera_position = 'xz'
pl.show()

論理差#
両方のメッシュが pyvista.PolyData
であるため, pyvista.PolyDataFilters.boolean_difference()
フィルタまたは -
演算子を使用して A
と B
のブーリアン値の差を実行します.
2つのマニフォールドメッシュ A
と B
の差は, A
のメッシュのうち B
に属さない部分の体積である.
真偽判定にはオペランドの順序が重要です.
result = sphere_a - sphere_b
pl = pv.Plotter()
_ = pl.add_mesh(sphere_a, color='r', style='wireframe', line_width=3)
_ = pl.add_mesh(sphere_b, color='b', style='wireframe', line_width=3)
_ = pl.add_mesh(result, color='lightblue')
pl.camera_position = 'xz'
pl.show()

ブール交差#
pyvista.PolyDataFilters.boolean_intersection()
フィルタを使用して, A
と B
のブール交差を行います.
2つの多様体メッシュ A
と B
の交点は, A
の体積が B
の中にもあるメッシュである.
論理交差にはオペランドの順序は関係ありません(演算は可換です).
result = sphere_a & sphere_b
pl = pv.Plotter()
_ = pl.add_mesh(sphere_a, color='r', style='wireframe', line_width=3)
_ = pl.add_mesh(sphere_b, color='b', style='wireframe', line_width=3)
_ = pl.add_mesh(result, color='lightblue')
pl.camera_position = 'xz'
pl.show()

裏返った面による動作#
これらのブーリアンフィルターは面の向きによって動作が異なることに注意してください。 これは、向きによってメッシュの "外側" と "内側" のどちらの部分とみなされるかが決まるからです。 この例では flip_faces()
を使って面を反転させています。
立方体と球体の両方の面が外側を向いている状態でのブール型の差分です. これが "normal" の動作です.
cube = pv.Cube().triangulate().subdivide(3)
sphere = pv.Sphere(radius=0.6)
result = cube.boolean_difference(sphere)
result.plot(color='lightblue')

立方体の面を外側に,球面を内側にしたブール値の差.
cube = pv.Cube().triangulate().subdivide(3)
sphere = pv.Sphere(radius=0.6).flip_faces()
result = cube.boolean_difference(sphere)
result.plot(color='lightblue')

立方体の面を内側に,球面を外側にしたブール値の差.
cube = pv.Cube().triangulate().subdivide(3).flip_faces()
sphere = pv.Sphere(radius=0.6)
result = cube.boolean_difference(sphere)
result.plot(color='lightblue')

立方体と球体の両方の面を内側にします.
cube = pv.Cube().triangulate().subdivide(3).flip_faces()
sphere = pv.Sphere(radius=0.6).flip_faces()
result = cube.boolean_difference(sphere)
result.plot(color='lightblue')

Total running time of the script: (0 minutes 6.278 seconds)