1. saty

    No comment

    saty
Changes in body
Source | HTML | Preview
@@ -1,85 +1,99 @@
好きなノードの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 Type** を **Radio Buttons** にします。
**Name** は任意ですが `radio` にしてみます。
この Folder がラジオボタンになりますので、選択肢の数だけ増やします。
2つ目以降の Folder は Name が勝手に連番になり、グレーアウトして編集できなくなります。セットで扱われる、ということのようです。
switch ノードの Select Input には
`ch("../radio1")`
と、Folder の Name の末尾に「**1**」をつけたものを記入します。
フォーラムによると
>"1" is first element in the set.
とのことで、フォルダセットの1つめ、という事のようです。
ラジオボタンで Input が切り替わる Switch ができました。
##Random CopyStamp
**Copy Stamp** ノードで複製するモデルを、Switch でランダムに切り替える方法です。
こちらはチュートリアルなども多いので、簡単に触れます。
Copy Stamp ノードの Stamp タブで、**Stamp Inputs** にチェックを入れて有効にし、
下部の欄に変数名とエクスプレッションを入れます。
この例では下記のように入れました。
-`fit01(rand(@ptnum),0,2)`
-
+変数名: `switcher`
+値: `floor(fit01(rand(@ptnum),0,3))`
+
+
分解すると、
-`rand(@ptnum)`で、ランダムな0~1の少数点の値を生成します。ランダムシードは `(@ptnum)` の部分で、「各point番号ごとにランダムな値が入ったことになります。
-`fit01(元の値,新しい範囲の最小値,新しい範囲の最大値)`で、0~1の値を、0~2に拡大しています。
-Inputの数が3つなので、0,1,2 の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つのモデルがランダムで切り替わるようになりました。
+
+
-綺麗に整数値にするにはfloor関数等を加えると良いのかもですが、switchノードは勝手に丸めてくれるみたいで便利です。
##Input 数に応じた Random CopyStamp
+切り替えるモデルの数を増やすごとに、エクスプレッションの数字を変更するのは面倒なので、
+Switchノードのインプット数を取得し、勝手にその値が入るようにします。
`floor(fit01(rand(@ptnum),0,opninputs("../switch1")))`
+`opninputs(ノード名)`を使って、fit01の「新しい範囲の最大値」の部分に、switchノードのインプット数が入ります。
+
##Input の有無に応じた Switch
```opinputpath("../null1", 0)```
指定した入力に接続されたノードのフルパスを返します。
null1にインプットがあればそのフルパスを返し、無かったら何も返さない
```strcmp(s1, s2)```
s1とs2が同じなら0を返します。
(入力なし,"")の比較では同じなので「0」を返す
(フルパス,"")の比較ではs1のほうが後ろに来るので「1」を返す
if expression function
```if(expression, true_value, false_value)```
最初の引数の真理値に応じて2番目または3番目の引数の値を返します。
if(比較の結果が1)…true
if(比較の結果が0)…false
フルパスが入っているならインプット1、無いならインプット0を使う
```
aaa
```