見出し画像

プロシージャルにOverwatch風の建物を作る

前回に引き続き、自分用の解説を挟みながらSimon Houdiniさんのチュートリアルをやってみます。重要な機能や考え方がギュッと詰まっていて良い動画です。
やや長いので何回かに分けます。

※ 記事の内容は元のチュートリアルから変えている部分もあります。

MultiParamBlockを作成する

階層ごとに大きさを変更するため、MultiParamBlockという仕組みを作成します。MultiParamBlockのTabを作成すると、要素を増やすごとにタブとその中身も追加でき、項目数を可変できる自由なパラメーター群を作成できます。

For Each Numberを作成してBoxを配置する
MultiParamBlockのフォルダを作成して中にfloatのパラメータを作る
MultiParamBlockにより、フォルダ数を増やしつつパラメーターを入力できる

パラメーターをリンクする

最初に作成したForEachNumberのカウント数をHDAのFloors(タブで増やす階層の数)に関連付けます。
さらにBox SOPのSpere Input 0を表示して、Spere Inputにforeach_countをリンクします。Spere Inputはノード参照を簡単に行うための仕組みです。Spere Inputにより、foreach_countのアトリビュートは引数-1で参照できるようになります。

ForEachの繰り返し回数にFloorsをリンクさせる
Boxの大きさにパラメーターをリンクする

strcatは文字列の連結です。iterationの数に1を足して、x_#の値を参照します。Houdiniは文字列の連結が少し煩わしいですね…

ch(strcat("../x_",detail(-1,"iteration",0)+1))

階層を重ね合わせる

Block End の Gather Method を Merge Each Iteration から Feedback Each Iteration に変更します。Merge Each Iteration は ループの終わりにジオメトリを合成しますが、 Feedback Each Iteration は ループの処理ごと合成します。
今回は階層を重ねるために前の階層の天面に新しく作った床面をスナップさせたいので Feedback Each Iteration に設定します。
さらにBlock Begin の Method も Fetch Feedback に変更します。これにより、Block Begin は一つ前の処理を返すことになります。

Block End を変更してループごとに蓄積型にする
Block Begin を変更して前のループの値を取得できるようにする

MatchSize SOP で前の階層の天面に新しく作った床面をスナップさせます。

すべての処理をMergeする
前のループの天面と、今の床面をスナップさせる


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