Created on | Updated on

Houdini でプログラミング:アトリビュート

概要

001.jpg

Houdini での制作は基本的にノードベースであり、プログラミングを必要としません。
しかし Houdini がサポートする PythonやWrangle などの言語を使うことで、これらのノードを制御し、さらに柔軟な表現が可能になります。

002.jpg

本記事では、Wrangle と Python でアトリビュートを操作する手法を紹介します。
アトリビュートの新規作成、値とタイプの取得をします。

アトリビュートの新規作成

Wrangle:addattrib(), setattrib()

mceclip9.pngmceclip10.png
アトリビュートの追加には addattrib() を使います。
Attribute Wrangle を選択し、Run Over を Point にします。もしくは最初から Point Wrangle を選択しても同じ結果が得られます。

アトリビュートを追加したいノードを入力し、Wrangle のコード部分に

addattrib(書き出し先のジオメトリハンドル, "アトリビュートのクラス", "アトリビュート名", 初期値) を入力します。

geometry spreadsheet から、入力ノード(grid)には無い新しいアトリビュート「newAtr」が初期値 0 で追加されたことが確認できます。

mceclip11.pngmceclip13.png
ただ、addattrib() だけではアトリビュート全体の初期値しか指定できないため、全体もしくは個別で値を変更するにはsetattrib() を使用します。

setattrib() の引数に関しては SideFX の解説をご覧ください。
https://www.sidefx.com/ja/docs/houdini/vex/functions/setattrib.html

オプション次第で、何番目のアトリビュートを変更するか、値の更新のほかに加算、最大値最小値の指定などもできます。

Python:addAttrib(), setAttribValue()

mceclip0.pngmceclip1.png
Python の場合は addAttrib() を使います。引数は可変で、前三つのアトリビュート型、名前、初期値さえあれば最低限作れます。

mceclip2.png
しかし、新しく作ろうとしたアトリビュート名が既に存在していた場合はエラーが発生してしまいます。

mceclip5.pngmceclip6.png
このエラーを回避するために、findPointAttrib(name) などで予めアトリビュートが存在するか確認する必要があります。
スプレッドシートから、newAtr が存在していたため初期値 4.0 の newAtr は作られず、newAtr2 が新しく作られたことが確認できます。

mceclip8.png
Wrangle と同様、addAttrib() だけでは初期値しか設定できないため、値を変更したい場合は setAttribValue() を使います。

変更したい名前のアトリビュートが存在しなかったり、そのアトリビュートのデータの型が引数と一致しない場合、エラーが発生します。これを防ぐには、findPointAttrib() 等でアトリビュートが存在するか確認してから値をセットするなどの方法が考えられます。

値を取得

Wrangle:getattribute()

mceclip14.pngmceclip15.png
getattribute() で任意のアトリビュートの値を取得できます。printf() でコンソールに出力すると、スプレッドシートと一致していることが確認できます。

mceclip16.png
また、getattribute() は引数が多いため、簡潔にしたい場合はアトリビュートの型に合った他の関数を使って簡単に値を取得することもできます。

Point 型のアトリビュートが欲しい場合は point() を使えば、簡単に同様の結果が得られます。

Python:attribValue()

mceclip17.pngmceclip19.png
Python で同様のことをする場合は attribValue() を使います。取得する値の型によって、intAttribValue() や floatAttribValue() なども使います。

アトリビュートのタイプを取得

Wrangle:pointattribtype()

mceclip5.png
pointattribtype() を使って、任意のアトリビュートのタイプを取得することができます。
上の例では "newAtr" のタイプが 1 と出力されていますが、返り値によってタイプが割り当てられており、0 が int 型、1 が float 型などで判別できます。

Python:findAttrib()

mceclip20.png
取得するアトリビュートの型に合わせて、findPointAttrib() や findPrimAttrib() などを使い分けます。

問題が解決しない場合は、Born Digital サポートまでお問い合わせ下さい。

サポート問い合わせ