pythonスクリプトによるVTK操作のまとめ
これまで調べた、pythonスクリプトによるVTKでの絵の描き方についてまとめておく。以下の環境で動作確認済み。
ウィンドウを表示してマウスでぐりぐりやる方法
import vtk
cone = vtk.vtkConeSource()
mapper = vtk.vtkPolyDataMapper()
mapper.SetInput(cone.GetOutput())
actor = vtk.vtkActor()
actor.SetMapper(mapper)
ren = vtk.vtkRenderer()
ren.AddActor(actor)
renWin = vtk.vtkRenderWindow()
renWin.AddRenderer(ren)
renWin.Render()
iren = vtk.vtkRenderWindowInteractor()
iren.SetRenderWindow(renWin)
iren.Initialize()
iren.Start()
ウィンドウを表示して画像をファイルに保存する方法
pythonスクリプトは以下の通り。上のスクリプトをベースにして画像を保存する処理を追加する。
import vtk cone = vtk.vtkConeSource() mapper = vtk.vtkPolyDataMapper() mapper.SetInput(cone.GetOutput()) actor = vtk.vtkActor() actor.SetMapper(mapper) ren = vtk.vtkRenderer() ren.AddActor(actor) renWin = vtk.vtkRenderWindow() renWin.AddRenderer(ren) renWin.Render() iren = vtk.vtkRenderWindowInteractor() iren.SetRenderWindow(renWin) iren.Initialize() iren.Start() w2if = vtk.vtkWindowToImageFilter() w2if.SetInput(renWin) writer = vtk.vtkPNGWriter() writer.SetInputConnection(w2if.GetOutputPort()) writer.SetFileName('test.png') writer.Write()
このスクリプトだと、描画ウィンドウを閉じた時点での絵が保存される。マウスでぐりぐりと描画角度を変えたりして、この絵を保存したいというときにウィンドウを強制的に閉じるとよい。
より実用的なものにするには、何かのキーを押した時点でその瞬間の絵が保存されるようにするのが便利だと思われる。
ウィンドウを描画せずにファイルだけ保存する方法
マウスで操作する必要はなく、どのような絵を描くかはスクリプト中で指定して、描画ウィンドウを表示することなく画像ファイルだけ保存したい場合は以下のようにする。
import vtk cone = vtk.vtkConeSource() mapper = vtk.vtkPolyDataMapper() mapper.SetInput(cone.GetOutput()) actor = vtk.vtkActor() actor.SetMapper(mapper) ren = vtk.vtkRenderer() ren.AddActor(actor) renWin = vtk.vtkRenderWindow() renWin.AddRenderer(ren) renWin.OffScreenRenderingOn() renWin.Render() w2if = vtk.vtkWindowToImageFilter() w2if.SetInput(renWin) writer = vtk.vtkPNGWriter() writer.SetInputConnection(w2if.GetOutputPort()) writer.SetFileName('test.png') writer.Write()
下の画像がファイルtest.pngとして保存される。描画ウィンドウは現れない。
ここで、renWin.OffScreenRenderingOn()が重要。これがないと、一瞬だけ描画ウィンドウが立ち上がって目障りなことに。しかしこの方法を使っても、Linuxではどうやっても描画ウィンドウが立ち上がる(すぐ消えるが)。