見出し画像

プロシージャルな提灯を作る

Houdiniゆるゆる会 REBOOTEDに参加しました。今回のお題は「祭り」ということで、プロシージャルに制御できる提灯を作成してみました。

提灯の断面を作る

まずは大きな提灯のシルエットから作成します。
LineをPointWrangleで編集してRampに沿った形に編集します。
提灯は上と下に木を曲げた輪っかのようなものがつくのですが、上は化粧輪、下は受け皿と言うそうです。これらは同じ大きさのことが多いので、Clipで一緒に切り取ります。
その後、Resampleをかけるのですが、このResampleの値はそのまま提灯の竹骨の個数になります。

断面のRampでコントロールする

断面に竹骨のディテールを入れる

断面に竹骨が通っているようなディテールを加えます。
竹骨とは提灯の回転方向に通っている竹でできた構造の芯のことです。実際にはらせん状になっているそうなのですが、今回は無視してリングが複数個ある想定で作ります。

実際の竹骨を再現するには螺旋が良い
竹骨が通ることで提灯の断面は一定間隔で凹凸ができます。

竹骨が入っている場所は膨らむのでその場所にリング状のパーツを配置します。

リングを配置した

リングをそのまま配置しては他のパーツとのつながりが悪いので、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);
断面のポイントはプリミティブ番号に断面の個数+2を行ったものを掛け算して、ちょうど断面同士の間に入るようなAttributeをつくておく

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でパーツを接続しました。

MatchSizeはめちゃくちゃ便利

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