Houdini SwitchSOP

Category : CGTips · by 7月 4th, 2021

Houdiniでswitchを使ってsubnetに接続がある場合とない場合で処理を分けようとしたときに、色々と教えてもらったり、新しく分かったことがあるのでまとめます。

Switchの基本

複数の入力を入れて、Select Inputで分岐できます。

この場合は、0 sphete/1 box/2 tube で指定できます。

自動的に分岐させるには

エクスプレッション関数を使うと便利です。

$FF % 3

現在のフレーム数に従って0,1,2を繰り返します。(余剰の周期性)

Switchの内容を別のノードのパラメーターによって分岐させることもできます。

GridのポイントにFor each loopで配置するオブジェクトが、ループの反復回数(iteration)で0,1,2を繰り返します。

detail("../foreach_begin1_metadata1/", "iteration" , 0) % 3

detail関数で特定のノードのiterationアトリビュートを参照。

Subnetで使う場合の注意

subnetにつながったノードの有無で分岐する方法をやる前に、まずはswitchノードの接続によって変化するパターンを作ってみます。

ポイント数によって判別する方法

npoints(0) % 4

入力ノードのポイント数で分岐

0番の入力にはaddSOPでポイントを1つ作っているのでこの場合は1を返す。
エクスプレッションはboolとしても使えるので、

npoints(0) == 1

と書いた場合も入力0のポイント数は1なのでtue(1)が返ってきます。

ここからが本題

問題はこのようなsubnetを作ったとき、subnetに入力があれば赤く塗り、なにもつながっていなければ何もしないという処理にしたい

npoints(0) == 0にしているので、何もなかった場合はSwitchでnullが繋がれるので空っぽが出力されるはず…

しかし実際にはつながっていない場合は、subnetがエラーを起こしてしまうので使用することができません。

そもそもColorSOPなど、多くのノードは入力がない場合に「Not enough sources specified.」というエラーが出ます。これは、十分なソースがない、つまり入力がなにもないので処理できないというエラー。

Switchでも同じく入力がないとエラーになります。

subnetで入力がない場合は、この接続が切れているような状態なので色を付けることができないし、直接つないで判定に使うこともはできません。

ソースを必ず作る

これを解決するにはnullを繋ぐという解決方法があります。

nullによってinputがなかった場合でも、ソースを作り出すことができます。

colorノードはソースがない状態(何もつながっていない状態/定義されていない状態)ではエラーになりますが、point数が0でも処理は動きます。

他の判別方法

subnetの接続数で判別する方法

opninputs("..")

opninputsは最大の入力番号を返します。
パスが..なのでこの場合はsubnetの接続数をカウントします。subnetにつながっていない場合はnullが返るので何も行われず、つながっている場合はcolorへとつながります。inputの後にnullがなくとも動く例です。

ちなみにswitch自身への入力数を取りたい場合はこのようになります。

opninputs(".") - 1

パスが.なのでノード自身の入力数。switchは0始まりなので1ひいておくと、switchに接続されたノードの最大の値を返します。

subnetに接続したノードの名前で判別する方法

strlen(opinput("..", 0)) > 0

opinputは指定した入力に接続されたノードの名前を返します。この場合、subnetの入力0番目のノード名を検索し、strlenで文字列の文字数をカウントするので、何がつながっている場合はtrueになり、subnet以下の階層が処理されます。

今回の件で、nullノードの便利さ、エクスプレッションの書き方、エクスプレッションのパスなど、色々分かった気がします。
めんたいこさん、大翔士さん、ありがとうございました!

SHARE :