C#で3Dモデル表示(VTKのC#ラッパActiVizによる方法)

ActiViz

C#で3Dモデル表示する方法はたくさんあると思うが,今回は,3Dコンピュータグラフィックスの可視化ライブラリであるVTK(The Visualization ToolKit)の,C#ラッパ「ActiViz」を使った方法について書く.

ActiVizおよびVTKの良さそうな点を以下にざっとあげる.

  • オープンソース
  • NuGet経由で簡単インストール
  • C#のWindows フォーム アプリケーション用のコントロールが用意されている
  • 表示するだけなら結構短いコードで書ける
  • VTKは次期OpenCVとかPCL(Point Cloud Library)とかでも使われているので,書き方を覚えておくと便利?

という感じで,手軽かつそれなりに汎用性がありそう.

インストール

NuGet経由でインストール可能.プロジェクトを右クリックして「NuGetパッケージの管理」を選択する.オンラインから「ActiViz」を検索.x86とx64があるが,x64だとコントロール追加できなかったりするので,x86が無難かも(自分の環境だけ?他の環境では確認していないので誰か詳しい方教えてくれると助かります).

f:id:whoopsidaisies:20131228121622p:plain

RenderWindowControlの追加

3D表示用のコントロールが用意されているので追加する.

ツールボックスの適当なところで右クリックして「アイテムの選択(I)...」を選択.「.NET Framework コンポーネント」タブの「参照(B)...」ボタンを押して,「(ソリューションフォルダ)\packages\Activiz.NET.x86.5.8.0\lib\net20\Kitware.VTK.dll」を選択したらOK.

 

すると,ツールボックスに「RenderWindowControl」ができるので,Formに配置する.

f:id:whoopsidaisies:20131228121729p:plain

サンプルコード

3Dモデルファイルの読み込み

以下にPLYファイルを読み込んで表示するサンプルを示す.MapperとかActorとか出てくるが,そこら辺の説明はこことかを参照.

using (var reader = new Kitware.VTK.vtkPLYReader())
using (var mapper = new Kitware.VTK.vtkCompositePolyDataMapper())
using (var actor = new Kitware.VTK.vtkActor())
{
    // 表示させたい3Dモデルファイル
    reader.SetFileName(@"bun_zipper.ply");
    // Mapperにオブジェクトを写像する
    mapper.SetInputConnection(reader.GetOutputPort());
    // ActorにMapperをセットする
    actor.SetMapper(mapper);
    // 描画ウィンドウにActorを追加する
    renderWindowControl1.RenderWindow.GetRenderers().GetFirstRenderer().AddActor(actor);
}

上記コードを,フォームロードイベントとかに書いておくと,以下のように3Dモデルが表示される.(plyファイルはStanford Bunnyを使用)
描画ウィンドウ上で左クリックや右クリックしてドラッグすると,視点の変化を行える.

f:id:whoopsidaisies:20131228123539p:plain

ply以外のファイル

上記コードの

using (var reader = new Kitware.VTK.vtkPLYReader())

のvtkPLYReaderの部分を変えてやると,ply以外の3Dモデルファイルも読み込める.以下に,その一例を示す.

  • vtkOBJReader … wavefrontのobjファイル
  • vtkSimplePointsReader … スペース区切りの3D点群データ
  • vtkParticleReader … カンマ区切りの3D点群データ

他にも様々な形式に対応している.

複数モデルの表示

複数のモデルファイルを読み込んで表示するサンプルを示す.以下のようにモデルの数だけActorを作ってやるとよい.

private void ShowMultipleModels()
{
    // objファイルからモデルを読み込んでActorを生成する
    var actor1 = ActorFromObjFile("model1.obj");
    var actor2 = ActorFromObjFile("model2.obj");
    var actor3 = ActorFromObjFile("model3.obj");

    // 描画ウィンドウにActorを追加する
    renderWindowControl1.RenderWindow.GetRenderers().GetFirstRenderer().AddActor(actor1);
    renderWindowControl1.RenderWindow.GetRenderers().GetFirstRenderer().AddActor(actor2);
    renderWindowControl1.RenderWindow.GetRenderers().GetFirstRenderer().AddActor(actor3);
}

private static Kitware.VTK.vtkActor ActorFromObjFile(string filename)
{
    var actor = new Kitware.VTK.vtkActor();
    using (var reader = new Kitware.VTK.vtkOBJReader())
    using (var mapper = new Kitware.VTK.vtkCompositePolyDataMapper())
    {
        reader.SetFileName(filename);
        mapper.SetInputConnection(reader.GetOutputPort());
        actor.SetMapper(mapper);
    }
    return actor;
}

ShowMultipleModelsを呼び出すと,以下のように3Dモデルが3つ表示される.(objファイルはPerfumeのグローバルサイトのデータを使用)

f:id:whoopsidaisies:20131228130248p:plain

その他

VTK/Examples - KitwarePublic
にサンプルコードが豊富に用意されている.