2016-06-17

開口部のある3Dモデルのフットプリント

3Dモデル (ソリッド、サーフェス) を平面に投影することによって形成される2D幾何図形をフットプリント (footprint) と呼び、FME では、SurfaceFootprintReplacer トランスフォーマーによってソリッドやサーフェスをフットプリントに変換することができます (FME 2015.1 以降)。

ただし、現在のバージョン (FME 2016.1) では、上下方向に貫通する開口部がある3Dモデルについて、このトランスフォーマーによる変換後のフットプリントには、その開口部に対応する「穴」 (hole) が設けられないという機能上の制約があります。

将来、開口部に対応する穴を作成するように機能強化されるかも知れませんが、それを待たなくても、いくつかのトランスフォーマーを組み合わせて使用することによって、穴のあるフットプリントを作成することができます。

ここでは、「Esri Shapefile 形式による3Dモデルの保存」で使用した IFC データセットからフィーチャーをひとつ抽出し、それをフットプリント (開口部に対応する穴を含む) に変換するワークスペース例を掲げます。

ソースデータセット (IFC): DC_Riverside_Bldg-LOD_100.ifc

3Dモデルのデータ構造については「Esri Shapefile 形式による3Dモデルの保存」を参照してください。

FME 2016.1.0.1 build 16494

FMEワークスペース例














FME 2016.1 Workbench では、Canvas 上のオブジェクト間の接続ライン (connection) を非表示にすることや、接続ライン上にジャンクション (junction, 分岐・合流点) を設けることができるようになりました。ふたつのジャンクションの間を非表示にした部分をトンネル (tunnel) と呼び、接続ラインの右クリックメニュー > Create Tunnel によって作成することができます。








(テスト用ソリッドフィーチャーの抽出)
[IFC] リーダー: IFC データセットを読み込む。
Tester: テスト用のフィーチャーをひとつ抽出する (GlobalId = 1O62ieKrbD9fMT_ZiaQ9IA)。

(ソリッドのフットプリントへの変換)
2DForcer: ジオメトリを2D化する。
Deaggregator (Mode: Flatten All Levels): 集約ジオメトリを個別のジオメトリに分解する。
GeometryFilter: 面 (ポリゴンまたはドーナツ) のみを抽出する。
Dissolver: 隣接・重複する面を融合して単一の面にする。

IFC データセットから読み込まれたフィーチャーのジオメトリはソリッド (Solid) と Null で構成されている集約ジオメトリ (Aggregate) であり、これに 2DForcer を適用すると、ソリッドの部分が2D化されます (Null の部分には変更が加えられません)。

ソリッドを 2DForcer で2D化することによって得られるものは、「ソリッドの個々の面をそれぞれXY平面に投影することによって形成される複数のフットプリント (2Dジオメトリ) で構成される集約ジオメトリ」です。したがって、2DForcer が出力するフィーチャーは、「複数の2Dジオメトリで構成される集約ジオメトリ」と Null で構成される階層構造を持った集約ジオメトリを持つことになります。

これに含まれる個別の2Dジオメトリは、元のソリッドの上下の面をXY平面に投影した面 (この例では「穴」のある面=ドーナツ) と、垂直の壁面を投影したラインです。ソリッド全体のフットプリントとしてライン (垂直の壁面のフットプリント) は不要なので、Deaggregator によって個別のジオメトリに分解したうえで、GeometryFilter で面のみを抽出しました。階層構造を持った集約ジオメトリは、Deaggregator の Mode パラメーターを "Flatten All Levels" に設定することにより、全ての階層の個別のジオメトリに分解できます。

元のソリッドの上面と下面のフットプリントは重複しているので、Dissolver によってそれらを融合して単一の面にしました。これでソリッドのフットプリント (開口部に対応する穴を持つ) の完成です。

入力フィーチャーが複数ある場合は、Dissolver の Group By パラメーターで各フィーチャーを識別するための属性を指定すれば、元のフィーチャーごとに融合が行われます。そのような属性がない場合は、あらかじめ Counter によって連番を格納する属性を元のフィーチャーに付加しておき、それを ID 属性として使用することができます。

左: 元のソリッド, 右: フットプリント (上記ワークスペース例による変換結果)
どちらも FME Data Inspector によって表示したものです。











実は、Dissolver は、入力フィーチャーが集約ジオメトリを持っている場合は自動的に個別のジオメトリに分解し、面 (ポリゴンまたはドーナツ) のみを対象として処理を行います。したがって、上記ワークスペース例から Deaggregator と GeometryFilter を省いても同じ結果が得られます。









これを実行すると、ソリッドの垂直の壁面を2D化したラインや Null の部分は Dissolver の <Rejected> ポートから出力されるとともに、変換ログにいくつかの警告 (Warning) メッセージが出力されます。それらが処理結果に影響を与えることはありませんが、ジオメトリの変換過程を分かり易く表現するという意味では、Deaggregator, GeometryFilter を省略しないでおいた方が良いかも知れません。

補足: ソリッドの上側と下側がそれぞれ単一の面であり、かつ、全ての壁面が垂直である場合は、2DForcer -> Deaggregator -> GeometryFilter (Area) によって、ひとつのソリッドにつき、同じ形状・位置のフットプリントが2つ (元のソリッドの上下の面を投影した図形) 得られるので、Dissolver によってそれらを融合するのではなく、Sampler や DuplicateFilter などによってそのうちのひとつを選択する方法もあり、その方が効率が良いと予想します。

ワークスペース例で Dissolver を使ったのは、元のソリッドの上側、下側が複数の面で構成されている場合や壁面が垂直でない場合にも対応できるようにするためです。

例: 傾いた柱状のソリッドとそのフットプリント

0 件のコメント:

コメントを投稿