Visualization Toolkit (VTK) のインストール on Windows, Visual Studio

この記事では CMake を使ったことがない人向けに、VTK (Visualization Toolkit) のインストールについてまとめます。もしミスがありましたら教えてください。

# 環境

この記事の執筆当時（2018/6/23）の環境は次の通りです。

- VTK 8.1.1
- Windows 10 64bit
- Visual Studio 2017
- （オプション）Anaconda 3

※VTK 8.2.0 も同様にビルドできました。

# 手順

## ダウンロード

[公式ホームページ](https://www.vtk.org/download/)から source の zip をダウンロードして展開します。展開する先は、Cドライブ直下に近い方が良いです。私は C:\VTK に展開しました。
（バージョンによってはインストーラがあってこの後の手順を追わなくてもインストールできるようです。）

## Configure

CMake がない人は[公式ホームページ](https://cmake.org/download/)からインストーラをダウンロードし、画面に沿ってインストールをします。
CMake を起動し、zip を展開してできたフォルダへのパスを Where is the source codes の欄へ入力します。そして、Where to build the binaries 欄（しばしば build と呼ばれます）には source codes 欄と違うパスを入れます。私の場合は

- Where is the source codes: C:/VTK/VTK-8.1.1
- Where to build the binaries: C:/VTK/VTK-8.1.1/build

のようになりました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/229492/d277d1c5-7572-16a0-c020-52ff3b8c75e9.png)

画面の下の方に Configure ボタンがありますので、それをクリックし、フォルダを新たに作るか聞かれたら yes をクリックします。
下のような画面が出てきますので、Specify the generator for this project の欄でコンパイルに使う環境を選びます。Visual Studio 2017 で 64bit のバイナリを作りたい私は Visual Studio 15 2017 Win64 を選びました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/229492/2722ccbd-7f99-3bbd-96b1-499f3fc19c96.png)

Finish をクリックすると CMake の画面下のログが動き始めます。ここで環境依存するような設定とかを色々自動で見てくれますので、しばらくお待ちください。
途中で下の画面のように 「～ - failed」とか「～ - not found」とか出てきますが、エラーで停止したりでもしない限りは心配しなくて大丈夫です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/229492/941f6a57-144b-8e8a-5234-034b46835e6a.png)

うまくいけば、ログが Configuring done となり、下のような画面が出ます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/229492/7aef710c-0804-6001-39b3-224cbe148518.png)

真っ赤ですが、異常で赤いわけではなく、Configure の間に新たに出てきた設定値が赤くなっています。この後は、基本的に

1. 変えたい設定値があれば変える。
2. Configure を押して待つ。
3. エラーが出たらそれに対処し、赤い設定欄が増えたらそれを確認し、適宜変更する。
4. Configure を押して待つ。
5. 気の済むまで 3. と 4. を繰り返し、赤い設定欄がなくなれば設定完了。

という流れで設定をしていきます。以下で私がした設定を紹介します。

### インストール先の変更（おすすめ）

CMAKE_INSTALL_PREFIX はインストール先を表しています。デフォルトでは C:/Program Files/VTK になっていますが、この後のステップで作成したライブラリをインストールする際に管理者権限が必要になって面倒だったため、C:/VTK/VTK-8.1.1/install へ変更しました。

### 並列ビルド

CMAKE_CXX_MP_FLAG にチェックを入れ、CMAKE_CXX_MP_NUM_PROCESSORS にスレッド数を入力すると、この後のステップにおいて並列でライブラリを作ってくれます。大体4にしておけば良いと思います。（私はこの記事の編集作業のため余裕を持って2にしました。）

### Debug ビルド用の設定

VTK を使う側のプログラムのソースコードを書く際に Visual Studio の Debug や Release (CMake における RelWithDebInfo) のモードを使う場合は次のオプションを指定してください。

| Name | Value |
| ---- | ----- |
| CMAKE_DEBUG_POSTFIX | -gd |
| CMAKE_RELWITHDEBINFO_POSTFIX | -d |

このようにしておくとビルドして生成されるファイルが Debug と RelWithDebInfo と Release で異なるファイル名を持つようになり、CMake から VTK を参照したときに自動で必要なファイルを選択してくれます。

