こちらの記事では、Houdini上で利用可能なPython Viewer Stateを使用し、ビューポート上でのインタラクティブな操作を
可能にする方法についてご紹介しています。
Pythonで独自のViewer Stateを記述する方法について、Houdiniヘルプも合わせてご覧ください。

▼ 使用ソフトウェア
今回使用しているOSとHoudiniのバージョンは以下の通りです。
OS:Windows10 Pro
Houdini:19.0.531 – Python 3
▼目次
1. はじめに
1.1. Python Vewer Stateとは
1.2. Pythonのバージョンについて
2. Viewer Stateを作成する際の注意
3. Viewer State Browser ウィンドウを開く方法
4. Python Viewer Stateを作成する手順
4.1. アセットの新規作成/Viewer Stateコードの埋め込み方法
4.2. Viewer StateをHoudiniに登録する方法
5. Viewer State Code Generatorについて
6. Event Handlersについて
7. コードの記述内容について
8. まとめ
1.はじめに
1.1 Python Vewer Stateとは
以下は、Python Viewer Stateを利用して作られたツールの例です。
![]() |
![]() |
Curve SOP (Version 2.0) |
Labs Ruler Tool |
![]() |
![]() |
Labs Boxcutter SOP |
Labs Trim Texture SOP |
また、Houdniのシーンビュー上に表示されるHandlesツールやRotateツールもViewer Stateの1つです。
▼ハンドルの使い方
https://www.sidefx.com/ja/docs/houdini/basics/handles.html
Houdniでは、ユーザーが独自のコードを記述することで、マウス、キーボードなどの入力に基づいたビューポート内で動作する
インタラクティブな機能を作成して登録することができます。
現在のバージョンでは、SOP、OBJ、DOP、LOPのレベルで利用可能です。
また、Pythonの知識があれば、更にHoudniの機能を拡張することが可能です。
1.2. Pythonのバージョンについて
本記事では、Python3.7が実行されているHoudiniを使用しています。
Python2.x系とPython3.x系との間では、 コードの記述方法に違いがあり、双方に互換性はありません。
従いまして、Python2.x系が実行されている環境では、本記事内でご紹介しているソースコードが正しく動作しない可能性があります。Python3.x系にアップデートするには、Houdiniダウンロードページから、ご使用の環境に適したインストーラーをダウンロードし、
インストールを行う必要があります。
また、以下の点につきましても注意が必要です。
Windows:
Houdiniと一緒にインストールされたPythonのバージョンが使用されます。
Mac OS:
システムにインストールされているPythonのバージョンが使用されます。
2. Vewer State を作成する際の注意点
Houdiniでは、同一のアセット名やState名のものが複数存在することができません。
2人の作者が同じ状態名を使用すると登録に失敗します。
従いまして、作成したアセットやViewer Stateを配布する予定があったり、
社内で共有することが想定される場合にはその名前に注意する必要があります。
Houdiniヘルプには以下のように記載されています。
たとえば、Example.com 映画スタジオで働いていて、アセットに使用する名前のプレフィックスに examplecom:: を使用している場合、 ”scrub”のViewer Stateを作成するときには、examplecom::scrub という名前をつけることを推奨しています。 ▶ステート名には、ノードタイプ名やノード名のような文字制限はありません。ステート名は、任意の文字列に設定することができます。 ▶この名前をファイル名やディレクトリ名として使用する場合があります。(例えば、コードをファイルに保存する場合など) |
詳細につきましては、Houdiniヘルプも合わせてご参照ください。
▼Pythonで独自のViewer Stateを記述する方法
https://www.sidefx.com/ja/docs/houdini/hom/python_states#install
3. Viewer State Browserウィンドウを開く方法
Houdiniに読み込まれているPython Viewer Stateを一覧で確認したり、管理しする際にはViewer State Browserを
使用することができます。
下の画像のように、[ NewTab ] > [ New Pane Type ] > [ Inspectors ] > [ Viewer State Browser ] からViewer State Browserを
開くことができます。
4. Python Viewer Stateを作成する手順
ここでは、Views Stateを作成し、Houdiniに登録する方法を2つご紹介します。
1. アセットを新規に作成し、Viewer Stateのコードを埋め込む方法 2. ノードに依存しないViewer StateをHoudiniに登録する方法 |
4.1 アセットの新規作成/Viewer Stateコードの埋め込み
SOPネットワークで新規デジタルアセットを作成し、Viewer Stateを埋め込む方法をご紹介します。
デジタルアセットにStateを埋め込んだ場合、デジタルアセットを読み込むと同時にStateがHoudiniに読み込まれます。
また、デジタルアセットに埋め込んだViewer Stateは、そのノードを選択している時にのみ動作します。
Houdiniデジタルアセットの詳細は、以下のページも合わせてご参照ください。
▼デジタルアセットの紹介
https://www.sidefx.com/ja/docs/houdini/assets/intro.html
それでは、実際の手順を見ていきます。
今回は、デジタルアセットにViewer Stateのコードを埋め込むことで、ビューポート上でマウスカーソルをクリックしたときに、
マウスの位置とXZ平面との交点にポイントを追加し、オブジェクトをコピーすることができるようなデジタルアセットを
作成していきます。
下の画像が完成イメージです。

