【Houdini】UV Layout SOPでジオメトリを綺麗に敷き詰めてモーフさせる

これを作るよ.

目次

はじめに

大まかな流れは目次の通り.
プロジェクトファイルはこちら
細かい説明は割愛するのでファイルを見てね.なおMOPsを使用しているのでファイルを見たい人は導入してね
全体像は以下

2021-05-29T144430
2021-05-29T144430

ピースとガイドジオメトリを用意

ピースとなるジオメトリをFontで用意する.
原点に適当に点を作ってAttribute Randomizeでpscaleとorientを散らす.
できればA~Zを個別に作りたかったけど,方法がわからなかったのでFontのTextにA~Zをそのまま打ち込んだ.

2021-05-29T144528
2021-05-29T144528

その後Connectivityで文字ごとにピースを分け,着色したりAssembleでピースごとにパックしたりする.

2021-05-29T144657
2021-05-29T144657

今回ガイドジオメトリにもFontを使用したが,平たいものなら何でも大丈夫.

2021-05-29T144733
2021-05-29T144733

UV Layoutでピースを敷き詰める

UV Layoutは本来はその名の通りUVをきれいに敷き詰めるSOPだが,応用すると平たいサーフェスにも敷き詰められる.

2021-05-29T145706
2021-05-29T145706

設定項目はこんな感じ.ピースジオメトリとガイドジオメトリを接続し,Islands To PackのUV AttributeとTargetsのUV AttributeにPを設定し,Pack IntoをIslands From Second Inputにするとガイドジオメトリの中にピースジオメトリが敷き詰められる.
Island Rotation StepやIterarionsなどを変更し望む絵が得られるよう調整する.

2021-05-29T150151
2021-05-29T150151

本機能について詳しく知りたい人はEntagma氏のチュートリアルを参照.

Extract Transformでトランスフォーム情報を取得

Extract Transformは同じ形状の2つのジオメトリを比較し,どう変形したか(トランスフォーム情報)を返すノード.
Connectivityで設定したPiece Attributeを指定するとピースごとにトランスフォーム情報を持ったポイントが得られる.

2021-05-29T151150
2021-05-29T151150

2021-05-29T151205
2021-05-29T151205

ちなみにここで得られたポイントとピースを後に使うTransform Piecesに接続するとUV Layoutで敷き詰めた状態が復元され,正しくポイントにトランスフォーム情報が入っていることがわかる.

2021-05-29T151547
2021-05-29T151547

Blend ShapesやCHOPで各状態をモーフ

上記工程で得られたBetter Harder Strongerの3つの文字をモーフさせる.
先にBlend Shapesについて説明すると,Primitive ID AttributeにConnectivityで設定したclassを指定することで同一ピース文字間のモーフが可能になる.

blendShapes
blendShapes

今回は文字の端から遷移していく動きを作るにあたり,無料のSideFX公式(?)ツールのMOPsを用いた.無くても作れそうだけどこれ使ったほうが個人的に楽.

MOPs Shape Falloffで左から0→1と変化するフォールオフアトリビュートを作成する.
PreView Falloffにチェックすると色でフォールオフを確認できる.

2021-05-29T153737
2021-05-29T153737

その後Transformで各文字をいい感じの位置に移動させる.

2021-05-29T155103
2021-05-29T155103

これをモーフ後のポイント群として使いたいため,モーフ前のポイント群にAttribute Copyで転送する.
このときにMOPs Shape Falloffで生成されるi@idも一緒に転送しておかないと後のMOPs Delayで正常に動作しないので注意.

2021-05-29T154301
2021-05-29T154301

Blend Shapeのblend値にキーフレームを打ってMOPs Dedayを見るとBetter→Harderに左から文字が組み上がっている.
これは右側のほうがフォールオフ値が大きく動きが遅延しているため.

以上のモーフをBetter→Harder/Harder→Stronger/Stronger→Betterの3つ作る.(といっても残り2つはコピペするだけ)
3つのモーフを繋げるためにCHOPsを使用する.

2021-05-29T160553
2021-05-29T160553

ジオメトリの情報をCHOPに持ってくるためにはGeometry CHOPを用いる.
GeometryでSOP階層のインポート元を指定し,P orient pscaleを持ってくる.
Trimでそれぞれチャンネルをモーフの始まりから終わりまでに切ってSequenceでその3つのチャンネルを1つに直列に繋げ,Cycleで動きをループさせる.
Sequenceについてはこのサンプルがわかりやすい.

2021-05-29T160439
2021-05-29T160439

2021-05-29T160747
2021-05-29T160747

ChannelでCHOPのチャンネルをSOPで参照できる.
Geometry, Channel共にMethodをAnimatedにしないと動いているチャンネルは正常に処理できないので注意.

2021-05-29T161639
2021-05-29T161639

Transform Piecesでピースを復元

Transform Piecesに動かしたいジオメトリ(ここでは小さい文字)とテンプレートポイントを接続し,マッチングさせるアトリビュート(ここではclass)を指定すると,一致するアトリビュートを持ったジオメトリがポイント上にトランスフォームする.

2021-05-29T163030
2021-05-29T163030

前述したが,ピース文字はそれぞれAssembleでパックしたほうが処理が早い.

2021-05-29T163355
2021-05-29T163355

Time Shiftで位相をずらして合成

TimeShiftで適当にモーフィングをオフセットして元とマージすればジオメトリは出来上がり.

2021-05-29T163530
2021-05-29T163530

2021-05-29T163618
2021-05-29T163618

マテリアルとレンダリング

ライティングの影響を受けないようにするためにConstantマテリアルを背景と文字に割り当てる.
プロパティはデフォルトのまま.

2021-05-29T163906
2021-05-29T163906

2021-05-29T172050
2021-05-29T172050

ビューポートの絵面をそのままレンダリングしたいときはOpenGL ROPを使う.
レンダリングしてみると色味が変わってしまったときはおそらくACES(OpenColorIO)かガンマ値が悪さしているのでビューやレンダラの設定を見てみると良い.

おわりに

UV Layout SOPは色々使えそうで夢が広がるのでよい.

参考・関連文献