27
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

HoudiniAdvent Calendar 2016

Day 2

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

Last updated at Posted at 2016-12-01

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

#Expression
緑はパラメータがExpressionで制御されている状態です。
▼例として$F
00.png

Expressionを入力した直後はLabel(上の図での"Size")の後ろに白っぽいグレーの色が付きます。
これは、計算された値→Expressionの表示に切り替わった事を示しています。Expression→計算された値にする場合はLabelをクリックします(右クリックからToggle Expressionでも可)
▼ 左:計算された値 右:Expression
1.6.png

▼補足として…式や変数じゃなくともToggle Expression可能です。浮動小数点の誤差には気を付けましょう。
1.7.png

▼Houdini15ぐらいから@もパラメータで利用できます
(ただし、ノードによって利用できるattributeのタイプが異なります。例えばtransformノードではDetailのattributeしか利用できません。対してpointノードのように各point毎に実行されるものについては、@P.xのようなpointのattributeが利用できます)
2s.png

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

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

if($F==1){
    return 1;
}

3.1.png

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

{
 if($F==1){
     return 1;
 }
}

これで上手くいきます。

#Edit String
パラメータ全体に括弧をつける必要のないものもあります。
それがStringパラメータです。よく利用するStringパラメータとしては
例えばgroupやfile、Wrangleなどです。
4.1.png

しかし、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を利用したほうが良いでしょう。
以上

27
19
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
27
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?