Curvatureを利用したモデリングについて解説していきます。

Curvatureの有効利用
今回はCurvatureを利用したプロシージャルモデリングを紹介します。Curvature、いわゆる「曲率」をモデリングにどう利用していくかをメインに解説していきたいと思います。
Curvatureは、シェーディングの際にエイジングなどで効果的に利用できるイメージがあります。しかしHoudiniの場合は、さらにモデリングにも落とし込むことが可能なので、他ではつくることが難しい表現でも比較的簡単に実現できてしまいます。ただし、取り入れることが難しいデータでもあり、有効活用となるとそれなりに利用範囲が狭まります。
そこで今回は、ステレオタイプな活用方法ではありますが、ジオメトリで作成することの少ない、ペイントの劣化を敢えてモデリングで作成してみようと思います。
通常はシェーディングやテクスチャで作成するものですが、それをジオメトリで作成することで、テクスチャでは表現しきれないディテールをつくることができます。ただし、それなりにヘビーなジオメトリになるため、あくまでも作例用と言うところに留まるかと思います。しかしこういったアプローチを引き出しに入れておくと、他でも応用を効かせやすいのではないでしょうか。
01 Crack Flow
ひび割れのベースを作成します。

まずはベースメッシュ【A】【1】を準備して、それに対してCurvatureの計算をしていきます。VDB from Polygon SOP【B】を使用してVDBに変換し、VDB Anarysis SOP【C】を使って、Curvatureを分析します【2】【3】。



今回は閉じられたソリッドなジオメトリを前提として作成していきますが、もしそうでない場合はCurvatureの計算方法を変えていくのも良いかと思います。例えば、Houdiniでは、Measure SOPを使用してCurvatureを計算することもできます。VDBから作成する場合は、VDBの分割によって分析のディテールが変わるため、ぼかした感じで使用する際には、楽に値を取ることが可能です。
作成したCurvatureはそのまま使用できないので、ジオメトリにAttribute from Volume SOP【D】を使用してCurvatureのAttributeを移行します【4】。

このAttributeをWrangleなど【E】で数値をネガティブにします。続いて、Curvatureの値から、最小値と最大値を抜き出します。この際、Attribute Promote SOP【F】を使用することで、簡単に抜き出すことが可能です【5】。

この値それぞれを使用して、Wrangle【G】を使って、CurvatureをConvexとConcaveの凸凹をそれぞれに使いやすい値に変換しておきます【6】。

さらに、Attribute Blur SOP【H】を使用して、Curvatureそれぞれにブラーをかけて使いやすい分布に調整します。これでCurvatureの下準備が完了です【7】。

使いやすい数値にあらかじめ調整しておくことで、後々のフローで値を微調整しながら使用することが容易になります。
次に、ひび割れのジオメトリを準備します。まず、Rest Position SOP【I】を使って現状のPointのPositionをスタックして、Normal【J】を作成しておきます。次に、VOP【K】を使って細かいNoise Deformをかけます。
ConvexityのAttributeをWrangle【L】でRampなどを使用して再度値を調整し、Scatter SOP【M】でとがっている部分にPointを作成します【8】。

これを使ってVoronoi SOP【N】で表面だけを分割します。この際に、Create Interior Surfacesのチェックを外しておけば、内部にジオメトリが作成されません。Wrangle【O】で"rest"の値をPositionに代入して元の形状に戻します。こうすることで、直線的なVoronoiの分割にノイズを加えることが可能になります【9】。

下準備として、分割でできたクラックのエッジにGroup【P】を作成してキャッシュを取り【Q】、準備完了です【10】。

02 Crack Detail
ひび割れのディテールを追加します。

ひび割れのパーツにそれぞれディテールをつけていくため下準備をします。まず、エッジに対してAttributeを作成します。前項で作成したGroupを使ってAttriuteをつくり【A】、それにBlur【B】をかけます【1】。

続いて、パーツそれぞれに対してConnectivity SOP【C】を使って"id"を作成します。
次に、Attribute Promote SOP【D】を使って、"convexity”のAttributeからAverageの値を作成し、それを"id"ごとに行います【2】【3】。


