【Houdini】SOPノードパラメータのインターフェースにマウスでグループ対象を選択するやつを仕込む


グループを選択して動く HDA を作る際にユーザにグループを楽に選択させたい。ビルトインのノードはマウスで面やらポイントをインタラクティブに選択できて便利だ。ということで同じ挙動をするよう真似をしてみる。

手順メモ

1.パラメータの用意

適当にノード(通常サブネット)を作成して、ストリングのパラメータを作成する。名前とラベルはなんでもいい。

2.ボタンアクションの指定

下記の python スクリプトを仕込む。選択させたい対象によって、geo_typeの値は切り替える。
今回は Primitive(ここではポリゴンフェイス)を選択させるコードにしてある。他のタイプ指定の値はコメントアウトしてあるので、参考まで。

import soputils
geo_type = (
    #hou.geometryType.Edges,
    #hou.geometryType.Points,
    #hou.geometryType.Vertices,
    hou.geometryType.Primitives,
)
kwargs['geometrytype'] = geo_type
kwargs['inputindex'] = 0
soputils.selectGroupParm(kwargs)

なお、inputindex の値を1とかに変えると選択対象にする入力ノードを切り替えることができた。

Action Help の指定はボタンにロールオーバーしたときに表示されるヘルプなので適当に。でも日本語は文字化けした。
Action Icon の指定はボタンのアイコン画像指定なので、指定しなくてもよいが BUTTONS_reselect にすると他のノードと同じになる。

これだけ。soputils モジュールには良いものが眠っていそうだ。

以上の設定だけでボタンを押してビューポートからマウスでグループ対象を選択できるようになる。

Enter で確定すると パラメータ欄に 0-2 というようなフォーマットで選択されたフェースの値が入る。 複雑な選択をした場合は、0 3 11 13 17-18 23 のような文字列になる。さてしかし、このような複雑な形式で指定された番号を実際の番号に展開するのは面倒ではないか?

設定されたグループを利用する

サブネット内部の wrangle ノードでグループ選択された対象を得る場合、以下のVEXでプリム番号の配列に変換できました。group という名前でパラメータを作っている想定です。至れり尽くせり。2行目以降はプリム以外の番号一覧を得る場合の例です。

i[]@group_prims = expandprimgroup(0, chs("../group")); //フェイスの場合

//i[]@group_edges = expandedgegroup(0, chs("../group")); //エッジの場合
//i[]@group_points = expandpointgroup(0, chs("../group")); //ポイントの場合
//i[]@group_verices = expandvertexgroup(0, chs("../group")); //頂点の場合

設定した方がいいかもしれないタグとその値

ユーザインターフェース指定の下の方にある項目に参考にしたビルトインノードでよく設定されている値がありました。とりあえず指定しなくてもうまく動いています。

  • autoscope 0にしてるノードが結構あった。
  • sop_input 0にしてるノードがあった。

こちら、詳細知ってる方おればぜひコメントを。