フォローする

Houdiniでプロシージャルな壁をつくる

下記のような壁をつくってみましょう。

まずは、Boxを作成し、Sizeを調整します。これが1つのブロックになります。

このときCentor(ボックスの中心の位置座標)が、原点にくるようにSizeX、SizeYを2で割った値にBoxの中心が配置されるようにします。

Boxを作成し、Copy Stamp(CopytoXという名前にします)で横にコピーする場合、BoxのScaleX(X側に並べるから)パラメーターを参照して、Xに移動してコピーするようにします。

次にY方向にvopy stamp(copytoYという名前にします)します。このときに、複製した分、上にずれてコピーしてほしいとします。

ch("../box1/sizey")*$CY

この$CYは現在生成されているコピーの番号を表すローカル変数です。 0から始まります。

BoxのScaleYで最初の高さを取得し、1段増えるごとにその取得された番号を乗算して、上にずらしていきます。

次にコピー番号が奇数の場合、横に半分ずれるようにして、ジグザグにブロックが重なっているようにします。

($CY%2)*ch("../box1/sizex")/2

$CYが番号なので、それを2で割ったあまりを取得します。%は割り算の余りを取得することができます。
これにより、偶数の余りは常に0、奇数の余りは常に1となります。

これにBoxのScaleXを半分にしたものをかければ、偶数の場合は、X移動0、奇数の場合は、X移動0.5となり、奇数の場合だけ半分ずれて上に複製されていきます。

次に、ずれた部分を埋める半分のブロックを作ります。

Box1をAltキーを押しながらドラッグして複製し、SizeはBox1と同じ大きさになるようにします。

各個別のパラメーターをCopy Paramterすれば、そのパラメーターだけを取得できますが、たとえばSizeという文字部分をCopy Paramter>Paster Relative Referenceすれば、まとめてExpressionを追加することができます。

その後、SizeXだけ半分になるように割り算(/2)を追加します。

そのBoxを新しいCopy Stampにつなげます。

まず、Copy3のNumber of Copyは、copytoYノードのNumber of Copyを参照します。

次にTransYにBoxのScaleYずつ移動するようにします。

このようにえY方向に移動しながら複製されます。

コピーで目指す形はこんな形です。

うーん、じゃあ、どのようにX軸への移動を作り出せばいいのか?

 CopytoYまでで壁の全体のBboxは取得できています。なので、そのBboxの中心から180度ずつ回転して上にコピーしていけば、必要なところにボックスがはまります。

ということで、複製するボックスのコピーのPivotX(ローカルピボットポイントX)に、下記のエクスプレッションを入力します。

centroid("../copytoY",D_X)

centroidは頂点を囲むBboxの中心を取得するエクスプレッション関数です。1つの引数でSurfaceノードを指定し、2つ目の引数でX、Y、Zを指定します。

次にRotateYに180と入力します。

結果を確認すると狙ったとおりの結果を取得できました。

これを最初につくったメインの壁とMergeすると・・・

ジグザグしながら、けれども1枚の壁が完成しました。

これは、1つのBoxのSizeX,SizeYを参照しているので、Box1のサイズを変えるとブロック間がずれずに、1つのブロックのサイズを変更できますし・・・

 X方向、Y方向へのコピー数も自由に変更できます。

ここまでで壁のモデルは完成しました。

 

0 コメント

記事コメントは受け付けていません。