VTKを使ってみる

出典: Wikimura

実験データの視覚化には様々なツールがあるが、3Dで満足な表現をするのはなかなか難しい。 最近ではXNAという選択肢が出てきたものの、全て自前で作らなくてはならないことには変わりなく、やっぱり難しい。

そんな中でVTKというものを見つけた。 VTKは視覚化ツールの一種で、単体ではTcl/Tkという言語を使ってデータの視覚化を行えるらしい。 既にデータがあって視覚化するだけなら、VTKのバイナリだけあれば良いらしい。 まずはリアルタイム処理を考えず、視覚化だけやってみるのも良いかもしれない。

視覚化は、パイプラインと呼ばれる可視化の流れを組み立てることで行うらしい。 これを視覚的に行うためのツールが公開されている。

目次

インストール

C++からVTKを使用するためには、VTKのソースからビルドしなくてはならない。 Kitware社のVTKソースとCMAKE(バイナリ)をダウンロードする。

  1. VTKソース展開
  2. CMAKEのGUIにて
    1. Where is the source code: VTKソースのルートを指定
    2. Where to build the binaries: ビルド用ファイルを置く場所
    3. 設定をしたらConfigureを押す
      • プロジェクトファイルの形式を指定
    4. Generateが押せるようになったらGenerateを押す
      • だめな場合でも、もう一度Configureを押すとできるようになる?
  3. 2-2で指定したディレクトリに、プロジェクトが生成される
    • プロジェクトはVisual StudioやBorlandなど、いくつか形式が選べる
  4. プロジェクトをビルドする
    • Install というプロジェクトをビルドすると、デフォルトでC:\Program Files\VTK 以下に必要なファイルがコピーされる
    • インストール先はCMAKEで設定できる


サンプル実行

オフィシャルにある球体表示のプログラムを実行する。

設定

  • VTK_ROOT: C:\Program Files\VTK
  • インクルードディレクトリ: VTK_ROOT\include\vtk-5.4
  • ライブラリディテクトリ: VTK_ROOT\lib\vtk-5.4
  • 追加依存ファイル(以下のように調べる)
VTK_ROOT\lib\vtk-5.4>ls *.lib
vtkCommon.lib            vtkNetCDF.lib            vtkjpeg.lib
vtkDICOMParser.lib       vtkRendering.lib         vtklibxml2.lib
vtkFiltering.lib         vtkViews.lib             vtkmetaio.lib
vtkGenericFiltering.lib  vtkVolumeRendering.lib   vtkpng.lib
vtkGeovis.lib            vtkWidgets.lib           vtkproj4.lib
vtkGraphics.lib          vtkalglib.lib            vtksqlite.lib
vtkHybrid.lib            vtkexoIIc.lib            vtksys.lib
vtkIO.lib                vtkexpat.lib             vtktiff.lib
vtkImaging.lib           vtkfreetype.lib          vtkverdict.lib
vtkInfovis.lib           vtkftgl.lib              vtkzlib.lib

コード

サンプルコードは以下を使用した。 ただし、C++のコードはそのままでは使用できない。 インクルードが足りないらしく、「認識できない型を使用している」

error C2027: 認識できない型 'vtkProperty' が使われています。

と出てしまう。

Googleで「vtkproperty unrecognized」と検索したところ、「vtkProperty.h」というヘッダファイルがあることが判明した。そこで、このヘッダをインクルードするようにしたところ、ビルドが通るようになった。

// 修正を加えたソースコード
#include "vtkSphereSource.h"
#include "vtkPolyDataMapper.h"
#include "vtkActor.h"
#include "vtkRenderWindow.h"
#include "vtkRenderer.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkProperty.h"
void main ()
{

  // create sphere geometry
  vtkSphereSource *sphere = vtkSphereSource::New();
  sphere->SetRadius(1.0);
  sphere->SetThetaResolution(18);
  sphere->SetPhiResolution(18);

  // map to graphics library
  vtkPolyDataMapper *map = vtkPolyDataMapper::New();
  map->SetInput(sphere->GetOutput());

  // actor coordinates geometry, properties, transformation
  vtkActor *aSphere = vtkActor::New();
  aSphere->SetMapper(map);
  aSphere->GetProperty()->SetColor(0,0,1); // sphere color blue

  // a renderer and render window
  vtkRenderer *ren1 = vtkRenderer::New();
  vtkRenderWindow *renWin = vtkRenderWindow::New();
  renWin->AddRenderer(ren1);

  // an interactor
  vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
  iren->SetRenderWindow(renWin);

  // add the actor to the scene
  ren1->AddActor(aSphere);
  ren1->SetBackground(1,1,1); // Background color white

  // render an image (lights and cameras are created automatically)
  renWin->Render();

  // begin mouse interaction
   iren->Start();
}

実行結果