Houdini20.5 のCOPは色々便利なんですが、現在他のソフトでできないことだと思うのはこのサンプルなんですよね。
つまりパーティクル等のシミュレーションをそのままテクスチャ作成できるんです。
まずは、上記のシーンファイルをダウンロードして開いてみましょう。
https://www.sidefx.com/contentlibrary/wetmap-tears/
このファイルでは、POPでパーティクルシミュレーションが行われ、顔の形状にそって粒が落ちていきます。
トレイルを作成します。
半径等も時間で変化するように設定し、VDBに変換します。
つまり好きなようにシミュレーションすることができる(VDBに変換できればなんでもOK)
→つまり、テクスチャを作成するジオメトリの素材によって変化するテクスチャ(水が顔ならしたたるし、Tシャツならじわじわしみ込んで広がる)ようなことをシミュレーションで作成できるってことですよね!
このVDBをCOPにもってきます。
まずはSOP Importでジオメトリを持ってきます。
今回のCOPではジオメトリをリアルタイムにラスタライズできます!
ここでいったんUV状態にして
ジオメトリをレイヤーにラスタライズします。また、任意のアトリビュートをラスタライズすることもできます。
3つの情報をラスタライズしています。
intrinsic:alphaは、どのピクセルがジオメトリに当たるかを保存。
origPはワールドポジションでの元の位置を保存しています。
このOpenCLスクリプトでは、VDBボリュームからサンプリングして、その結果を別のデータに格納する処理が行われています。
COPのOpenCLでは、まずSignatureで入出力を定義し
@KERNEL
ブロック内で、VDBボリュームデータからサンプルを取得し、その結果を別のレイヤーに格納するカーネル(GPU上で実行されるプログラム)が定義されています。
float3 worldpos = @src.xyz;: @srcレイヤーのx, y, z成分を取り出して、ワールド座標worldposに代入しています。この座標は、VDBボリューム上の位置情報として使用されます。
float sample = @surface.worldSample(worldpos);: @surface(sweatvdbとしてバインドされたVDBデータ)から、worldposでサンプリングを行い、その結果をsampleに格納しています。worldSample()は指定したワールド座標でVDBから値を取得する関数です。
@dst.set(sample);: 最後に、サンプリングした結果を@dstに保存します。@dstは、バインドされた出力レイヤーで、ここにVDBから得られたサンプル値が書き込まれます。
これで汗の流れをUV上に画像として生成できます。
フレームを動かせば、汗の流れにそって白黒のマスクも変化します。
次に、マスクを拡大してぼかしを加えます。
作成したマスクを元にBase Colorなどを作成し、Preview Materialノードにつなぎます。
すると!!!
シムを元にしたアニメーションテクスチャができています。
素晴らしい完全に2Dの画像になっています。
実際のレンダリングではKarmaでウェットマップとして使用されていますが
もちろんCOPで連番ファイルとして出力も可能です。
元はシミュレーションなので、汗なのか、もっと粘性の高いものなのか、しみ込むように広がるのか、流れるのかは自由自在ですよね。
Houdiniならでは機能をぜひ楽しんでください。