Height Field を作成し、その出力に HeightField Wrangle を追加。VEXpression に
@mask = 1; // Aとすれば、マスク全体が 1 に設定される。
VEXpression を ` (バックティック) を使って以下のように変更しても問題なく評価される。
@`"mask"` = 1; // C
また chs で layername パラメータを作成、そのパラメータを mask と定義し、VEXpression を 以下のようにしても問題なく評価される。
@`chs("layername")` = 1; // D
しかし以下のエクスプレッションでは、構文は正しくとも、マスクは期待通りに設定されない。
string layername = "mask"; @`layername` = 1; // B
使用したビルド: Houdini 18.0.491 (Windows 10)
シーンファイルへのリンクは一番下にあり。
VEXpression でのバックティック
- ` (バックティック) で囲んだ部分は、Unix でのコマンド置換同様に機能
よって、- 二つのバックティック間のコマンドを評価
- その結果が文字列としてコマンドを置換
`"mystring" を返すコマンド`
は
mystring
で置き換えられる。 - バックティック間で使えるのは HScript 関数の構文のみ
これがそもそものまごつきの原因の可能性があるが、例えば、上の D にある chsは、Hscript 関数でもあり VEX 関数でもある。実際には、- Hscript chs が評価され
- その結果が VEX スニペットとして挿入される
- このスニペットがコンパイルされ実行される
- "VEXpression" ラベルを MMB クリックすることで置換を視認可能 この要領で見れば、B の例
string layername = "mask"; @`layername` = 1; // Bは
string layername = "mask"; @layername = 1;と置換されていて、これではうまくいかないことがわかる。
VEX バインディング
Bindings タブで layername と mask をバインドすることで B の VEXpression を期待通りの挙動にすることが可能。Volume Wrangle ノードの Bindings タブに行き、
- Autobind by Name をオフ
- Number of Bindings を 1
- Primitive Name に mask
- VEX Parameter に layername
まとめ
- なおバックティック間のエクスプレッションの結果が変わると VEX コードは再コンパイルが必要。コードの複雑さによっては無視できないコストとなることもある。
- シーンファイル: h18_vex04.zip (20KB)
- その他エクスプレッションに関して
0 件のコメント:
コメントを投稿