0.はじめに
今回はParaViewを使って以下のように、ポリゴン上から滑らかに繋がった領域だけを抽出するというのをやってみます。

1.フィルタのパイプライン
ParaViewの[Filter] -> [Alphabetical]から、以下の順番でポリゴンにフィルタをかけていきます。

2.GenerateSurfaceNormalsでポリゴンの面を分割する
GenerateSurfaceNormalsは、VTKのvtkPolyDataNormalsというフィルタと同じ機能を持つものです。
このフィルタは、基本的にはポリゴンの節点/要素に法線ベクトルを定義するというものなのですが、内蔵フラグをONにすることで色々なことができます。
内蔵フラグは以下になります。
| 内蔵フラグ | 機能 |
|---|---|
| Splitting |
Feature Angleで設定した角度(隣接する要素間のなす角度)で、つながった領域とそうでない領域を区別して分割する。 |
| Consistency | 法線の向きを整える。あべこべに法線が定義されているときなどに利用できる。 |
| Filp Normals | 全法線の向きを反転させる。 |
| Non-Manifold Traversal | Non-ManifoldEdges(3つ以上の要素のエッジが重なったときにできる線分)を処理の対象に含める。 |
| Conpute Cell Normals | 要素の法線ベクトルを求める。 |
| Piece Invariant | 使用するプロセッサーの数に関係なく同じ結果とする。 |
今回は、上記のフラグはデフォルト + Conpute Cell NormalsをONにして、Feature Angleを設定した後に [Apply] を選択します。

3.Connectivityで分割された面ごとにIDをつける
Connectivityは、VTKのvtkConnectivityFilterというフィルタと同じ機能を持つものです。
このフィルタは、重複節点のある点を境界として領域を区別して[要調査]、領域ごとに節点/要素単位でRegionId(整数)を振ってくれます。

4.Thresholdで特定のIDがついたポリゴンのみ抽出する
Thresholdは、VTKのvtkThresholdというフィルタと同じ機能を持つものです。
このフィルタを利用すると、設定した範囲の数値を持つ節点/要素のみを抽出することができます。今回はモデル上のKの面を抽出してみます。
まず、ビューアーの上の部分にある[Select Cells On (s)]を選択します。

その後、モデル上の抽出したい部分の一部をドラッグすると下図のように要素を選択できるので、
その状態で[Find data matching various criteria from the current source (v)]を選択します。

すると、Connectivityで付与したRegionIdがわかります。

この値をThresholdの[Minimum]と[Maximum]に入力して[Apply]を選択すると、以下のようにKの面だけ抽出できます。

5.他のポリゴンでもやってみる
曲率の大きい面が多いモデルでもちゃんと特定の面を抽出できます。

6.おわりに
3Dポリゴン上の滑らかに繋がった面だけを抽出するという処理をParaViewだけでやってみました。
ParaViewのフィルタは基本的にVTKで実装されているので、VTKライブラリを使ってC++やPythonなどでも同じ処理を記述できます。
また、今回の一連の作業はParaView上で[Tools] -> [Start Trace / Stop Trace]を利用すると、Pythonスクリプトにすることができるので、Pythonで同じことをしたいという方はそちらをご利用ください。
そのうち今回の方法で作った部分表面データと、以前の記事で紹介したソルバー間の連携に関しても書ければと思ってます。