Houdiniで髪の毛のメッシュを作成するノードを作った

はじめに

Houdiniで、キャラクターの髪の毛の房のメッシュを作成するノードを作成しました。 Sweepしているだけで大したことはしていないのですがメモしておきます。

完成図

次の画像は、このノードで作成したメッシュをBlenderで表示してみたものです。

このような髪を作れるノードを作成します。

髪の毛のノードの作成

髪の毛のノードはカーブをつなぐことで使います。

ノードの全体像は次のとおりです。

最初にSweepの背骨部分から説明します。

ノードのインプットとして渡されるカーブにresampleノードを接続しています。 resampleノードでは適当な長さのセグメントに分けています。 このLengthもパラメータとして外部に出したほうがよいような。

その次にPolyFrameノードを接続します。

Normalをup、TangentをNとして設定します。

その次にPointWrangleを接続します。

PointWrangleノードには次のように記述します。

1
2
3
4
5
6
@pscale = chramp("pscale", (float) @ptnum / (@numpt - 1), 0);
@pscale *= ch("UniformScale", 1.0);

float rad = radians(ch("Angle", 90));
vector4 q = quaternion(rad, @N);
@up = qrotate(q, @up);

ランプとUniformScaleで房の太さのpscaleを変更しています。 房の方向のNと回転角Angleをもとにupの方向を回転させています。

次にSweepするオブジェクトの方を見ていきます。

Primitive TypeがPolygonのサークルを用意します。

次にGroupノードで6番目の頂点に「uvseam」というグループを割り当てます。

その次にTransformノードをつなげて円を潰します。

さらにTransformノードをつなげてひし形にしました。

Sweepノードに作成した断面と背骨を接続します。

GroupPromoteノードで頂点にある「uvseam」グループをエッジグループへと変更します。

「Include Only Elements Entirely Contained in Original Group」にチェックを入れます。 チェックを入れたときと入れていないときのエッジグループの差は次のとおりです。

次に法線をNormalノードで与えます。

最後にUV Flattenノードを接続し、「uvseam」をシームとしてUV展開をします。

サブネットワークに格納して右クリックのメニューからCreate Digital Assetを選択します。

WrangleノードのPscaleとUniformscale、Angleをパラメータとして外部に公開します。 デフォルト値としてUniformscaleに1を、Angleに90を与えました。

これでノードの完成です。

複数の房について、UV LayoutでNo Rotationの設定で並べると、 よい感じに髪の毛の方向が揃って展開されます。

おわりに

Sweepしているだけで大したことはありませんが、 何かしらの参考になれば幸いです。