Box SOPノードと Add SOPノードとCopy to Points 2.0 SOPノードを配置します。ノードを配置した後、これらを選択します。
[ Assets ] > [ New Digital Asset From Selection ] をクリックし、新規デジタルアセットを作成します。
デジタルアセットの名前とラベルを設定し、[Accept] をクリックします。
デジタルアセットが作成されます。
自動的に[ Type Properties ] ウインドウが表示されますので、 [ Interactive ] タブを表示します。
[ interactive ] タブ、右下の [ New ] をクリックします。

[ Viewer State Code Generator ] ウインドウが表示されます。
[ Name ] と [ Label ] を設定します。
次に、項目を選択し、[ Accept ] をクリックすることで、Viewer Stateのテンプレートを読み込むことができます。
テンプレートを使用することで、Pythonに詳しくない方でも簡単にViewer Stateを使用することができ、非常に便利な機能です。
今回は [ Add Point ] を選択し [ Accept ] をクリックします。

[ State Script ] タブ内にテンプレートが読み込まれたことが確認できます。
ここにコードを追加で記述することでViewer Stateをカスタマイズすることができます。
今回、コードの追記は行いません。

[ Type Properties ] ウインドウ内の [ Parameters ] タブに移動します。
[ Type Properties ] ウインドウを開いたまま作成したアセットの中に入ります。
add ノードの [ Number of Points ] のパラメータをドラッグし、
[ Type Properties ] ウインドウの [ Parameters ] タブの [ Existing Parmerters ] にドロップします。
[ Accept ]をクリックすると変更が適用されます。

HDAアセットにViewer Stateを埋め込むことができました。
ビューポート内でEnterキーを押すとViewer Stateが有効になり、
クリックした場所にポイントが作成されボックスがコピーされるのが確認できます。

あとからViewer Stateの内容を変更したい場合は、作成したアセットのノードを右クリックし、
[ Type Properties ] から編集をすることができます。

Viewer State Browserから、Viewer Stateが読み込まれていることを確認することができます。
Viewer State Browserを開きます。

Viewer Stateのタイプから [ Object ] を選択します。

以下のように、作成したViewer Stateが表示されます。

Vewer Stateをデジタルアセットに埋め込む手順は以上となります。
デジタルアセットにViewer Stateを埋め込むことで、インタラクティブなデジタルアセットの作成が可能になります。
Pythonについてあまり詳しくなかったとしても、Visual Studio Code Generatorを活用することで簡単にViewer Stateを追加することができます。ぜひご活用ください。
4.2 Vewer StateをHoudiniに登録する方法
ノードに依存しないViewer StateをHoudiniに登録する手順をご紹介します。
これはNodelessステートとも呼ばれます。
$HOUDINIPATH/viewer_states/のパスにモジュールとしてViewer Stateのソースコードを.pyのファイルで配置すると
Houdini起動時にViewer Stateが読み込まれます。
または、次の手順でViewer State BrowserからViewer Stateを新規作成すると、自動的に $HOUDINIPATH/viewer_states/ のパスに
ファイルが作成されます。
$HOUDINIPATHについて 例えば、OSがWndowsで、ご使用のバージョンがHoudini19.0の場合、以下のホームディレクトリを指しています。 C:\Users\ “username” \Documents\houdini19.0 |
Viewer State Browserを開きます。

