今回はこちらのフォーラムをみて、同じようなHDAを作成してみます。
https://www.sidefx.com/forum/topic/73696/?page=1#post-311558
Multiparmsとは?
Multiparmsは、ユーザーがアイテムリストを動的に作成できるようにするHoudiniのダイナミックパラメータです。プロシージャルモデリングを行うとき、ユーザーが構造体にドアを追加できるようにしたい場合、multiparmsを設定することで、ユーザーがドアを追加したり、位置等をカスタマイズしたりすることができます。
今回は、デジタルアセットに簡単なMultiparmsコントロールを設定する方法を紹介します。これはシンプルなデジタルアセットで、入力したBOXのスケールXを変更します。
ノード構造
まず、空のジオメトリノードを作成し、画像のようなネットワークを設定しました。
For-Each Connected Pieceを作成します。
Block Beginで、Create Meta Import NodeをクリックしループにMeta Importノードを追加します。
Transformを追加し、Block end接続します。
Block End ノードは "Merge every iteration "に設定されています。
デジタルアセットを作成
connectivity からforeach_endまでを選択し、Subnetにまとめます。
Subnetを右クリックし、Digital Assetに変換します。
Edit Operator Type Propertiesウィンドウが開きます。
Parametersタブにて、Folderを追加し、その下にFloatを追加します。
"Folder"を下記のように設定します。
Folder TypeをMultiparm Block(list)に設定することを忘れないでください
floatの設定も変更します。
パラメータには好きなようにラベルを付けますが、パラメータ名の最後には必ず "#" を付けてください。今回の例では、パラメータはscale#とNameに設定されています。
Apply をクリックしてデジタルアセットのパラメータを見ると、おなじみのMultiparmレイアウトが表示されます。リストを作成、編集、削除することができます。
番号付きパラメータへのアクセス
アセットの内部からデジタルアセットのパラメータにアクセスする方法は、既にご存知だと思います。番号付きのパラメータにアクセスする方法も似ていますが、もう少し複雑です。
デジタルアセット内部に入り、Transformノードを選択します。
Transformノードにspare input を作ります。これは必須ではありません。構造をわかりやすくするための設定です。
spareパラメータにmeta import ノードをドラッグします。
meta inportとTransformが接続されます。
次に、イテレーションインデックスを取得するために、"iter" (iteration)というカスタムIntegerパラメータを追加したいと思います。
Transformノードのパラメータエディタを編集するために、Edit Parameter Interfaceを選択します。
イテレーションインデックスを取得するのでIntegerを追加します。
Nameをiterに設定し、LabelはIterationにします。
Accetptをクリックすると、パラメータエディタにIterationパラメータが追加されます。
iterationに下記を入力します。
detail(-1, "iteration", 0) + 1
つまり、Metaノード(spare input を取得するために-1を指定)から、iteration Detail アトリビュートを取得し、そこに1を追加します。1を追加したのは、multiparmパラメータが1ベースのインデックスを使用するからです。
TransformノードのScale Xフィールドには、次のように入力します。
ch(strcat("../scale",ch("iter")))
ここがややこしいので、分解してみましょう。hdaに設定したScale1パラメータをコピーして、Paste relative referenceを行うと、以下のようになります。
ch("../scale1")
シンプルですが、scale"1"の1は動的に変わる必要があります。
そこで実際に設定したエクスプレッションを確認します。
ch("iter") はローカルな反復回数を与えてくれます (1ベース)
strcat(...)関数は、".../size "と数字を組み合わせたものです。つまり、".../size1", ".../size2" などとなります。
最後にすべて ch( ) でラップされたものは、実際に構築したパスからパラメータを読み込みます。
今回3つのBOXを作成し、作成したHDAに接続してみました。
そのため、Number of boxesは3つにしています。
各Scaleにに異なる値を設定するとそれぞれのBoxのScaleXがかわります。
わかりやすくするためにSideFX LabsのAlign and Distriuteを接続します。
Spacingを0にすると、Box間の距離がなくなり3つのBoxがぴったり並びます。
作成したHDAのScaleを変更し、各BoxのScaleが別々に変更できることがわかります。Multiparmをうまく使用し、HDAで異なる値を設定する方法をご紹介いたしました。