この記事はHoudini Advent Calendar 2016の二日目の記事です。
#パラメータに入るのは値だけではない
パラメータって値を入れるだけじゃないの?値が入らなかったり緑になったり訳がわからん!
#Expression
緑はパラメータがExpressionで制御されている状態です。
▼例として$F
Expressionを入力した直後はLabel(上の図での"Size")の後ろに白っぽいグレーの色が付きます。
これは、計算された値→Expressionの表示に切り替わった事を示しています。Expression→計算された値にする場合はLabelをクリックします(右クリックからToggle Expressionでも可)
▼ 左:計算された値 右:Expression
▼補足として…式や変数じゃなくともToggle Expression可能です。浮動小数点の誤差には気を付けましょう。
▼Houdini15ぐらいから@もパラメータで利用できます
(ただし、ノードによって利用できるattributeのタイプが異なります。例えばtransformノードではDetailのattributeしか利用できません。対してpointノードのように各point毎に実行されるものについては、@P.xのようなpointのattributeが利用できます)
デフォルトではHScript(緑)です、Pythonに変更することもできます。
ギアマーク横のHマークをPythonに変更すると緑でなく赤色になります。
なるほど、Pythonは赤色なんだな!と思ってはいけません。まだ変わってません。
パラメータを右クリックしてChange Language Pythonを行って初めてPythonになります。
そう、緑と赤は右上で表示されているHScriptマーク、もしくはPythonマークに該当するものを見つけるための色付けだったのです。
▼pythonではローカル変数はlvar("TX2")のように利用できます。(例外的にhou.接頭辞は略せます)
#Edit Expressionで複数行を
パラメータに複数行入れる場合は、ctrl+Eもしくは右クリックからEdit Expressionで入力しましょう。
しかし、何も考えず、
以下のように入れるとエラーが起こります。
▼たとえば、1フレーム時のみ値1を与えたい場合
if($F==1){
return 1;
}
なぜエラーになるかというと、全体を括る{}がないからです。
よって
{
if($F==1){
return 1;
}
}
これで上手くいきます。
#Edit String
パラメータ全体に括弧をつける必要のないものもあります。
それがStringパラメータです。よく利用するStringパラメータとしては
例えばgroupやfile、Wrangleなどです。
しかし、StringでもExpressionを利用したい場合があります。その場合は `{}` を利用します。
String型であっても `(バッククォート)で囲った部分はExpressionとして機能します。
▼ファイル出力時のゼロパディング
$HIP/file_`padzero(4, $F)`.bgeo
▼1フレーム時のみgroup(Hello)を生成したい場合
`{
if($F==1){
string foo = "Hello";
return foo;
}
}`
最後に1つ。いつ使うねん!って感じですが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を利用したほうが良いでしょう。
以上