こちらは、 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ライフをお過ごし下さい~!