2Houdiniでパラメータを作る話HOUDINIこの記事は?巷のパラメータ記事、上級者向けすぎ。手前、上級者さんたちが問題にしている一歩手前のところをとりあえず知りたいねん。そんな気持ちで記事を読んでいたので、簡単でよく使うところのみをさっくりとまとめてみたのがこの記事です。Properties各種ノードのここから編集できます。Interfaceは、インスタンスされたノードのパラメータを編集します。おなじタイプのノードを2つ作って、片方を編集しても、もう片方に反映されません。そのときどきで、個別にパラメータを持たせたいときはこちらを使用します。Propertiesはその名の通り、とあるタイプのノードのプロパティを編集するもので、編集結果が同じタイプの、ほかのインスタンスノードにも反映されます。HDAを作るときはこちらを編集します。Interfaceでは編集できないことです。どちらもパラメータ編集時のUIのぱっと見がとても似ているので、初心者の頃にとても混乱しました。(「あれ?なぜかこのパラメータだけグレーアウトして消せない!」とか。Interfaceです。右のカラムには「今選択しているパラメータの設定詳細」が表示されています。真ん中のカラムから設定を行いたいパラメータを選択→右のカラムで設定を編集することでパラメータの詳細を設定することができます。Discardボタンでそれまでの編集を削除、Applyでそれまでの編集をノードへ反映することができます。作成できるパラメータ左のカラムから選択したパラメータを追加できますが、どのようなパラメータを追加できるのかざくりと紹介します。Typeタブいろんな型のパラメータを追加できます。プレーンな状態で追加されるので基本的にここから選ぶことになるとおもいます。Propaties各種プロパティをノード上で編集数るために追加できます。Node既存のノードのパラメーターをそのまま選択中のノードにもってくることができます。これをした場合、既存のノード側のパラメータには、選択中のノードのパラメータを参照するためのエクスプレッションが自動で入ります。デフォルトの値を設定するデフォルトの値は、右カラムのChannelsタブから設定できます。Defaultsのところに好きな数字を入れます。ノード編集時にこの値以外の値が入ると、太字で表示されます。レンジを決めるfloatのパラメータを作成した直後だと、ノードのスライダー上では「0~1」の値しか入れることができず、パラメータに直接数字を打ち込んではじめて負の数や1より大きい値を入れることができます。Interface上で編集できます。鍵のマークをクリックすると、Min/Max外の値も許容するかどうかを設定できます。表示設定Invisible:オンにすると、ノードのパラメータに表示されなくなります。Parameter」で一時的に表示することができます。When:特定の条件下でDisableはパラメータをグレーアウト、Hideはパラメータを非表示にすることができます。条件は右のフィールドにスクリプトを記述して設定します。name=toggle_parmというトグルパラメータがオフの時グレーアウトさせたい場合は下記のようになります。Pythonでパラメータをつくろうパラメータ追加の基本~コード編~小難しい説明をする前に...こちらのコードをご覧ください。node.parmTemplateGroup()#作ったパラメータをグループに追加group.append(parm_float)#ノードのインターフェースへ反映するnode.setParmTemplateGroup(group)ついでに、削除するコードもおいておきます。node.parmTemplateGroup()#パラメータをグループから取得parm_float=group.find("test_parm")#パラメータをグループから削除するgroup.remove(parm_float)#ノードのインターフェースへ反映するnode.setParmTemplateGroup(group)hou.Parmとhou.ParmTemplatehouでパラメータを作成する際に、最初につまずきやすいポイントがあります。それは、パラメータに関するオブジェクトが「hou.Parm」オブジェクトと「hou.ParmTemplate」オブジェクトの2種類あることです。この二つの違いは、公式ドキュメント(日本語)によると以下のようになります。hou.Parm[https://www.sidefx.com/ja/docs/houdini17.5/hom/hou/Parm.html]ノードのパラメータ。各パラメータは、そのノード内で固有の名前を持ち、パラメータタプル内に存在します。[https://www.sidefx.com/ja/docs/houdini17.5/hom/hou/ParmTuple.html]タプル内の各パラメータは値を保存します。異なるノード内の異なるparmタプルのインスタンスは、独自のパラメータ値のセットを保存します。hou.Parmはhou.ParmTupleのエレメントとしてノード内に実際に存在し、それぞれのhou.Parmが固有の名前と値を持っています。パラメータタプルは、そのノードで保存された特定の値を保存します。パラメータタプルの記述は、hou.ParmTemplateで表現されます。パラメータテンプレートは、パラメータタプルのタイプ、デフォルト値、範囲などを記述します。hou.ParmTupleは「特定の値を保存」し、hou.ParmTemplateはそのhou.Parmが「どんなタイプでどんなデータを保持できるのか?を定義している」ということです。まわりくどくてわかりにくいですね。hou.ParmTemplate[https://www.sidefx.com/ja/docs/houdini17.5/hom/hou/ParmTemplate.html]ParmTemplateは、それが保持するパラメータとデータのタイプを記述しますが、パラメータの現行値を保存しません。hou.ParmTupleオブジェクト内のhou.Parmオブジェクトのみが実際にパラメータ値を保存します。hou.ParmTupleをParmTemplateのインスタンスとして考えることができます。hou.ParmTupleをParmTemplateのインスタンスとして考えることができます。だいじなことなので2回言いました。ParmTemplateオブジェクトが単なるデータコンテナで、それらのオブジェクトはHoudini内のオブジェクトと何も関係性がないことに注意してください。「何も関係性がない」というのは、hou.Parmは実際にノード上に存在している一方、hou.ParmTemplateはノード上に情報として持たれてはいるが存在していません。hou.ParmTemplateをいくら編集しても、(その結果を反映させる処理を走らせない限りは)ノードやその他hou.Parmに影響を与えられません。...どういうことだってばよ...?というのは簡単なコードを見ていけば、理解の助けになるかと思います。パラメータ追加の基本~解説編~これらを踏まえたうえで上記コードを一つずつ見ていきましょう。1ノードを取得node=hou.pwd()hou.pwd()によって、このコードをもつノード自身のhou.Nodeオブジェクトを取得します。2パラメータをつくるこれから追加したいParmTemplateオブジェクトを作成します。hou.FloatParmTemplate("test_parm","Test",1)上記で「ParmTemplateは保持するパラメータとデータタイプをもつ」と説明しましたが、ここで実際に記述しています。簡単な言葉にすると「どのようなパラメータか」の情報を持っていますが、「今このパラメータにどのような値がはいっているか」の情報は持っていません。後者の情報は、この後でhou.Parmオブジェクトになった後にもつことができるようになり、そこではじめてhou.Parmオブジェクトを評価し値を得ることができるようになります。node.parmTemplateGroup()4作ったパラメータをグループに追加group.append(parm_float)今回の例ではhou.ParmTemplateオブジェクトが1つしかないのですが、これをなん十個も作るときもあれば、特定のフォルダに入れたり特定の順番にならべたりしたいときもあると思います。hou.ParmTemplateオブジェクトをまとめるためのからっぽのグループをここで定義しておきます。5ノードのインターフェースへ反映するnode.setParmTemplateGroup(group)作成したParmTemplateGroupを、ノードに反映させます。ノードに反映されてはじめて、設定したものがhou.Parmとなり、値を入れたり評価したりが可能になります。図では箱をひっくり返しているので、setParmTemplateGroup()したらParmTemplateGroup()がからっぽになるイメージになってしまいますが、実際は空っぽになりません。ノードには同じ意味をもったhou.ParmTemplateとhou.Parmが存在することになります。これは、パラメータを消したいときに実感することができます。6パラメータを削除する#パラメータをグループから取得parm_float=group.find("test_parm")#パラメータをグループから削除するgroup.remove(parm_float)#ノードのインターフェースへ反映するnode.setParmTemplateGroup(group)既存のグループから消したいhou.ParmTemplateを指定し、hou.ParamTemplateGroupから削除、その結果をインターフェースへ反映させます。removeした直後ではノードのパラメータエディタ上では削除結果が反映されません。.setParmTemplateGroup()をしてはじめて削除されます。ParamTemplateGroupはParmを管理するためのParmTemplateの名簿で、実際に反映されるのはsetParmTemplateGroupと覚えておくと最初のうちはよいかもしれません。おまけhouモジュールを使用したPythonでの記述がわかっても、「そのスクリプトをいつ実行するのか?」が、初心者にとっては地味なつまずきポイントだと思います。(わたしも、最初はコード書く→勝手に実行される→無意味なテスト用パラメータが無限増殖するということを繰り返していました)解決案わかりやすいのは、ボタンパラメータのコールバックスクリプトで、上記コードを実行することだと思います。1Stringパラメータを作成します。Stringにチェックを入れて、languageをPythonに設定2ボタンパラメータを作成します。Scriptに下記コードを記載します。add_codeの部分はコードが記載してあるStringパラメータのnameにあわせます。exec(hou.evalParm('add_code'))なにがうれしいのかこの方法ですとボタンとコードの位置が近くて気軽にポチポチ試すことができます。Propatiesを行き来するのは地味に面倒くさいんですよね。良い方法があればぜひ教えていただきたいです。おわりに今回の記事は以上です。パラメータを作成する方法はいくつかありますが、そのうち(おそらく)ベーシックなものの基礎的な部分をまとめてみました。記事を読んでくれた方の参考になれば幸いです。upLoginユーザーは見つかりませんでした。