パラメーターには何が入るのか？Edit String＆Expression

この記事はHoudini Advent Calendar 2016の二日目の記事です。
#パラメータに入るのは値だけではない
パラメータって値を入れるだけじゃないの？値が入らなかったり緑になったり訳がわからん！

#Expression
緑はパラメータがExpressionで制御されている状態です。
▼例として$F
![00.png](https://qiita-image-store.s3.amazonaws.com/0/151589/51f6ebc6-ab31-49ff-a9a6-7365470c9a1d.png)

Expressionを入力した直後はLabel(上の図での"Size")の後ろに白っぽいグレーの色が付きます。
これは、計算された値→Expressionの表示に切り替わった事を示しています。Expression→計算された値にする場合はLabelをクリックします(右クリックからToggle Expressionでも可)
▼　左：計算された値　右：Expression
![1.6.png](https://qiita-image-store.s3.amazonaws.com/0/151589/4f670ec5-47b4-76a9-f0c8-d2b7871cdeb9.png)

▼補足として…式や変数じゃなくともToggle Expression可能です。浮動小数点の誤差には気を付けましょう。
![1.7.png](https://qiita-image-store.s3.amazonaws.com/0/151589/335cdae8-de4b-0076-7ea4-9aae49dba7b2.png)


▼Houdini15ぐらいから@もパラメータで利用できます
(ただし、ノードによって利用できるattributeのタイプが異なります。例えばtransformノードではDetailのattributeしか利用できません。対してpointノードのように各point毎に実行されるものについては、@P.xのようなpointのattributeが利用できます)
![2s.png](https://qiita-image-store.s3.amazonaws.com/0/151589/3748d27c-746d-2c5f-f164-38ab57543ade.png)


デフォルトではHScript(緑)です、Pythonに変更することもできます。
ギアマーク横のHマークをPythonに変更すると緑でなく赤色になります。
なるほど、Pythonは赤色なんだな！と思ってはいけません。まだ変わってません。
パラメータを右クリックしてChange Language Pythonを行って初めてPythonになります。
そう、緑と赤は右上で表示されているHScriptマーク、もしくはPythonマークに該当するものを見つけるための色付けだったのです。
▼pythonではローカル変数はlvar("TX2")のように利用できます。（例外的にhou.接頭辞は略せます）
![5s.png](https://qiita-image-store.s3.amazonaws.com/0/151589/779d85c6-d839-0282-c3aa-947fa017c4d5.png)


#Edit Expressionで複数行を
パラメータに複数行入れる場合は、ctrl+Eもしくは右クリックからEdit Expressionで入力しましょう。
しかし、何も考えず、
以下のように入れるとエラーが起こります。
▼たとえば、1フレーム時のみ値1を与えたい場合

```
if($F==1){
    return 1;
}
```
![3.1.png](https://qiita-image-store.s3.amazonaws.com/0/151589/960b2391-829c-df85-1826-9a871aa62d10.png)

なぜエラーになるかというと、全体を括る{}がないからです。
よって

```
{
 if($F==1){
     return 1;
 }
}
```
これで上手くいきます。

#Edit String
パラメータ全体に括弧をつける必要のないものもあります。
それがStringパラメータです。よく利用するStringパラメータとしては
例えばgroupやfile、Wrangleなどです。
![4.1.png](https://qiita-image-store.s3.amazonaws.com/0/151589/f7b32036-105d-7249-5059-0db9a2d84d7b.png)


しかし、StringでもExpressionを利用したい場合があります。その場合は　\`{}\`　を利用します。
String型であっても　\`(バッククォート)で囲った部分はExpressionとして機能します。
▼ファイル出力時のゼロパディング

```
$HIP/file_`padzero(4, $F)`.bgeo
```

▼1フレーム時のみgroup(Hello)を生成したい場合

```
`{
 if($F==1){
  string foo = "Hello";
  return foo;
 }
}`
```

最後に１つ。いつ使うねん！って感じですがExpressionのパラメータにバッククォート無理やり使って値を入れるためにはもう一変換必要となります。

```
atof("`{return 1;}`")
```

#よく使うExpression Function
http://www.andynicholas.com/?p=1344
を参考にしています。

| 関数 | 説明 |
|:-:|:-:|
|ch(parameter path)|パラメータの現在の値を取得|
|chf(parameter path,フレーム)|特定のフレームでパラメータの値を取得します|
|stamp(copySOP path,スタンプ変数,デフォルト値)|スタンプ変数の現在の値を取得|
|point(SOP path,ポイント番号,attribute,index)|point attributeを取得|
|prim(SOP path,ポイント番号,attribute,index)|primitive attributeを取得|
|clamp(value,min,max)|値を最小値と最大値の範囲内に|
|fit(value,min,max,newmin,newmax)|古い範囲の値を新しい範囲に再マップしクランプ|
|fit01(value,newmin,newmax)|fit()と同じ、valueは0から1|
|smooth(value,min,max)|最小値から最大値まで0から1の間でスムージングされた値|
|noise(x,y,z)|ノイズ|
|rand(seed)|乱数|
|length(x,y,z)|ベクトルの長さ|
|distance(x1,y1,z1,x2,y2,z2)|2点間の距離|
|bbox(SOP path,dimension type)|バウンディングボックス(dimension type：D_XMIN, D_YMIN, D_ZMIN, D_XMAX, D_YMAX, D_ZMAX, D_XSIZE, D_YSIZE, D_ZSIZE)|

その他
sin, cos, tan, asin, acos, atan, atan2, abs, pow, sqrt, ceil, floor, atof, dot, cross, deg, rad, exp, frac, hsv, rgb, min, max, log, log10, round, substr, strreplace

が利用できます。

#よく使うExpression Local Variables
| 変数 | 説明 |
|:-:|:-:|
|\$PT|ポイント番号|
|\$PR|プリミティブ番号|
|\$CY|現在のコピー番号|
|\$TX,\$TY,\$TZ|ポイントの位置|
|\$NX,\$NY,\$NZ|ポイント/プリミティブの法線|
|\$CR,\$CG,\$CB,\$CA|ポイント/プリミティブの色|
|\$VX,\$VY,\$VZ|ポイントの速度|
|\$BBX,\$BBY,\$BBZ|バウンディングボックス内の点の正規化された（0～1）位置|
|\$CEX,\$CEY,\$CEZ|ジオメトリの重心|
|\$AGE|パーティクルが生存している秒数|
|\$LIFE|パーティクルの正規化された年齢（0～1）|
|\$XMIN,\$XMAX,\$YMIN,\$YMAX,\$ZMIN,\$ZMAX|バウンディングボックスの範囲|
|\$SIZEX,\$SIZEY,\$SIZEZ|バウンディングボックスのサイズ|
|\$TX2,\$TY2,\$TZ2|2番目の入力から来るポイントの位置|

Expressionは便利ですが、ローカル変数は速度的に難があるので可能ならVEXを利用したほうが良いでしょう。
以上