見出し画像

Houdini テキストによる陰影表現

3Dモデルの陰影をテキストの濃淡で表した表現をHoudiniで作成しました。
Houdini以外のツールでは作り方がちょっと想像できないせいか、TwitterもといXのLikeが伸びてますが、じつはこの表現はHoudiniでは非常に簡単に作成することができます。

内積で擬似的なライティングを行う

3DモデルをFBX Archive Importで読み込みます。ちょうどよいモデルがない場合、いつもの豚さんを使うのもありです。
読み込んだモデルをTransformで回転させています。
これは今回の主題とは関係ないのですが、回転の値に$F/$FEND*360 などと書いておくと、アニメーション全体の長さに関係なくアニメーションの終わりで一周するので便利です。
Attribute Wrangleには、以下の内容を書いています。

vector v = chv("vector");
@light = dot(normalize(v), @N);

これは、@vというベクター情報を作成し、@vとポイントの法線の内積を計算しています。あるベクターと法線の内積は、いわば仮想的なライティングです。仮想的なライトのあたった強さを@lightというアトリビュートにします。

@lightを可視化したもの

ポイントにライティング情報を転写する

MatchSizeを使って3Dモデルと同じ大きさのグリッドを作っておきます。グリッドはTransformで少し大きし、このあとRayを飛ばしやすいように移動しておきます。
グリッドはポイントだけですが、Rayで飛ばすためにAttributeCreateで@Nを作っておきます。
RaySOPはTransfromPointのチェックは外してポイントの移動は行わないようにし、CreatePointGroupでヒットしたポイントをグループ化してBlastします。また、ImportAttributeFromHitにチェックを入れて@lightアトリビュートをグリッドのポイントに移植します。

グリッドを作成して、RaySOPでHitしたものを転写
グリッドの@lightを可視化

テキストからテーブルを作成する

FontSOPに適当な文字列を入れます。この文字列は陰影情報に転写するので、後ろに行くほど濃度が濃いものにしましょう。
FontSOPは@textindexを出力するようにして、textindexごとにLoopを回してMatchSizeですべて中央に移動しましょう。

Fontをそれぞれ中央に集める
Fontを使ったLightテーブルといえなくもない

ライティング情報をテキストテーブルに変換する

CopyPointでグリッドに文字を転写します。グリッドに転写した@lightをつかって、@textindexの任意の文字が選ばれるようにしましょう。
@lightは-1~1のfloat値ですが、@textindexは文字の数だけのintが入ります。
nuniquevalは今回始めて使った関数ですが、アトリビュートに何種類の値があるのかわかるので非常に便利です。ここではfontの@textindexがいくつあるか(何個の文字があるか)を判定しています。
その値をfit関数を使ってライトの当たる強さを、文字の種類にマッピングします。

float m = float(nuniqueval(1, "prim", "textindex")-1);
i@textindex = fit(@light, 0, 1, 0, m);
かなり少ないノードで実現できた
フォントで陰影を表現できる

この記事が気に入ったらサポートをしてみませんか?