1. saty

    No comment

    saty
Changes in body
Source | HTML | Preview
@@ -1,110 +1,110 @@
好きなノードの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 ができました。
+チェックボックスのブール値(真=1/偽=0)を受けて入力が切り替わる Switch ができました。
##Radio Button
ラジオボタンのインターフェイスを作ります。
-チェックボックスはON/OFFの二ですが、ラジオボタンは複数の選択肢から1つを選びます。
+チェックボックスはON/OFFの二ですが、ラジオボタンは複数の選択肢から1つを選びます。
先程と同様に、右クリックから **Edit Parameter Interface** を選びます。
-**Folder** を追加し、**Folder Type** を **Radio Buttons** にします。
-**Name** は任意ですが `radio` にしてみます。
+**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** にチェックを入れて有効にし、
下部の欄に変数名とエクスプレッションを入れます。
この例では下記のように入れました。
変数名: `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 に渡します。
+`rand(@ptnum)`で、各pointごとにランダムな0~1の少数点の値を生成します。
+`fit01( 元の値 ,0,3)`で、ランダムな0~1の値を、0以上3未満のレンジに合わせます。
+`floor()`で、小数点を切り捨てて 0,1,2 の整数値になります。
+各pointごとにランダムな 0,1,2 の値を作ることができたので、これを Select Input に渡します。
switch の Select Input 側には下記を入力します。
`stamp("../copy1","switcher",0)`
先程の Copy Stampノードの 「switcher」という変数を受け取ります、受け取れなければ「0」にします。
3つのモデルがランダムで切り替わるようになりました。
-##Input 数に応じた Random CopyStamp
+##Input 数を取得する Random CopyStamp
切り替えるモデルの数を増やすごとに、エクスプレッションの数字を変更するのは面倒なので、
Switchノードのインプット数を取得し、勝手にその値が入るようにします。
-`floor(fit01(rand(@ptnum),0,opninputs("../switch1")))`
+先程とほぼ同じエクスプレッションですが、最後の部分だけ違います。
-`opninputs(ノード名)`を使って、fit01の「新しい範囲の最大値」の部分に、switchノードのインプット数が入ります。
+`floor(fit01(rand(@ptnum),0,opninputs("../switch1")))`
-##Input の有無を判定する Switch
+`opninputs()`を使って、ランダムの最大値に switch ノードのインプット数が入ります。
-HeightField 関連のノードでよくある、「マスク入力のある時は…」というように、インプットの有無を判定して処理を分岐させる方法です。
-そのままHeightField系の中身を参考にしました。
+##Input の有無を判定する
-switch の Select Input に下記のように書きます
+「2番目の入力がある時は…」というように、インプットの有無を判定して処理を分岐させる方法です。
+HeightField関連ノードの中身を参考にしました
```
if(strcmp(opinputpath("../null1", 0), ""), 1, 0)
```
-要約すると、null1ノードにインプットがある場合は、1にスイッチします。
+null1にインプットがある場合は、1にスイッチします。
分解すると、
-`opinputpath(ノード, インプット番号)`
-指定したノードの指定インプットに接続されたノードのフルパスを返します。
-null1にインプットがあればそのフルパスを返し、無かったら空「""」になります。
+`opinputpath(ノード, インプット番号)`接続されたノードのフルパスを返します。
+この場合null1にインプットがあればそのフルパスを返し、無かったら空「""」になります。
`strcmp(文字列1, 文字列2)`
文字列を比較し、ASCII順でどちらが前か、あるいは同じか、を数字で返します。
-空の場合("","")の比較では同じなので「0」を返します。
フルパスの場合(フルパス,"")の比較ではフルパスのほうが後ろに来るので「1」を返します。
+空の場合("","")の比較では同じなので「0」を返します。
`if(expression, 真の時の値, 偽の時の値)`
最初のexpressionの真偽値に応じて、2番目または3番目の値を返します。
ここでstrcmpの結果をブール値として扱っています。
strcmpの結果が「1」の場合、「真の時の値」の値「1」が使われます。
strcmpの結果が「0」の場合、「偽の時の値」の値「0」が使われます。
結果、フルパスが入っているならインプット1、無いならインプット0にスイッチします。
___
-以上、少し説明がくどいかもしれませんが、お役に立てば幸いです。
+以上、少々くどくなってしまいましたが、お役に立てば幸いです。
+ありがとうございました。
+