概要
Houdini での制作は基本的にノードベースであり、プログラミングを必要としません。
しかし Houdini がサポートする PythonやWrangle などの言語を使うことで、これらのノードを制御し、さらに柔軟な表現が可能になります。
本記事では、Wrangle と Python でアトリビュートを操作する手法を紹介します。
アトリビュートの新規作成、値とタイプの取得をします。
アトリビュートの新規作成
Wrangle:addattrib(), setattrib()
アトリビュートの追加には addattrib() を使います。
Attribute Wrangle を選択し、Run Over を Point にします。もしくは最初から Point Wrangle を選択しても同じ結果が得られます。
アトリビュートを追加したいノードを入力し、Wrangle のコード部分に
addattrib(書き出し先のジオメトリハンドル, "アトリビュートのクラス", "アトリビュート名", 初期値) を入力します。
geometry spreadsheet から、入力ノード(grid)には無い新しいアトリビュート「newAtr」が初期値 0 で追加されたことが確認できます。
ただ、addattrib() だけではアトリビュート全体の初期値しか指定できないため、全体もしくは個別で値を変更するにはsetattrib() を使用します。
setattrib() の引数に関しては SideFX の解説をご覧ください。
https://www.sidefx.com/ja/docs/houdini/vex/functions/setattrib.html
オプション次第で、何番目のアトリビュートを変更するか、値の更新のほかに加算、最大値最小値の指定などもできます。
Python:addAttrib(), setAttribValue()
Python の場合は addAttrib() を使います。引数は可変で、前三つのアトリビュート型、名前、初期値さえあれば最低限作れます。
しかし、新しく作ろうとしたアトリビュート名が既に存在していた場合はエラーが発生してしまいます。
このエラーを回避するために、findPointAttrib(name) などで予めアトリビュートが存在するか確認する必要があります。
スプレッドシートから、newAtr が存在していたため初期値 4.0 の newAtr は作られず、newAtr2 が新しく作られたことが確認できます。
Wrangle と同様、addAttrib() だけでは初期値しか設定できないため、値を変更したい場合は setAttribValue() を使います。
変更したい名前のアトリビュートが存在しなかったり、そのアトリビュートのデータの型が引数と一致しない場合、エラーが発生します。これを防ぐには、findPointAttrib() 等でアトリビュートが存在するか確認してから値をセットするなどの方法が考えられます。
値を取得
Wrangle:getattribute()
getattribute() で任意のアトリビュートの値を取得できます。printf() でコンソールに出力すると、スプレッドシートと一致していることが確認できます。
また、getattribute() は引数が多いため、簡潔にしたい場合はアトリビュートの型に合った他の関数を使って簡単に値を取得することもできます。
Point 型のアトリビュートが欲しい場合は point() を使えば、簡単に同様の結果が得られます。
Python:attribValue()
Python で同様のことをする場合は attribValue() を使います。取得する値の型によって、intAttribValue() や floatAttribValue() なども使います。
アトリビュートのタイプを取得
Wrangle:pointattribtype()
pointattribtype() を使って、任意のアトリビュートのタイプを取得することができます。
上の例では "newAtr" のタイプが 1 と出力されていますが、返り値によってタイプが割り当てられており、0 が int 型、1 が float 型などで判別できます。
(Houdini 18.5)VEX で dict 型が扱えるようになりました。 dict 型のアトリビュートを指定したときの返り値は 6 になります。
Python:findAttrib()
取得するアトリビュートの型に合わせて、findPointAttrib() や findPrimAttrib() などを使い分けます。