【Weekly Houdini】 プロシージャルフリル
毎週、Houdiniをいじる企画。Weekly Houdini。
今回は、プロシージャルモデリングを学ぶためにフリルスカートをプロシージャルに作ろうと思います。
まず、フリルスカートの構造を把握します。
「説明イラスト」
次に、フリルの元になるポリゴンのエッジを作成します。このポリゴンを押し出ししてフリル部分の布を作ります。
CircleをResampleしてPolyPathを掛けると、円形のエッジのみのポリゴンが生成されます。既存のモデルからフリルを生やしたい場合は、エッジグループを選択して、そのグループのみに処理をかけてあげると良いかと思います。Resampleの分割数を外部パラメーターにじていじりやすくしてあげるとよいかと思います。
次に、エッジポリゴンを二分割してソートをかけてあげます。今回はプログラムを書いてポリゴンをいじるので、ポイントの番号はとても重要です。エッジを二分割してソートしてあげることによって、2n+1のポイントがフリルを押し出す点になるわけです。
また、Extrudeされたポイント番号は、ポイントの総数の半分以上の番号になります。このあたりは、言葉で説明するとこんがらがるので、自分で実装してみると理解できるかとおもいます。こういった下準備をすることによって、ポイント番号による頂点操作がしやすくなります。
次に、PointWrangleを計算して打つようにポリゴンを変形させます。
1.中心からのベクトルをSin波で動かす。
2.中心からのベクトルの内積Crossを計算してたわみをつくる。
3.いいかんじになるように調整する。
int divideNum = chi("divideNum"); //分割数
int index = @ptnum%divideNum;
int columnNum = chi("columnNum");
int rowNum = npoints(0) / columnNum;
float extrudeRate = @ptnum*columnNum/npoints(0); //押し出したポイントを指定
float UpX = chf("upx"); //中心からの距離にかける係数
float UpY = chf("upy"); //外積にかける係数
float moveY = sin((float)index/divideNum * PI) * extrudeRate;
float moveX = sin((float)index/divideNum * PI*2 ) * extrudeRate;
moveY = max(0, moveY - 0.4); //中心からの距離
vector up = {0, 1, 0};
vector vecX = cross( @N, up ); //法線と真上のベクトルを外積することにより、たわみを再現する
//頂点移動
@P += @N * moveY * UpY;
@P -= vecX * moveX * UpX * (sin(moveY*PI*2) + 1 );
//debug
@Cd = moveY;
@N = vecX;
デバッグのTips
ベクトルやパラメーターのデバッグで便利なTipsを紹介します。
0~1などのスカラーな値をデバッグする際は、@Cd(色)に値を入れてあげると視覚的にわかりやすくて便利です。
また、ベクトルのデバッグなどは、@N(法線)に代入してあげることで、点からの法線を表示して視覚的にどうなってるかわかるようになります。
注意点として、色のデバッグをするときはライティングをOFFにしないと正しい見た目にならないので注意してください。
まとめ
このようにして、シンプルなフリルスカートを作ることができました。
一旦プロシージャルに作れたら、あとは楽できますしパラメーターが変えて遊ぶことが出来ますね。
プロジェクトファイルはこちらになります。