【Houdini】雨表現Flipbookツールを作ってみよう

こんにちは!田中です。
最近帰り道で散歩している犬を見かけるとついつい凝視してしまいます。いきものは心身の健康にとてもいいですね。コーギーに目がありません。

今回はブログ初のHoudiniの記事になります。
Houdini慣れてきたかなという方向けに、仕組みを作る面白さを共有したいということで
Houdini20で追加されたRippleSolverのシンプル版のような仕組みを作り、下の動画のような雨表現を作りたいと思います。ミニチュア世界っぽいですね。

以下の雨表現のループは綺麗になるように、高速に動くHoudini特有の言語「VEX」を使って独自実装しています。
この雨表現は、パラパラ漫画のように再生できる「Flipbook」ノーマルテクスチャをHoudiniで作成し、UE5で再生をしているものです。
周りの植物はMegascanから使用しました。

 

目次

 

シーン作成環境

Houdini 20.5278
UE5.4.2

 

Houdiniというソフト

ゲームなどのコンテンツ開発が大規模化するにあたって、Houdiniというソフト名をチラホラいろんな場所でお聞きしたことがある方は多いとは思いますが、このソフトについて簡単に説明します。
Houdiniはプロシージャルに特化していて、ノードベースでいろんな仕組みが作れるソフトです。
元々は映像系のVFXでよく使われていたらしいですが、近年HoudiniEngineやPDGなどの便利な仕組みも追加され、ゲーム開発にも活用された事例が多く見られるようになりました。
ゲーム開発向けのSideFXLabsというSideFXの人たちが作成された便利なツールキットの中にゲーム向けのものも多く追加されてきている点も嬉しいですね。

もしHoudiniをやったことがないけど気になるな~とご興味のある方は、SideFXのさつき先生の「ゼロから始めるHoudini講座」の動画がとても分かりやすいので学習におすすめです。

 

配布Hipファイルの中身

サンプルHipシーンはbootからDLをお願いします
今回はできるだけシミュレーション系を実行する便利ノードに頼らず仕組みを作りたかったので、「SolverSOP」というノードを使い、パーティクル生成などを制御するpopnetと同じ仕組みを作成して雨表現を作っています。
なお、今回は一部SideFXLabツールを使用しているため、使用できる環境にセットアップをお願いします!
参考:SideFXLabsのインストール方法

まずHipファイルを開くとobj階層に以下の2つのノードがあり、説明に分けて作成しています。
以下のサンプルの両方でSolverSOPを使用しています。

    ・Solver_sample Geoノード - SolverSOPの簡単な作例
    ・Ripple_GEO Geoノード – 雨表現作例

 

SolverSOPノードについて

Houdiniにはシミュレーション系を実行するSolverノードはいくつかありますが、このSolverSOPというものは、現在のフレームより前のフレーム状態を加算して色々な仕組みが作れる面白いノードです。
使い方としては、SolverSOP中に入って作りたい機能を作ります。

はじめにobj階層の「Solver_sample」GeoノードをダブルクリックしてSop階層に入ります。
Sop階層には2つの簡単なSolverSOPを使った作例を用意しています。

「add_point」の作例

緑の方の「add_point」の作例を見ていきましょう。「OUT_add_point」ノードにディスプレイフラグ(青いフラグ)をオンにしタイムフレームを再生すると、だんだん配置したポイントが積もっていくのが確認できると思います。

scatterノードでは、毎フレームにSeed値を切り替えて10個のポイント数を入力グリッド平面に配置しています。
Global Seedに@Frameアトリビュートという、フレーム数を表すHoudiniが認識しているアトリビュートを設定すると、フレーム毎に配置が変わります。

配置したポイントが積もる表現を行っているのが下のSolverSOP「solver1」ノードです。
ダブルクリックして中に入ると「Prev_Frame」ノードと「Input_1」ノードをマージしているだけです。
「Input_1」「Input_2」「Input_3」「Input_4」はSolverSOPの各入力番号に対応します。

「Prev_Frame」ノードは1フレーム前の結果を表すノードです。
そのフレームまでの計算結果を「Prev_Frame」ノードとして保持しておき、Input_1ノードの入力としてポイントを新規でドンドン足しているということになります。
4Fの時のSolverSOPの結果は以下のように、3Fまでの結果と4Fめの入力が足されているという感じですね。

 

「trail_sample」の作例

続いてもう1つのピンクの方のサンプル「trail_sample」を見てみましょう。
「OUT_leave_shape」ノードにディスプレイフラグをオンにしタイムフレームを再生すると、
球の形状に合わせてくぼんだ後、元の平面に戻る表現が確認できます。

こちらの表現は@Cdの値を0に設定した真っ黒の平面に、@Cdの値を1に設定した真っ白の球の色を「AttributeTransfer」ノードで@Cdを転写することによってマスク情報を作成しています。
@CdはHoudiniが色と認識するアトリビュートです。通常はRGBを管理する3つの値を持つVector型ですが、float型の値とすると0~1の値となるので白黒の見た目となります。