この平均の値から、パーツを切り分けるために、Group Expression SOP【E】で、平均値がある一定の値より大きいところ、すなわち、とがっている部分のみを抽出し、Split SOP【F】で切り分けて作業を軽量化します。

ディテールをつけていきます。切り分けたConvexのパーツに対し、必要であればさらに切り分け、細分化しながら進めていきます【G】。完全にとがっている部分のパーツは削除してしまって、露出している下地などをつくった方がエイジングが良く見えたりもするので、そういった場合にも同様に、Group Expression SOP【H】で平均値が高いもののみをBlast SOP【I】で削除してしまいます。
次に、For【J】を使って、パーツごとにディテールをつけていきます。今回は手順を簡単にするために、ポリゴン数は膨大になりますが、容易にディテールをつけることができるアプローチを選択しています。
まず、Remesh SOP【K】でパーツを細かく分割し【4】、Attribute Blur SOP【L】を使って、EdgeのAttriuteをさらにぼかします。この際に、"convexity”のAttributeをWeightにすることで、ボケ足を調整します【5】。


その"edge"と"convexity”をWrangle【M】でかけ合わせて、"shrink"というAttributeを作成します。"shrink"をAttribute Promote SOP【N】を使って、最大値からPrimitive Attriubuteに変換します【6】。
Delete SOP【O】で"shrink"が一定値以上の場合にPrimitiveを削除することで、はげ落ちた際に隙間ができるようにします。Primitiveを削除したことで崩れた"edge"のAttributeを再度、同等の手順で作成し直しておきます【P】【7】。
VOP【Q】を使って、パーツのめくれ上がりの表現を作成します。Noise【R】を使って、パーツごとにランダムなOffsetをつけて【S】、"convexity”と"edge"の値が高い箇所【T】にのみ、Displace Along Normal VOP【U】でもち上げます。その際に、単純に法線方向にもち上げるのではなく、少し内側に入るような法線【V】を使用するとよりめくれ感を演出することが可能です【8】。
もっと複雑な計算をすれば、きちんとカールした表現なども可能ですが、今回のような構図であれば、この程度の表現でも十分と考えています。


Forの外に出たら必要に応じてClean SOP【W】などで、余分なデータを削除すると、きれいなデータに仕上がります。
切り分けたパーツをMerge【X】で元に戻し、Normal【Y】で法線を再度計算し直したキャッシュを取り【Z】完成です。
これでペイントが捲れ上がったようなジオメトリを作成することができました【9】。後は、下地になる元のサーフェスを少しPeak SOPなどで縮小させて同時にレンダリングすれば完成となります【10】。


03 Operators
●Measure SOP

今回はVDBを使った分析結果を使用したCurvatureの作成アプローチを紹介しましたが、HoudiniにはMeasure SOPという、強力な計測ツールが存在します。このオペレータの歴史は古く、かなり以前からこういった計測が可能でした。ただ、Curvatureは比較的最近になってから追加された機能で、これまでは曲率を計算するために割と難しいアプローチや、力業を必要としていました。
Measure SOPにはCurvature以外にも重宝する計測機能が満載で、このオペレータを駆使すればHoudiniならではの表現が可能になります。
ほかのツールでは難しい、細部に渡る表現を可能にしたり、プロシージャルモデリングの際に自動化を図るためには、切っても切れない素晴らしいオペレータと言えます。
筆者も大好きなオペレータの1つとして、非常に使用頻度の高いものになっており、まだあまり活用したことがないという方には、ぜひオススメしたいです。
秋元純一 / Junichi Akimoto(トランジスタ・スタジオ/取締役副社長)
日本でも指折りのHoudini アーティスト。アーティスト業務の傍ら、Houdiniアーティスト育成や布教活動に勤しむ
www.transistorstudio.co.jp
blog.junichiakimoto.com
TEXT_秋元純一 / Junichi Akimoto
EDIT_山田桃子 / Momoko Yamada