5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Houdini ApprenticeAdvent Calendar 2024

Day 4

HDA製作のひっかかりポイント解説~Multi化への憧れ~

Posted at

こちらは、 Houdini Apprentice Advent Calendar 2024 の4日目の記事になります。

HDA製作の引っかかりポイント解説!

みなさん、HDA製作していますか?
HDAを使えるようになると便利なことがたくさんありますが、実装内容によってはつまずきポイントがたくさんあります。
本記事では、その中で個人的に引っかかったポイントを、HDAを作成しながら解説していきます。

最終的に完成するHDAはこんな感じになります。最後にHDAのダウンロードリンクも載せているので、ぜひ最後まで見ていってください!
image.png

1. シンプルなもので作成

まず始めに、シンプルな状況でHDAを構築していきます。
Input_GeometryからmaskfromgeometrySOPでマスクを作成し、そのマスクを元にcolorSOPで色付けして、attribcopySOPCdアトリビュートのみ元のジオメトリに戻しています。
attribcopySOPで必要なアトリビュートのみ戻す方法は(トポロジが変わらない場合に限り)非常に便利で重要なテクニックです。HDAでよく使われます。

image.png

2. Subnet化

Input_geometryMask Geometry以外をSubnetにまとめ(右側のNetwork)、パラメータをD&DしてSubnetにまとめました。
(パラメータ一つ一つ追加でもできますが、後半めんどくさいことになるので必ずD&Dでまとめてください)

画像の通りですが、maskfromgeometrySOPcolorSOPのパラメータをSubnetに登録しています。
image.png

3. Multi化

Subnetのパラメータをすべて一つのフォルダにまとめ、Folder TypeMultiparm Block (list)にすることで、マルチパラメータにできます。
そのままだと見にくいので、一番下にSeparatorを入れています。
ここで、Multi化によってパラメータのnameが変わるので、Subnetの中のパラメータリンクが切れ、機能しなくなっています。

image.png

4. パラメータのMulti化対応

SubnetMultiパラメータに、内部のノードを対応させていきます。ここがけっこうミソです。
Multi化によってSubnetの各パラメータのnameには番号が後付けされています。これにForLoopノードを使って対応させました。

BlockEndSOPIterationsMultisetRelativeCReferenceしました。
Forloopの回数を取得したいのでBlockBeginSOPCreateMetaimportNodeからMetadaノードを作成し、各ノードにAddSpareInputでリンクしました。

そして各パラメータに、 + (detail(-1, "iteration", 0)+1)を挿入します。これによって、Forloopごとに回数が取得できます。Subnetの方のパラメータを見ればわかりますが、1始まりなので+1しています。

ReferenceGroupTypeDistanceMetricなどのパラメータは、パラメータ右クリック→ExpressionEditExpressionで編集できます。
ひっかかりやすいですが、colorパラメータの場合順番が違うので、ch("../color" + (detail(-1, "iteration", 0) + 1) + "r")となります。もちろん残りGBも同様に対応させてください。
image.png

5. アクションボタンのMulti化対応

Subnetに戻ってみて、ReferenceGroupの右の矢印マークを押すとエラーが出ます。これもMulti化対応しなければなりません。
(下三角マークは問題なく動くはずです。こちらはSubnet内のmaskfromgeometrySOPの機能をコピーしてるようで、問題なく挙動します。)

ActionButtonReferenceGroupパラメータのActionButtonで修正できます。2行目に + str(kwargs["script_multiparm_index"]と挿入してください。
kwargs[]とはこういったpython側からノードやパラメータなどの情報を取得できる辞書で、この場合はmultiparmの番号を取得しています。詳しくはこちらをご参照ください。
image.png

6. Disable When のMulti化対応

よく見たらDisableMetricDisableWhenの挙動がおかしかったので修正しなければなりません。
ただし、DisableWhenHideWhen#で対応するので、それを追加するだけで問題なく機能します。

image.png

7. HDA化!

遂にHDA化です。お好きな名前にして、任意の場所に保存してください。
その後、HDAを右クリック→Type PropertiesBasicIconSOP_colorと入力するとアイコンが反映されます(お好きなものを入れてください)。
Nodeタブ→Guide GeometryInput_Maskと入れることでGuideMask_Objectが出ます。
image.png

終わりに

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

ということで、良きHoudiniライフをお過ごし下さい~!

5
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?