SolverSOPでは、
(1)1F前の結果に対して、入力の白黒の結果を加算しつつ、
(2)1Fごとにすべての@Cdの値を0.1ずつ減らし、黒へ減衰させていく処理をしています。

「switch_solver」ノードの値を0,1で切り替えてみると、SolverSOPで結果が足されている効果が分かりますね。
最後に「attribwrangle1」ノードで、@Cdの値に応じてY軸方向に凹ませることでこの表現が作成できます。
2つの作例を見ていきましたがSolverSOPノードは前回の結果を加算してくれる処理をするので、カスタムシミュレーションなど色々な仕組みを作れそうなことがわかりますね!

 

Ripple Geoの中身について

続いて本題のRipple Geoの中身である、雨表現ツール(Rippleツール)のサンプルの構造について紹介します。
サンプルの構造の流れとしては、簡単にまとめると以下になります。

(1)雨の波紋の円形ジオメトリを作成
(2)@Cd=0の黒い平面に波紋ジオメトリの@Cdを転写
(3)波紋@Cdアニメーションをループ処理
(4)@Cdから波紋形状を作成

以下内容についての説明です。

1.雨の波紋の円形ジオメトリを作成

この項目では、雨模様の波紋形状を作成しています。
scatterノードでは各フレームごとにランダムに点を生成します。先ほどの作例「add_point」と同じですね。
SolverSOP「solver1」ノードでは、隣のpopnetと同じ処理をしています。

SolverSOPの内部処理では、微小時間(delta_time)を各フレームの結果に加算し、@timeが@lifeを超えると点を削除する処理をしています。
そして、SolverSOPで加算された@timeを参照して、CopyToPointノードで複製時に大きさを設定してくれる特別なアトリビュート「@pscale」に設定しています。

@timeは@lifeを超えないため、@Cdは0~1の間に収束します。これは後の波紋形状生成に使用しています。
アトリビュートを0~1の範囲に収めておくと、掛け算やRampで値をリマップするときなどにコントロールしやすいため、私はよくこの範囲に収めることが多いです。

次に最初のフレームから再生すると、まっさらな状態からポツポツ降る感じなってしまうので、ループのためにtimeshiftノードで50Fずらします。
CopyToPointノードでは、配置ポイントの@pscaleと@Cdアトリビュートを反映して円ジオメトリを複製します。

CopyToPointノードにディスプレイフラグをオンにして、処理を確認すると、点が生成されてから@lifeまでの間に円が拡大され、白から黒に変化していることが確認できます。
この白黒の値は(4)の波紋の高さに活用しています。

2.Cd=0の黒い平面に波紋ジオメトリのCdを転写

次にAttributeTransferノードでは、@Cd=0の黒平面に、(1)の円ジオメトリの@Cdを転写して@Cdのアニメーションを作成しています。
この時はまだループ処理ができていません。今回のケースのFlipbookアニメーションではループ処理をすることが必須であるため、次の処理(3)でループ処理を実装しています。

3.波紋Cdアニメーションをループ処理

ここは少し強引なやり方ですが、リニアに@Cdの値を遷移させて波紋アニメーションをループさせています。
SideFXLabsには「Labs MakeLoop」ノードというループを作成するための便利なノードが用意されていますが、今回のケースでは上手くいかなかったため自前で実装しています。

このループ処理実装を簡単に説明します。
以下のようにタイムフレームの値に応じて@Cdの値をとるとします。開始フレームと終了フレームの@Cd値が一致していないためループになっていない状態です。

次に半分のフレームを基準に前後のフレームを入れ替えます。この操作はTimeShiftノードで行っています。こうすることで開始フレームと終了フレームの@Cd値が一致します。
ただし、依然入れ替えただけなのでフレームの中間ブツっと切れるようにまだループ処理ができていません。

最後にフレームの中間に遷移フレーム(Transition Frame)を用意し、その間をつなぐようにリニア補完することでループを作成しています。

4.Cdから波紋形状を作成

「wave」Wrangleノードは、@Cdから波紋形状を作成しています。
高校数学で見たことある人も多いと思いますが、sinの周期は2π毎に同じ形がループします。

@Cdは0~1の範囲で収まっており、これに$PI(数学の円周率πを意味します)を掛け算すると、0~πの値に代わります。先ほど@Cdを0~1にしていたおかげで好きなサイズに拡縮できるわけです。これを活用して波形状を作成します。
波形形状は、振幅・振動数で変更することが可能です。振幅は波の大きさをコントロールし、振動数は波の細かさを変更します。
波形をコントロールするサンプルは「sine_curve」の中にあります。
下の「intensity_wave」では、@Cdの値をコントロールできるようにしています。rampは0~1の値でカーブの形に添って再設定して返してくれるため、微調整に活用しやすいです。
こちらのサンプルのパラメーターを動かしてみて、波形形状ってコントロールできるんだな~とご確認頂ければと思います!


この波形を作る計算をもとに、「wave」AttributeWrangleで@Cdの値に応じて波形のジオメトリを生成します。

 

Rippleツールの使い方について

