Houdiniで任意のオブジェクトと重なった範囲以外をリダクション

AECアドカレ2021 (AEC and Related Tech Advent Calendar) 18日目の記事です!
昨日は 石原さんの記事 でした。

概要

タイトルだけだと何をしたいのかわからなそうですが、こういう事です。

編集したいモデルAと、
リダクションしたくない範囲を覆う形状のモデルBを用意し、
Bの範囲外となるAのメッシュ部分のみリダクションする、という方法。

どんな時に役立つの

フォトグラメトリのモデルを整備する際はフォトグラメトリソフトとDCCツールとを何度も往復することとなるが、その度DCCツールで範囲を指定したり切り出ししたりしてからポリゴンリダクションし直さないとならないのがとても手間に感じ。

Houdiniを使用したこの方法を使う事で、事前にリダクションさせる範囲、またはさせない範囲を指定するオブジェクトを用意しておきこれを使い自動的にリダクションを実行させる事が可能に。

Houdiniは処理を行いたいたい対象のファイルを相対パスで指定しておく事ができるので、毎回FBXを読み込み直すという必要もないため、ポリゴンリダクションのリトライの工数が削減可能。

手順

対象がシンプルなモデルの場合(手法A)と、
フォトグラメトリモデルのようなハイポリで複雑なモデルの場合(手法B)と、
2つの手法を以下にまとめた。

手法A (形状がローポリでシンプルな場合)

ここでは分かりやすくトーラスとキューブで進める。

トーラスがポリゴンリダクション(PolyReduce)される側。
キューブと重なった部分以外がポリゴンリダクションされる。

2つのモデルを用意し Boolean に接続する。

OperationShatterPieces of A を選択。

今回はキューブと重なっていない部分を使用したいので[Output Primitve Groups]で[A Outside B]を有効にする。

Houdiniの[Group]とはCinema4D等のソフトで言うところの「選択範囲」イメージ。
キューブと重なっていない部分の選択範囲を作った。

続いて、[PolyReduce]を作成し、接続する。

[Perecnt To Keep]でリダクションの効かせ具合を調整する。

このままだとトーラス全体にポリゴンリダクションの効果が乗っているので、
[PolyReduce]の適応先として、前手順で作成したグループ[A Outoside B]を選択する。

これによってキューブと重なっていない部分のトーラスのポリゴンだけリダクション出来た。

以上。

ただし!

この方法は対象がシンプルな形状だった場合に限る様子。
ハイポリな複雑なモデルの場合、以下のようにリダクション範囲指定用キューブとの境界部分で小さな穴が空いてしまう事がある。

その場合は[Boolean]ではなく[Group]を使う事で解決した。
(ただし手数は少し増える)

次項の手法Bにその手順をまとめた。

手法B (複雑なハイポリモデルの場合)

ここでは分かりやすさのためフォトグラメトリで生成した地面に対してリダクションを行う。

ここへ範囲指定用のボックスを配置し、そのボックスと重なっていない部分にのみポリゴンリダクションをかける。

ここではボックス形状のFBXを使用しているが、複雑な形状の任意のモデルを使うことが出来る。
(どこをリダクションから除外したいかを事前にCinema4D等のソフトで検討し、範囲指定用のオブジェクトを用意しておく)

エリア指定用モデルが用意できたら、[Group]ノードを作成し、2つのモデルを接続する

この時[Group Node]は[Point]とし、
[Keep in Bounding Regions]を[Bouding Object(points or vertices only)]とする。

これによって接続した2つのモデルの重なった部分のポイントをGroupに登録出来る。

しかしリダクションするにはポイントではなくメッシュを選択しておく必要があるので、[Group promote]を使用する。

[Convert From]を[Point To Primitives]とする。
グループ(選択範囲)を点からメッシュに変換するの意。
※Houdiniではメッシュにあたるものを[Primitive]と言うので注意

Groupがメッシュに変換された。

この時のGroup名をメモしておく。
ここではデフォルトの[group1]

最後にポリゴンリダクションを行うので[PolyReduce]ノードを作成し接続する。

そのままだと前工程で用意した[group1]に対してリダクションが実行されるが、今回はこの範囲「以外」をリダクションしたいので、[!group1]というようにグループ名の前に半角の!を記入する。
これによってGroup(選択範囲)が反転する。

完成。

ボックスと重なっている部分「以外」がポリゴンリダクション出来た。

1度このHoudiniファイルを作ってしまえば以降は読み込ませるモデルを上書きで更新するだけでリダクションまで自動で実行してくれるので便利。