### Python でも使えるようにしたい（オプション）

※Release 以外のビルドも行う場合はこれの前に一旦 Release 以外のビルドを終わらせておき、Release だけ Python つきでビルドしてください。（私は最初そうしなかったためにエラーに悩まされました。）

私は Python でも VTK を使えるようにしたかったため、VTK_WRAP_PYTHON にチェックを入れ、VTK_PYTHON_VERSION を 3 にしました。
私の環境では、この設定で Configure をすると自動で anaconda を見つけてくれましたが、そうでない場合は python のパスを聞かれますので、必要に応じて設定をしましょう。私の環境で自動設定された設定値は次の通りです。（build フォルダの CMakeCache.txt に書かれています。）

| Name | Value |
| ----- | ----- |
| PYTHON_EXECUTABLE | C:/Users/（ユーザ名）/Anaconda3/python.exe |
| PYTHON_INCLUDE_DIR | C:/Users/（ユーザ名）/Anaconda3/include |
| PYTHON_LIBRARY | C:/Users/（ユーザ名）/Anaconda3/libs/python36.lib |

## ビルド

Generate ボタンを押すと、Visual Studio でライブラリを作ってインストールするためのファイルが生成されます。Generating done と出れば生成が終わったということなので、Open Project をクリックすると Visual Studio が起動します。

Visual Studio で上の方のプルダウンで Release を選びます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/229492/7fd4715a-c9fe-ee60-edfa-ffcac86270be.png)

右側のソリューションエクスプローラから CMakePredefinedTargets 内の ALL_BUILD を探し、右クリックしてビルドをクリックします。
これでコンパイルが始まりますので、しばらくお待ちください。
（高機能なライブラリなのでそこそこ時間かかります…。）

ログに終了を示すメッセージが出たら、CMake で設定した build のフォルダにライブラリとそれを作るのに必要となった中間的なファイルなどが詰まっています。これをインストールするため、ALL_BUILD の下にある INSTALL を右クリックし、ビルドをクリックします。
少し待つとまた終了のメッセージが出ます。これで、CMake 上で設定したインストール先にファイルがコピーされます。このインストール先の中は次のようになりました。

~~~~~~
(インストール先)
+-- bin
|   +-- (パスを通して使う .exe と .dll)
|
+-- cmake
|
+-- include
|   +-- vtk-8.1
|       +-- (C++ 用の .h ファイル)
|
+-- lib
|   +-- (C++ 用の .lib ファイル)
|   |
|   +-- cmake
|   |   +-- vtk-8.1
|   |       +-- (CMake 用のファイル)
|   |
|   +-- python3.6 (Python 付きでコンパイルした場合)
|       +-- site-packages
|           +-- vtk
|               +-- (Python 用のファイル)
|
+-- share
~~~~~~

これでファイルを生成する段階は終わりです。CMake や Visual Studio は閉じておきましょう。

## 環境変数

作成したファイルを Windows が見つけられるように (インストール先)\bin へパスを通します。Windows 10 だとエクスプローラで PC を右クリックしてプロパティを開き、出てくる画面の左側から「システムの詳細設定」をクリックし、出てくる画面から「環境変数」をクリックします。Path 変数を編集し、(インストール先)\bin を追加します。
さらに VTK_DIR 環境変数を追加し、インストール先へのパスを登録しておきます。
この設定をした時点で Visual Studio や python を開いていた場合は閉じて起動しなおします。（環境変数を設定した後に起動しなおすと設定が適用されます。）

## Python のパス設定

python で使う人は python が (インストール先)/lib/python3.6/site-packages/vtk フォルダを見つけられるようにします。anaconda の場合、anaconda をインストールしたフォルダの中の Lib/site-packages の中に vtk.pth のようなファイルを作成し、(インストール先)/lib/python3.6/site-packages のパスをテキストで入力し、保存しておきます。

# 使用時の設定

## C++

ここでは、C++ で VTK を使ってみます。
とりあえず簡単に動作確認がしたい方は下のプログラムをコピペしてください。

~~~~~{.cpp}
#include <vtkSmartPointer.h>
#include <vtkSphereSource.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>

