この記事は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を利用したほうが良いでしょう。
以上