Ripple表現のパラメーターは以下になります。
私個人としては1か所のNullにパラメーターをまとめた方が管理しやすいため、こちらのParameter Nullノードにすべてのパラメーターをまとめています。動作確認をする場合はこのパラメーターを動かしてみてください。

Houdiniでは、カスタムで設定したパラメーターとリンクしているノードを可視化するには、
「View > Show for Selected Nodes」にチェックを入れます。
チェックを入れた後、Parameter Nullノードを選択すると、リンクしているノードに対してオレンジのラインで表示されます。
上記のパラメーターがどのノードと接続されているか確認するのに使ってみてください!

パラメーターを設定した後、「maps_baker_1」ノードからFlipbookテクスチャへの合成に使う連番ノーマルテクスチャを書き出します。
この「Labs Maps Baker」ノードはSideFXLabツールです。
ハイポリモデルジオメトリから、ポリゴン数を削減したローポリモデルへ適用するためのノーマルテクスチャをベイクできるとても便利なツールです!
書き出し先は「Output Directory」のラベル上で、マウスの中クリックボタンを押すと確認できます。
書き出し先はHipファイルの置いているディレクトリ直下に「render/temp」フォルダを作成し、そこに連番ノーマルテクスチャを書き出します。
Renderボタンを押して、連番ノーマルマップを書き出してください。

連番テクスチャを書き出した後、「Cop2net1」ノードにダブルクリックをして中に入ります。

Houdini20.5で、ノードベースでテクスチャが作成できる「Copernics」という強力な機能が入りましたが、未だベータ版となっています。
連番テクスチャを1つのFlipbookテクスチャにまとめる機能が未だCopernics内のノードでは上手く動作しなかったため(今後のアップデートに期待ですね!)
旧来のCOPのノードである「Cop Network-old」の「Mosaic」ノードを使用しています。

Cop Network-oldでは画像系データの編集が行えます。内部では上から順に以下の処理を行っています。
(1)Fileノードから連番ノーマルマップを読み込みます
(2)Mosaicノードで連番ノーマルマップを1つのFlipbookテクスチャにまとめます
(3)Rop File OutputノードでFlipbookテクスチャを指定の場所に出力します。

Renderボタンを押した後、Hipファイルを置いているディレクトリ直下の「render」フォルダにFlipbookテクスチャを出力します。

 

UE5でFlipbookマテリアルを作成し、雨の波紋を再生する

UE5でFlipbookマテリアルを設定します。
今回は、UE5.4.2を使用しました。

はじめにUEエディタにおいて、Contents BrowserからFlipbook用のマテリアルを作成します。
また先ほど出力したFlipbookノーマルテクスチャをUEにインポートしてください。

マテリアルエディター上で、FlipBookでコマ送り再生をするには「FlipBook」関数を作成し、以下のように接続します。
Flipbookテクスチャの行・列数については、HoudiniのFlip Countパラメーターで設定した値の平方根の値(ルートの値)を入れてください。
今回はFlip Countを36で設定してテクスチャを書き出したので、row, columnともに6に設定しています。

マテリアルの接続が完了したら一度保存し、平面メッシュに先ほど作成したマテリアルを設定してください。
このように雨の波紋がループで再生されれば完了です!

ここまでできたらお好みで水面マテリアルをカスタマイズして水の質感に見えるように調整してみてください。
冒頭でもお見せした以下の完成例では、簡単に風による流れや反射表現などを入れています!

ここまで読んでいただきありがとうございました!
Houdiniでは自分で考えた処理をVEXなどを使って気軽に試せるので、個人的にはとても気に入っています。
時々ボーっとしててふと思いついたことを、試すこともあったりして日々の趣味的にも楽しいです。
この記事のサンプルも風呂に入っている間に思いついたものだったりします(チョット荒い部分もありますけども…)

HoudiniではApprentice(無料版)があり、やったことないけど興味あるなーという方も気軽に始められます。
皆さんもよいHoudiniライフを!

tanaka rika

新卒からTAになりました。MayaのツールとHoudini関連の仕事をしています。
フェレットと暮らして10幾年。動物かわいいフェレットかわいい。

投稿者記事

  1. 【Maya】cmdsから実行できる!?
    結構便利なRuntimeCommand

    2024-08-05

  2. 【Maya】DCCツールを作ってみよう -入門編-

    2024-01-26

関連記事

  1. 【Maya】純粋なtransformノードだけ取得したい!

    2024-10-29

  2. 【SVN】『SVNのクリーンアップできない』で良くあること

    2019-09-17

  3. 【Maya】AutodeskDay2024 Additional Time

    2024-09-24

  4. 【Maya】コントローラーの一時的なワールド挙動化

    2019-05-28

スキルレーダーチャート

テクニカルアーティスト専用
スキルレーダーチャート
どなたでも無料でご利用いただけます。

ABOUT

TECH COYOTE​

テクニカルアーティストの為のまとめサイトです。​
本サイトでは、ツール開発、業務効率化等について情報発信をしていきます。

COYOTE 3DCG STUDIO

C&R Creative Studios

難易度別

RECENT TWEET

ページ上部へ戻る