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というアトリビュートにします。
ポイントにライティング情報を転写する
MatchSizeを使って3Dモデルと同じ大きさのグリッドを作っておきます。グリッドはTransformで少し大きし、このあとRayを飛ばしやすいように移動しておきます。
グリッドはポイントだけですが、Rayで飛ばすためにAttributeCreateで@Nを作っておきます。
RaySOPはTransfromPointのチェックは外してポイントの移動は行わないようにし、CreatePointGroupでヒットしたポイントをグループ化してBlastします。また、ImportAttributeFromHitにチェックを入れて@lightアトリビュートをグリッドのポイントに移植します。
テキストからテーブルを作成する
FontSOPに適当な文字列を入れます。この文字列は陰影情報に転写するので、後ろに行くほど濃度が濃いものにしましょう。
FontSOPは@textindexを出力するようにして、textindexごとにLoopを回してMatchSizeですべて中央に移動しましょう。
ライティング情報をテキストテーブルに変換する
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);
この記事が気に入ったらサポートをしてみませんか?