kick the base

Houdiniと、CG技術と、日々のこと。

Houdini: HDAの便利機能 - Descriptive Parm

もうアドベントカレンダーの季節とか嘘でしょう…?(N回目記憶喪失)

気を取り直して皆さんいかがお過ごしでしょう。

今年もおかげさまでゲーム・ノンゲームを問わず難度の高いプロジェクトに参画させていただくことが多く、日々充実した毎日を送っていますが、技術発信の頻度が落ちてしまっているのがアレですね。反省。

というわけで今回は僕が主催している勉強会、Houdiniゆるゆる会の懇親会にて質問をいただいた内容が面白かったので、その回答を記事にしたものです。

ちなみにHoudiniゆるゆる会はスタート当初とは運用方法が変わっており、全員発表型の主体的勉強会としてリブートされています。参加者はすべて発表マストなのでハードルは少々高いですが、やる気のある人達との出会いが日々のHoudini道の刺激となるでしょう。

ご興味があればまずはX(旧Twitter)の僕のアカウントにご連絡をお待ちしています。参加費無料のオンライン勉強会なので、ぜひご参加ください。

本記事はHoudini アドベントカレンダー2023 15日目の記事です。

目次

お題

これを自作のHDAでもいい感じに表示したい

Attribute CreateSOPの例のように、青い字をいい感じに表示したいという相談でした。

解答例

primitive groupをカンマ区切りで表示するHDA

GIF動画のように、入力ジオメトリにPrimitive Groupが存在していたらそれをカンマ区切りで表示するHDAを作成しました。以下に作成方法をご紹介しますが、Attributeやグループ、任意のフラグなど、そのHDAが必要とする様々な情報をバッジとして表示することが可能になるので、よりよいUXを提供するツール制作の一助になるかもしれません。

データ配布

記事で使用したシーンはこちらからダウンロードできます。

  • Windows10
  • Houdini 19.5.640

今回配布の関係でHDAはEmbedしています。

実装

ここから実装のお話に入っていきますが、基本的な仕組みとしてはDescriptive Parmという機能を使います。これを最もシンプルに使用した例が下図のとおりです。

Descriptive Parm

  1. HDAにstring型のチャンネルを用意します。ここではmystringとしました。
  2. Edit Operator Type PropertiesウィンドウでNodeタブを開き、Descriptive Parmに先程の参照したいチャンネル名(mystring)を指定します。
  3. 1,2が設定されると1のチャンネルに記入されている値が青い文字でHDAに表示されます。

このような仕組みです。

1で準備するstring型のチャンネルは、直接ユーザーに操作させるUIとしてもよいですし、ユーザーからは隠蔽してHDAが内部的に計算した結果を書き込んでもよいでしょう。ちなみに今回のdescriptive_primgroupsというHDAは後者の仕組みを採用しており、Descriptive Parmの参照先チャンネルはinvisivleで運用を想定しています。

Descriptive Parmの仕組みさえ知っていれば、あとはよしなに表示させたい文字列を流し込むだけです。

ネットワーク

HDAの内容

今回は「入力ジオメトリにPrimitive Groupが存在していたらそれをカンマ区切りで表示する」だけの機能しか実装していませんので、ネットワークは最小限です。見ての通り非常に簡単ですね。こちらを順番に解説していきます。

attribwrangle_primgroups

s[]@__primgroups = detailintrinsic(0, "primitivegroups");

ワンライナーですので特に難しいことはありません。プリミティブグループを配列としてDetailアトリビュートの__primgroupsにセットします。

python_set_parm

node = hou.pwd()
geo = node.geometry()

s = ", ".join(node.geometry().attribValue("__primgroups"))
hda = node.parent()
hda.parm("str").set(s)

先程作ったDetailアトリビュート__primgroupsを使ってHDAのチャンネルstrに流し込みます。

これも難しいところはないかと思いますが、なぜPythonを使っているかだけ補足をすると、リストのカンマ区切りなどの作業が楽だったからだけです。

tupleで保持されている配列をカンマ区切りの文字列に変更している部分はs = ", ".join(node.geometry().attribValue("__primgroups"))になります。

attribdelete1

Detailアトリビュートの__primgroupsはここから先必要ないので削除しています。プロジェクト内でダンダーネーミングルールが徹底されている場合は__*で削除しても良いでしょう。

まとめ

前述の通り今作例ではDescriptive Parmの参照先チャンネルはinvisivleで運用していますが、これは好みによるかと思います。今回はかなり簡単な処理なのでinvisibleでも良いかと思いますが、作成されてからかなり経ったHDAなどは見えないチャンネルはエンバグの原因になる可能性をはらんでいます。その際はHide Whenなどを利用するとよいかと思います。

よりUXの高いHDAを作成し、効率的なフローを確立していきましょう。

次の記事は@TF_siriさんが担当されています。 それでは皆さん来年も素敵なHoudiniライフを!

ではでは。