Viewer Stateのタイプを選択します。
※Viewer Stateのタイプを選択しないとViewer Stateの新規作成ができません。

[ File ] > [ New State ] からステートを新規作成することが出来ます。

[ New State ] をクリックすると、[ Viewer State Code Generator ] ウインドウが表示されます。
[ Name ]にViewer Stateの名前を入力し、必要なテンプレートの項目を選択し、[ Accept ] をクリックすることで、
Viewer Stateのテンプレートを読み込むことができます。

コードエディタが起動します。コードを記述し、[ Accept ]を押すことで適用されます。

Nodeless Stateの詳細につきましては、以下のページもご参照ください。
▼Pythonステート Nodelessステート
https://www.sidefx.com/ja/docs/houdini/hom/state_nodeless.html
5. Viewer State Code Generatorについて
Viewer State Code Generatorは新しいViewer Stateを作成するためのユーティリティです。
こちらはコードの編集を支援するものではなく、事前に用意されたサンプルコードからViewer Stateを実装します。
コードを編集している途中でオプションを変更することは出来ません。

Samples:
サンプルを選択してコードを生成することができます。
サンプルコードの冒頭にはそのサンプルコードの使用方法も記述されています。
Event Handlers:
一覧から、使用したいイベントハンドラを選択することで選択したイベントハンドラが含まれたコードが生成されます。
詳しくは次のセクションで詳しく解説しています。
Debug Context Menu:
デバッグ用のコンテキストメニューを追加する場合に選択してください。
Viewer State Code Generatorの詳細につきましては、こちらも合わせてご覧ください。
6. Event Handlers
Houdini のViewer Stateには多くのEvent Handlerがあります。
Event Handler とは、特定のイベントが発生した時に実行される処理のことで、イベントの条件と処理内容を合わせてコードを
作成します。
[ Event Handlers ] から選択することで、選択したイベントハンドラを含むコードを生成することができます。
Viewer Stateで最もよく使われるイベントハンドラはLife cycle CallbackとUI Callbackです。

Life cycle:
例えば、開始されたとき、中断したとき、再開したとき、完全に終了したときにコードを実行させることができます。
UI callback:
マウス、キーボード、ペンの入力イベントに応じてコードを実行させることができます。
他にも様々なイベントハンドラが用意されています。
上記以外のイベントハンドラの詳細につきましては、以下のページをご参照ください。
▼イベントハンドラー
https://www.sidefx.com/ja/docs/houdini/hom/python_states.html#handlers
7.コードの記述内容について
Viewer Stateのコードがどのように記述されているか、簡単にご紹介します。
例として、[ Viewer State Code Generator ] で [ Event Handlers ] の [ onMouseEvent ] を選択してコードを記述した際の
コードを見てみます。

Viewer Stateをテンプレートから読み込むと、下記のような形式で記述されています。

モジュール:
HoudniでPythonを使用する際にはhouモジュールが用いられます。
Viewer Stateを実装する際には、houモジュールに加えてviewerstate.utilsというモジュールを使用します。
viewerstate.utilsモジュールは、$HH/python3.7libs/viewerstateフォルダにあります。
(Houdniで使用されているPythonのバージョンによってパスは異なります。)
また、Houdiniには多くのPython Viewerステート関連のHOM APIが用意されています。
ViewsStateを定義するクラス:
コールバック関数とメソッドをすべてこのクラス内で定義します。
また、定義時にはイニシャライザが必須です。
イニシャライザの記述方法の詳細につきましては、以下のページをご参照ください。
▼Pythonで独自のViewer Stateを記述する方法 (イニシャライザ)
https://www.sidefx.com/ja/docs/houdini/hom/python_states.html#init
様々なイベントハンドラを記述することで、ビューポート上での操作に応じたインタラクティブな処理を記述することができます。
8.まとめ
この記事では、Viewer Stateを用いてインタラクティブな操作を可能にする方法についてご紹介してきました。
また、Houdini内でスクリプトを記述する際にVisual Studio Codeなど、普段使い慣れているエディタを利用したい方も
いらっしゃると思います。
Houdini では外部エディタを登録し、コーディングを行う際に使用することができます。
詳しくは、こちらの記事も合わせてご参照ください。
本記事の内容がお役に立てれば幸いです。ご覧いただきありがとうございました。