読者です 読者をやめる 読者になる 読者になる

C#で地球を表示する(vtkTexturedSphereSourceによる方法)

VTKのvtkTexturedSphereSourceで球に世界地図のテクスチャを貼り付けることで地球を表示させる.

テクスチャを使わずにvtkEarthSourceによって表示する方法は以下のページを参照.
C#で地球を表示する(VTKのEarthSourceによる方法) - whoopsidaisies's diary

ActiViz

ActiVizは,3Dコンピュータグラフィックスの可視化ライブラリVTK(The Visualization ToolKit)のC#ラッパである.NuGetからインストールできる.簡単な解説は以下のページを参照.
C#で3Dモデル表示(VTKのC#ラッパActiVizによる方法) - whoopsidaisies's diary

RenderWindowControl

NuGetからActiVizをインストールし,RenderWindowControlをフォームに追加する.

vtkTexturedSphereSource

VTKにはvtkTexturedSphereSourceという,テクスチャを貼り付けることが出来る球オブジェクトのクラスがあるためそれを利用する.ソースコードは以下のようになる.

sing (var sphere = new Kitware.VTK.vtkTexturedSphereSource())
using (var texture = new Kitware.VTK.vtkTexture())
using (var image = new Kitware.VTK.vtkPNGReader())
using (var mapper = new Kitware.VTK.vtkCompositePolyDataMapper())
using (var actor = new Kitware.VTK.vtkActor())
{
    // 球の滑らかさ(数字が多いほど分割数が多く滑らかになる)
    sphere.SetThetaResolution(64);
    sphere.SetPhiResolution(64);
    mapper.SetInputConnection(sphere.GetOutputPort());
    actor.SetMapper(mapper);

    // 世界地図画像の読み込みとテクスチャの設定
    image.SetFileName(@"WorldMap_ja.png");
    texture.SetInputConnection(image.GetOutputPort());                
    actor.SetTexture(texture);

    renderWindowControl1.RenderWindow.GetRenderers().GetFirstRenderer().AddActor(actor);
}

実行すると以下のように地球が表示される.世界地図画像はウィキペディアにあったものを使った.

f:id:whoopsidaisies:20140209202615p:plain

以下のように拡大表示もできるが,この方法だとベクターグラフィックの読み込みが(たぶん)できないので拡大表示する際は何かしら工夫が必要そう.

f:id:whoopsidaisies:20140209203055p:plain