pythonスクリプトによるVTK操作のまとめ

これまで調べた、pythonスクリプトによるVTKでの絵の描き方についてまとめておく。以下の環境で動作確認済み。

  • 実行環境:Windows 7 Professional(64bit)
  • Python:2.6.6 (MSC v.1500 32 bit (Intel)] on win32
  • VTK:バージョンを調べようとしたが分からず、不明。

ウィンドウを表示してマウスでぐりぐりやる方法

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()

実行すると、絵が書かれたウィンドウが現れる。平行移動、拡大縮小、回転の操作がマウスで実行できる。

ウィンドウを表示して画像をファイルに保存する方法

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ではどうやっても描画ウィンドウが立ち上がる(すぐ消えるが)。