この記事は Qiita の Houdini Advent Calendar 2021 に投稿するものです。
※ 2021/12/23 現在この機能は実験段階であり、機能とプログラミングインターフェイスは変更される可能性があります。
公式ドキュメントはこちら(英語)
本記事では Houdini19 より追加された新機能「Python state info panels」についていくらか調べたものをまとめてみようと思います。
概要
❝Houdini の多くのツールが Python ステートを使用するようになり、ホットキーやマウスボタンの使い方のや現在の設定を含む情報パネルを表示できるようになりました。これらのツールヒントは、ビューア用 Heads Up Display 情報オーバーレイ API の初期実装で、TDが独自ツールを構築する際にアクセスできます。❞
Houdini19 では他の DCC ツール同様 Python3.7 が標準となり、多くのユーザーが Python に注目するようになりました。これまでも Python は Viewer State や HDA、Shelf などで多くの機能を提供してきましたが、この度実装された Python state info panels では、ユーザーエクスペリエンスを上げるためというよりもユーザーの視認性を上げる目的とされています。
具体的には、HDA に Python State を記述し、ビューシーン上にキーとマウスの使用上のヒント、および現在の設定を表示する「Info Panel」を表示できます。
新規ノードであれば使い方を理解するために、ユーザー単位で作ったノード及びツールであればどう使うのかを視覚情報として確認することができます。
既存ノードで確認
今回は参考に Curve を使い、Python State の中身を見ていきます。
Curve ノードの Type Properties から Interactive > State Script を開くと Python スクリプトが表示されます。
スクリプト自体は 9,000 行弱ありますが、ほとんどは H18.5 以前からある Curve 自体の機能です。Info Panels に関わる部分はごく一部のみです。
Template dictionary
スクリプトの 8145行に HUD_TEMPLATE という辞書があります。これは Template dictionary と呼ばれるもので、ここでパネルに表示する文字やアイコンを定義することができます。
例えば実際に Info Panel には Curve tool という名前が一番上に表示されていますが、これは 8146行目にある title キーの要素 Curve と desc キーの要素 tool によるものです。
icon キーの要素はそのまま Curve のアイコンを表す識別子 SOP_Curve です。
rows キーの要素はタイトル以下の実際のキーバインドを解説する部分です。
rows キー
rows キーの要素はリスト型を取り、各要素は辞書型を取ります。
Curve 自体の機能として F/G/H で Edit/Draw/Autodraw を切り替えられますが、どれを選んでいるかによって rows 内のサブグループで表示するページを切り替えています。
例えば Mode: Edit の場合は id: edit のページを表示し、Draw に変えれば draw を表示するという感じです。Edit 中に Draw のヘルプは要らないため、必要なヘルプだけを切り替えて表示することで簡潔な UI になります。
これとは別で tangents グループと Common グループがありますが、Mode とはまた独立して表示されます。
各キーとその要素の機能についてはこちらをご参考ください。
自分で作ってみる
Python State のイニシャライザで hou.SceneViewer.hudInfo() を呼び出すことで、Template dictionary に沿った情報表示の設定ができます。
また、onEnter や onMouseEvent などビューシーン上の操作中に情報を更新したり値の可視状態を切り替えることもできます。
Viewer State の追加
- 任意の HDA を右クリックし、Type Properties… を選択(空でも OK)
- Operator Type Properties ウィンドウが開くので、Interactive タブから State Script を選択
- ウィンドウ右下の New… をクリックし、Viewer State Code Generator ダイアログを開く
- Samples は Blank を選択し、Event Handlers は onEnter, onMouseEvent, onDraw, onDrawInterrupt を選択してダイアログ右下の Accept をクリック
Info Panels の追加
- State Script の State に以下を追加
- onEnter を書き換える
- onDraw, onDrawInterrupt を書き換え、83行目をコメントアウト
- Apply, Accept をクリックして Operator Type Properties を保存して閉じ、HDA を選択した状態でビューシーン上で Enter を入力する
これでビューシーンに info panels が表示されるようになりました。カメラモードにすると Python State が機能しないため、Alt キーを押しながらカメラの位置をマウス右ドラッグで変更すると Translation が更新されるのが分かります。TOP View などにすると分かりやすいです。
onEnter で rot_group を True にしたり、onMouseEvent で表示非表示を切り替えるなど Viewer State 同様インタラクティブにもできます。
今回はごく初歩的な機能の確認だけなので、実践的な機能は搭載していません。
とはいえパラメータではなくビューポートで数値を確認できるだけでも強力なのは想像できると思います。
終わりに
冒頭にも書いた通りこの機能は実験段階であり、多くの機能は持ち合わせていません。実装以前に Python を理解する必要があるため、若干敷居が高くもあります。
一方で今後機能が追加され使い勝手が変わる可能性も秘めているため、簡単にでも触れておくことをお勧めいたします。
完全に新しいものではなく HDA に Python state を実装したことがある方なら理解が早いと思います。またこれから Houdini Python に慣れていこうという方は他の機能と合わせて通過点としていただけると幸いです。