int main()
{
    auto sphere = vtkSmartPointer<vtkSphereSource>::New();
    sphere->Update();

    auto mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
    mapper->SetInputData(sphere->GetOutput());

    auto actor = vtkSmartPointer<vtkActor>::New();
    actor->SetMapper(mapper);

    auto renderer = vtkSmartPointer<vtkRenderer>::New();
    renderer->AddActor(actor);

    auto render_window = vtkSmartPointer<vtkRenderWindow>::New();
    render_window->AddRenderer(renderer);

    auto interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
    interactor->SetRenderWindow(render_window);

    interactor->Start();

    return 0;
}
~~~~~

このプログラムでは以下のような粗い球が表示されます。（普通に×で画面を閉じればプログラムが終了します。）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/229492/27fd76bd-ea27-073a-00b8-9c0e1a69c45b.png)

ここで、Visual Studio のプロジェクトを作る場合と CMake を使う場合に分けて使い方を説明します。（後者の方が楽です。）

### Visual Studio のプロジェクトを作る場合

VTK を使いたいプロジェクトのプロパティを開き、C/C++ の追加のインクルードディレクトリ欄に `%VTK_DIR%\include\vtk-8.1` と入力します。続いて、リンカーの追加のライブラリディレクトリ欄に `%VTK_DIR%\lib` と入力します。あとはリンカーの入力の追加の依存ファイル欄へ行き、右のプルダウンから編集をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/229492/f6fbe1fc-cab9-71de-6753-bc101d4908c4.png)

上の入力欄へ (インストール先)/lib 内の .lib ファイルをすべて追加します。
この作業を楽にするには、コマンドプロンプトで lib フォルダへ行き、`dir *.lib /b | clip`を実行します。これでクリップボード上に .lib の一覧が保存されるため、入力欄で Ctrl + V すれば .lib の一覧が入力されます。
入力を終えたら OK で画面を閉じます。
そして、ソースコードにも一手間必要で、VTK 関連の `#include` の前に

~~~~~{.cpp}
#define vtkRenderingCore_AUTOINIT 2(vtkInteractionStyle,vtkRenderingOpenGL2)
~~~~~

が必要です（[参考](https://stackoverflow.com/questions/18642155/no-override-found-for-vtkpolydatamapper)）。プロジェクトのすべての .cpp に適用するには stdafx.h へこれを追加します。

ここで、ライブラリを 64bit で作成した場合、64bit のプロジェクトでしか使えないということに注意してください。

### CMake を使う場合

CMake による C++ のプロジェクトの作り方は他で勉強していただくとして、CMake で test ターゲットに VTK を使うには、

~~~~{.cmake}
find_package(VTK REQUIRED)
include(${VTK_USE_FILE})
target_link_libraries(test ${VTK_LIBRARIES})
~~~~

を CMakeLists.txt に加えます。VTK も CMake も同じ kitware のプロジェクトのためか、CMake の VTK 対応はかなり強いです。

## Python

Python へのパス設定は先ほどしましたので、あとは `import vtk` で VTK が使えます。
例えば、

~~~~{.py}
# -*- coding: utf-8 -*-
import vtk

sphere = vtk.vtkSphereSource()
sphere.Update()

mapper = vtk.vtkPolyDataMapper()
mapper.SetInputData(sphere.GetOutput())

actor = vtk.vtkActor()
actor.SetMapper(mapper)

renderer = vtk.vtkRenderer()
renderer.AddActor(actor)

render_window = vtk.vtkRenderWindow()
render_window.AddRenderer(renderer)

interactor = vtk.vtkRenderWindowInteractor()
interactor.SetRenderWindow(render_window)

interactor.Start()
render_window.Finalize()
~~~~

で粗い球が表示されます。（普通に×で画面を閉じれます。）
VTK のクラスは全部 vtk から始まるため、`from vtk import *` とか使っても名前空間の問題は起きないのかもしれません。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/229492/5dddd066-1988-bf4c-7a89-f26f9ef1fc97.png)

# あとがき

今回、python でも VTK を使いたいと思ってインストールをし直すついでにこの記事を書きました。VTK を始めたいという方の役に立てば幸いです。