プロシージャルな提灯を作る
Houdiniゆるゆる会 REBOOTEDに参加しました。今回のお題は「祭り」ということで、プロシージャルに制御できる提灯を作成してみました。
提灯の断面を作る
まずは大きな提灯のシルエットから作成します。
LineをPointWrangleで編集してRampに沿った形に編集します。
提灯は上と下に木を曲げた輪っかのようなものがつくのですが、上は化粧輪、下は受け皿と言うそうです。これらは同じ大きさのことが多いので、Clipで一緒に切り取ります。
その後、Resampleをかけるのですが、このResampleの値はそのまま提灯の竹骨の個数になります。
断面に竹骨のディテールを入れる
断面に竹骨が通っているようなディテールを加えます。
竹骨とは提灯の回転方向に通っている竹でできた構造の芯のことです。実際にはらせん状になっているそうなのですが、今回は無視してリングが複数個ある想定で作ります。
竹骨が入っている場所は膨らむのでその場所にリング状のパーツを配置します。
リングをそのまま配置しては他のパーツとのつながりが悪いので、1/3程度の断面を作成し、そのパーツが元のカーブのタンジェント方向に向くようにクォータニオンで回転させます。回転するときに原点で回転したいので、一度円の中心の座標を引いて回転させてから、円の中心の座標を足し直すのがポイントです。
int i = detail(2,"iteration",0);
vector va = {0, 1, 0};
vector vb = point(1,"N",0);
vector pos = point(1,"P",0);
vector4 rotate = dihedral(normalize(va), normalize(vb));
@P = qrotate(rotate, @P-pos) + pos;
竹骨の断面同士の中点にはポイントを配置しました。このポイントはいずれなめらかにする予定なので、グループ化しておきます。
このポイントに、断面の中間の位置になるようにorderというAttributeを与えておきます。
i@order = (@primnum+1) * (int(ch("../circle1/divs"))+2);
orderAttributeでSortを行い、AddSOPでポイント番号順に接続する。その後Revolbeして提灯の形状を作ります。
竹骨のない部分のエッジにベベルをかけてなめらかに接続します。
陰影を頂点カラーで仕込む
提灯の陰影をライトなしでも処理できるように、仮想的な光源からの距離と、提灯の面のベクトルと光源の内積でコントロールします。
vector pos = {0,0,0};
pos.y = ch("height");
float distance = pow(distance(pos, @P), 2);
@Cd = fit(distance, 0,ch("max"), 1, 0);
float angle = dot({0,-1,0}, normalize(@N));
float light_int = fit11(angle, 0, ch("light_int"));
@Cd = @Cd * light_int;
化粧輪と受け皿を合成する
化粧輪と受け皿は同じパーツを使いまわします。
最初にカーブをトリミングしたClipSOPの値を半径に使いリングの大きさを決めて、MatchSizeSOPでパーツを接続しました。
この記事が気に入ったらサポートをしてみませんか?