PyVistaとVTKの連携

PyVistaとVTKの連携#

PyVistaは,使いやすいプロットAPIでよく知られており,Matplotlibのようなライブラリですでに経験を積んだほとんどのPythonユーザーにとってなじみ深いものです.多くの人が,データパイプラインにVTKのPythonバインディングの力を,3DレンダリングにPyVistaの柔軟性とシンプルさを組み合わせることで利益を得ています.次のセクションでは,この使用シナリオを説明します.

Tip

メッシュとは? のセクションで明確にされていないかもしれませんが,PyVistaのメッシュクラスはVTKの対応するクラスのサブクラスであり,これはPyVistaとVTKのワークフローを混在させることができることを意味しています.

VTKのクラスを使って,出力をPyVistaでラップして,効率的にプロットすることを止めるものはありません.例えば

import pyvista as pv
import vtk
from pyvista import examples

vtkを使用して円を作成する

polygonSource = vtk.vtkRegularPolygonSource()  # noqa: N816
polygonSource.GeneratePolygonOff()
polygonSource.SetNumberOfSides(50)
polygonSource.SetRadius(5.0)
polygonSource.SetCenter(0.0, 0.0, 0.0)
polygonSource.Update()

Pyvistaを使ったラップとプロット

mesh = pv.wrap(polygonSource.GetOutput())
mesh.plot(line_width=3, cpos="xy", color="k")
a 2 pyvista vtk

このようにして, PyVistaの柔軟性とVTKの原動力の両方を必要とする "best of both worlds" を得ることができるのです.

注釈

上記のVTKコードを1行で置き換えるために, pyvista.Polygon() を使用することができます.

VTKアルゴリズム#

おそらく,PyVistaで(まだ)公開されていないVTKアルゴリズムで,使いたいものがあるのでしょう.PyVistaのオブジェクトはVTKのオブジェクトなので,これは十分に簡単に扱えます.PyVistaのメッシュをVTKアルゴリズムに渡して,出力をラップしてプロットしたり,さらにフィルタリングしたり,何でもできるのです.

mesh = examples.download_bunny_coarse()

VTKアルゴリズムの初期化

splatter = vtk.vtkGaussianSplatter()

VTKへの入力としてPyVistaオブジェクトを渡す

splatter.SetInputData(mesh)

パラメータの設定

n = 200
splatter.SetSampleDimensions(n, n, n)
splatter.SetRadius(0.02)
splatter.SetExponentFactor(-10)
splatter.SetEccentricity(2)
splatter.Update()

PyVistaで出力とラップを取得する

vol = pv.wrap(splatter.GetOutput())

PyVistaを使って輪郭線を作成する

cntrs = vol.contour([0.95 * splatter.GetRadius()])

PyVistaを使ってプロットする

p = pv.Plotter()
p.add_mesh(mesh, style="wireframe")
p.add_mesh(cntrs, color=True)
p.show()
a 2 pyvista vtk

注釈

上記の例は,VTKの Embed Points Into Volume から引用したものです.

Open In Colab

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

Sphinx-Galleryによるギャラリー