こちらは、 Houdini Apprentice Advent Calendar 2024 の4日目の記事になります。
HDA製作の引っかかりポイント解説!
みなさん、HDA製作していますか?
HDAを使えるようになると便利なことがたくさんありますが、実装内容によってはつまずきポイントがたくさんあります。
本記事では、その中で個人的に引っかかったポイントを、HDAを作成しながら解説していきます。
最終的に完成するHDAはこんな感じになります。最後にHDAのダウンロードリンクも載せているので、ぜひ最後まで見ていってください!

1. シンプルなもので作成
まず始めに、シンプルな状況でHDAを構築していきます。
Input_GeometryからmaskfromgeometrySOPでマスクを作成し、そのマスクを元にcolorSOPで色付けして、attribcopySOPでCdアトリビュートのみ元のジオメトリに戻しています。
attribcopySOPで必要なアトリビュートのみ戻す方法は(トポロジが変わらない場合に限り)非常に便利で重要なテクニックです。HDAでよく使われます。
2. Subnet化
Input_geometryとMask Geometry以外をSubnetにまとめ(右側のNetwork)、パラメータをD&DしてSubnetにまとめました。
(パラメータ一つ一つ追加でもできますが、後半めんどくさいことになるので必ずD&Dでまとめてください)
画像の通りですが、maskfromgeometrySOPとcolorSOPのパラメータをSubnetに登録しています。

3. Multi化
Subnetのパラメータをすべて一つのフォルダにまとめ、Folder TypeをMultiparm Block (list)にすることで、マルチパラメータにできます。
そのままだと見にくいので、一番下にSeparatorを入れています。
ここで、Multi化によってパラメータのnameが変わるので、Subnetの中のパラメータリンクが切れ、機能しなくなっています。
4. パラメータのMulti化対応
SubnetのMultiパラメータに、内部のノードを対応させていきます。ここがけっこうミソです。
Multi化によってSubnetの各パラメータのnameには番号が後付けされています。これにForLoopノードを使って対応させました。
BlockEndSOPのIterationsにMultisetをRelativeCReferenceしました。
Forloopの回数を取得したいのでBlockBeginSOPのCreateMetaimportNodeからMetadaノードを作成し、各ノードにAddSpareInputでリンクしました。
そして各パラメータに、 + (detail(-1, "iteration", 0)+1)を挿入します。これによって、Forloopごとに回数が取得できます。Subnetの方のパラメータを見ればわかりますが、1始まりなので+1しています。
ReferenceGroupTypeやDistanceMetricなどのパラメータは、パラメータ右クリック→Expression→EditExpressionで編集できます。
ひっかかりやすいですが、colorパラメータの場合順番が違うので、ch("../color" + (detail(-1, "iteration", 0) + 1) + "r")となります。もちろん残りGとBも同様に対応させてください。

5. アクションボタンのMulti化対応
Subnetに戻ってみて、ReferenceGroupの右の矢印マークを押すとエラーが出ます。これもMulti化対応しなければなりません。
(下三角マークは問題なく動くはずです。こちらはSubnet内のmaskfromgeometrySOPの機能をコピーしてるようで、問題なく挙動します。)
ActionButtonはReferenceGroupパラメータのActionButtonで修正できます。2行目に + str(kwargs["script_multiparm_index"]と挿入してください。
kwargs[]とはこういったpython側からノードやパラメータなどの情報を取得できる辞書で、この場合はmultiparmの番号を取得しています。詳しくはこちらをご参照ください。

6. Disable When のMulti化対応
よく見たらDisableMetricのDisableWhenの挙動がおかしかったので修正しなければなりません。
ただし、DisableWhenやHideWhenは#で対応するので、それを追加するだけで問題なく機能します。
7. HDA化!
遂にHDA化です。お好きな名前にして、任意の場所に保存してください。
その後、HDAを右クリック→Type Properties→Basic→IconにSOP_colorと入力するとアイコンが反映されます(お好きなものを入れてください)。
Nodeタブ→Guide Geometry→Input_Maskと入れることでGuideにMask_Objectが出ます。

終わりに
以上、HDA製作解説でした!
個人的に、HDA製作でかなり困ってたことをしっかり解説できたと思っています。この記事で救われる人がいることを祈ります…
話変わりますが、このHDA若干重いですね。maskノードが重いので、Forloopで何回も計算するとかなり重くなります。
根本的な解決には至りませんが、ちょっとした工夫で少しだけ改善できる点があります。気づいている人もいるとは思いますが、ColorSOPをForloopの外側に出せば、色変えのみであれば毎回maskノードの処理を挟まなくて済みます。ではその実装をどうすればいいか?
それは考えてみてください…答えはこちらのHDAの中に入れておきます。
(リンク先切れておりましたらお手数ですがTwitterDMにご連絡ください)
ということで、良きHoudiniライフをお過ごし下さい~!


