1. saty

    No comment

    saty
Changes in body
Source | HTML | Preview

好きなノードの1つである Switch について書いてみます。
Switchは処理が分岐できるので、ツールを作る時によくお世話になります。
(環境)Houdini 17.0.352 / Windows 10

Switch の基本としては、Select Input のところで入力ノードを切り替えることができます。
上矢印で入力順を変更することもできます。
この Select Input には数字が渡されていれば良いので、エクスプレッションを使ってあの手この手で入力を切り替えることになります。

余談ですが、Switch に限らず Shift+R キーで入力順を変更もできるようです。

CheckBox

まずGeometryノードのインターフェイスを編集します。
右クリックから Edit Parameter Interface を選びます。

Toggle パラメータを選んでインターフェイスに追加します。
名前は checkBox にしてみました。見やすいよう他は Invisible にしておきます。
Applyするとチェックボックスができます。

このチェックボックスの上で右クリックから Copy Parameter をして
Switch の Select Input の上で右クリックから Paste Relative References をすると
チェックの有無のブール値(真=1/偽=0)を受けて Input が切り替わる Switch ができました。

Radio Button

ラジオボタンのインターフェイスを作ります。
チェックボックスはON/OFFの二値ですが、ラジオボタンは複数の選択肢から1つを選びます。

先程と同様に、右クリックから Edit Parameter Interface を選びます。
Folder を追加し、Folder TypeRadio Buttons にします。
Name は任意ですが radio にしてみます。
この Folder がラジオボタンになりますので、選択肢の数だけ増やします。
2つ目以降の Folder は Name が勝手に連番になり、グレーアウトして編集できなくなります。セットで扱われる、ということのようです。

switch ノードの Select Input には
ch("../radio1")
と、Folder の Name の末尾に「」をつけたものを記入します。
フォーラムによると

"1" is first element in the set.

とのことで、フォルダセットの1つめ、という事のようです。
ラジオボタンで Input が切り替わる Switch ができました。

Random CopyStamp

Copy Stamp ノードで複製するモデルを、Switch でランダムに切り替える方法です。
こちらはチュートリアルなども多いので、簡単に触れます。

Copy Stamp ノードの Stamp タブで、Stamp Inputs にチェックを入れて有効にし、
下部の欄に変数名とエクスプレッションを入れます。
この例では下記のように入れました。
変数名: switcher
値: floor(fit01(rand(@ptnum),0,3))

分解すると、
rand( ランダムシード )で、ランダムな0~1の少数点の値を生成します。ランダムシードに @ptnum を入れることで、各point番号ごとにランダムな値が入ることになります。
fit01( 元の値 , 新しい範囲の最小値 , 新しい範囲の最大値 )で、ランダムな0~1の値を、0以上3未満に拡大しています。
floor()で、小数点を切り捨てて、0,1,2 の値になります。
この 0,1,2 の3つの値を Select Input に渡します。

switch の Select Input 側には下記を入力します。
stamp("../copy1","switcher",0)
先程の Copy Stampノードの 「switcher」という変数を受け取ります、受け取れなければ「0」にします。

3つのモデルがランダムで切り替わるようになりました。

Input 数に応じた Random CopyStamp

切り替えるモデルの数を増やすごとに、エクスプレッションの数字を変更するのは面倒なので、
Switchノードのインプット数を取得し、勝手にその値が入るようにします。
floor(fit01(rand(@ptnum),0,opninputs("../switch1")))

opninputs(ノード名)を使って、fit01の「新しい範囲の最大値」の部分に、switchノードのインプット数が入ります。

Input の有無を判定する Switch

HeightField 関連のノードでよくある、「マスク入力のある時は…」というように、インプットの有無を判定して処理を分岐させる方法です。
そのままHeightField系の中身を参考にしました。

switch の Select Input に下記のように書きます。

if(strcmp(opinputpath("../null1", 0), ""), 1, 0)

要約すると、null1ノードにインプットがある場合は、1にスイッチします。

分解すると、
opinputpath(ノード, インプット番号)
指定したノードの指定インプットに接続されたノードのフルパスを返します。
null1にインプットがあればそのフルパスを返し、無かったら空「""」になります。

strcmp(文字列1, 文字列2)
文字列を比較し、ASCII順でどちらが前か、あるいは同じか、を数字で返します。
空の場合("","")の比較では同じなので「0」を返します。
フルパスの場合(フルパス,"")の比較ではフルパスのほうが後ろに来るので「1」を返します。

if(expression, 真の時の値, 偽の時の値)
最初のexpressionの真偽値に応じて、2番目または3番目の値を返します。
ここでstrcmpの結果をブール値として扱っています。
strcmpの結果が「1」の場合、「真の時の値」の値「1」が使われます。
strcmpの結果が「0」の場合、「偽の時の値」の値「0」が使われます。
結果、フルパスが入っているならインプット1、無いならインプット0にスイッチします。


以上、少し説明がくどいかもしれませんが、お役に立てば幸いです。