*[[閉じた面でクリップする]] [#uc8c5caf]

可視化ソフトウェア[[ParaView:http://www.paraview.org]]において、"Programmable Filter"を使用して、任意の閉じた面で形状をクリップする方法を説明します。

通常、ParaViewでのクリップ機能は、Clip filterを使用しますが、クリップするタイプは
- Plane(面)
- Box(直方体)
- Sphere(球体)
- Cylinder(円柱)
- Scalar(スカラー値)

しか用意されておらず、形状を任意の閉じた面でクリップすることは出来ません。

任意の閉じた面でクリップするには、"Programmable Filter"を使用する必要があります。

ここでは、メニューバーのSourcesにあるWavelet(画像データ)を、Superquadric(超二次関数、閉じたポリゴンデータになる)で切り取る例で説明します。

**Waveletソースの作成 [#pc008bb8]

メニューバーの

  Sources >> Wavelet

と進み、そのままの設定で、"Apply"しますと、各点にwavelet値を計算した3次元の画像データが作成されます。表示を"Surface"にし、色付けの変数を"RTData"にすれば、waveletのコンターを見ることができます。

#ref(wavelet.png,center,nowrap,30%,wavelet);

**Superquadricソースの作成 [#a7abf642]

次に、Superquadricソースを作成します。メニューバーから

  sources >> superquadric

と進み、

  Scale: 15 15 15

とし、"Apply"します。Waveletの表示を"Outline"にすると、waveletソース内に収まったsuperquadricソースであるトーラス形状が見えます。

#ref(superquadric.png,center,nowrap,30%,superquadric);

**Programmable Filter [#n6b164bb]

上記で作成した、Waveletソースをトーラスで切り取ります。

まず、Ctrlキーを押しながら、Pipeline Browserで
  1.Wavelet1
  2.Superquadric1
の順に左クリックで選択します。選択されると、名前の背景が濃い青色になります。(選択する順番が大事です)

選択された状態で

  Filters >> Alphabetical >> Programmable Filter

と進みます。

#ref(programmable_filter.png,center,nowrap,30%,programmable filter);

次に、Programmable FilerのPropertiesタブで

  Output Data Set Type: VtkUnstructuredGrid

に変更します。これは、Clipで作成されるデータタイプである"VtkUnstructuredGrid"を指定する必要があります。次に、"Script"に以下を記述します。

#code(python){{
import vtk.vtkPVVTKExtensionsDefault as ext

inpMain = self.GetInputDataObject(0, 0)
inpClip = self.GetInputDataObject(0, 1)
out = self.GetOutput()

clipper = ext.vtkPVMetaClipDataSet()
clipper.SetInputDataObject(inpMain)
clipper.SetInsideOut(True)
clipFunction = vtk.vtkImplicitPolyDataDistance()
clipFunction.SetInput(inpClip)
clipper.SetClipFunction(clipFunction)
clipper.Update()

outData = clipper.GetOutputDataObject(0)
out.DeepCopy(outData)
}}

そして、"Apply"すると、Waveletをトーラスで切り取った、形状が現れます。

#ref(clipping_torus.png,center,nowrap,30%,clipping torus);

このトーラスはWaveletを切り取っているので、中身が詰まっていることに注意しましょう。実際、これを"Clip Filter"で切り取ると中身が詰まっていることを確認できます。

#ref(clipping_torus2.png,center,nowrap,30%,clipping torus);

また、切り取る領域を逆にしたい場合は、"Script"内で

  clipper.SetInsideOut(False)

と変更し、"Apply"します。結果をさらに"Clip Filter"で切り取るとWaveletの内部がトーラス上に切り取られていることを確認できます。

#ref(clipped_wavelet.png,center,nowrap,30%,clipped wavelet);

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS