クリップボリュームウィジェット#

pyvista.ImageDatapyvista.RectilinearGrid のような構造化されたデータセットでは, pyvista.Plotter.add_volume_clip_plane() ウィジェットを使ってデータセットを切り取って,内部構造をより良く確認できるようにすることができます.

../../_images/volume-clip-plane-widget.gif

データセットの作成#

寸法 (200, 200, 200) の密な pyvista.ImageData を作成し,アクティブスカラーをグリッドの center からの距離として設定します.

import numpy as np

import pyvista as pv

grid = pv.ImageData(dimensions=(200, 200, 200))
grid['scalars'] = np.linalg.norm(grid.center - grid.points, axis=1)
grid
HeaderData Arrays
ImageDataInformation
N Cells7880599
N Points8000000
X Bounds0.000e+00, 1.990e+02
Y Bounds0.000e+00, 1.990e+02
Z Bounds0.000e+00, 1.990e+02
Dimensions200, 200, 200
Spacing1.000e+00, 1.000e+00, 1.000e+00
N Arrays1
NameFieldTypeN CompMinMax
scalarsPointsfloat6418.660e-011.723e+02


不透明度配列の生成#

データセットがある値で "輪" を示すような,帯状の不透明度配列を作成します.高い値(中心から遠い値)がより不透明になるように増加させます.

opacity = np.zeros(100)
opacity[::10] = np.geomspace(0.01, 0.75, 10)

単一クリッププレーンデータセットのプロット#

単一のクリッププレーンでボリュームをプロットします.

不透明度の配列を反転させ,中心に近い部分がより不透明になるようにします.

pl = pv.Plotter()
pl.add_volume_clip_plane(grid, normal='-x', opacity=opacity[::-1], cmap='magma')
pl.show()
clip volume

複数のクリッププレーンをプロットする#

pyvista.Plotter.add_volume_clip_plane() による出力で,データセットをプロットします. interaction_event'always' に設定して,一定のインタラクションを有効にします.

プロットをもう少しわかりやすくするために矢印を無効にし,不透明度の配列を反転させます.

pl = pv.Plotter()
vol = pl.add_volume(grid, opacity=opacity)
vol.prop.interpolation_type = 'linear'
pl.add_volume_clip_plane(
    vol,
    normal='-x',
    interaction_event='always',
    normal_rotation=False,
)
pl.add_volume_clip_plane(
    vol,
    normal='-y',
    interaction_event='always',
    normal_rotation=False,
)
pl.show()
clip volume

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

Sphinx-Galleryによるギャラリー