Houdini 20.0 パーティクル

パーティクルのVEXエクスプレッションを記述する

On this page

背景

Houdini13以前のパーティクルのワークフローで強力で使用頻度の高かった機能は、 ローカル変数 でした。 ローカル変数は、パーティクルノードのほとんどのパラメータで使うことが可能で、パーティクル単位で変化させることができました。

新しいダイナミクスパーティクルのワークフローでは、これらの類のエクスプレッションが VEXエクスプレッション に置き換わっています。 VEXエクスプレッションは、古いローカル変数が抱えていた以下の問題の解決を試みます:

  • ローカル変数は遅かった(VEXと比較して)。

  • ローカル変数はシングルスレッドでした。マルチスレッドなエクスプレッションを記述することは可能でしたが、ほとんどのエクスプレッション関数がスレッドセーフ(マルチスレッドで問題が起きない)ではなかったので、全体のシステムがシングルスレッドの動作に戻していました。

  • アトリビュートのローカル変数へのマッピングが特異で曖昧でした(例えば、Cd.xのアトリビュート値にアクセスするには、$CRのローカル変数を使っていました)。

  • ローカル変数は難しかったです。中には単純なものもありました。例えば、rand($ID)がそうです。しかし、複雑なエクスプレッションになるほど直ぐに行き詰まってしまいました。さらに、一般的な評価に基づいてパラメータを設定したい時に、スペアパラメータ(ユーザパラメータ)を補助として使わなければなりませんでした。

パーティクルノードにVEXを使用

VEXエクスプレッションをサポートしているノードのパラメータインターフェースには、パラメータのブロック毎に、 Use VEXpressions チェックボックスがあります。

  • チェックボックスをオフにすれば、パラメータは標準のエクスプレッション言語を使いますが、 それらの値はパーティクル単位で変化させることができません

  • このチェックボックスをオンにすれば、マルチラインエディタが表示されるので、そこでVEXコードのスニペットを記述することで、タイムステップ毎にパーティクル単位で評価することができます。

VEXpressionsは、VOPを置き換えるためのものではなく、VOPを強化させるためのものでした。

VEX構文の@は、アトリビュートを意味しています。Houdiniでは既にグループで@構文を使用しています。 この構文は、アトリビュートがベクトル型、浮動小数点型、整数型、文字列型か判断する方法がなかったのでVEX用に変更されました。 v@のように接頭辞を追加することで、そのタイプをベクトル型として定義し、i@なら整数型、s@なら文字列型として定義します。

役立つ情報

  • マルチラインエディタで編集している時に⌃ Ctrl + Enterを押すと、その変更を“確定”してHoudiniを更新することができます。

  • 各マルチラインエディタには便利な既製のVEXスニペットを含んだドロップダウンメニューがあります。そのメニューのPass through項目は、単にパラメータ自身をブロック内のパラメータの名前に割り当てるだけです(例えば、wind = wind;)。これは独自コードの記述を始める上でパラメータ値を上書きするのに役に立ちます。パラメータ値をこのようにパラメータ自体に割り当てることは 必須ではありません 。単にスニペットで変更したい値のリストを設定するだけです。

VEXの記述

VEXエクスプレッションはHoudiniエクスプレッション言語ではなく、VEX言語から派生した言語を使います。

  • 使用頻度の高いエクスプレッション関数のほとんどがVEX関数と名前が同じです(例えば、chchschramppointrelbboxrandなど)。

  • パラメータの内部名(例えば、windspeed)を使ってパラメータ値にアクセスすることができ、@attribute_nameを使えばアトリビュートにアクセスすることができます。

  • Point Wrangle SOPなどの“wrangler”ノードで使う構文はVEXエクスプレッションの構文と同じです。しかし、“wrangler”ノードは直接アトリビュート値を設定することでジオメトリに影響を与えるのに対して、パーティクルノードは、 アトリビュート値を変更することができません (以下のエクスポートを参照)。代わりに、パーティクルノードは、 パラメータとアトリビュートの値を読み込んで それに応じてパラメータ値を修正することで動作します。これは、 パーティクル毎にノードのパラメータの値を変更する ことができます。

    // パーティクル毎にwindresistanceをランダム化します。
    windresist *= rand(@id);
    // パーティクルの生存時間が長くなるにつれて風の速度が速くなります。
    windspeed *= @nage;
    
  • パラメータ値を上書き(例えば、force = {0, 1, 0} * rand(@id);)するのではなく、既存のパラメータ値を修正するべきです(例えば、force *= float(rand(@id));)。そうすることで、パラメータインターフェースを使ってエフェクトを変化させることができ、VEXコードを編集するよりも簡単です。

特殊な構文、VEXエクスプレッションとHScriptエクスプレッションとの違い、グループメンバーのテストの方法、現行時間などのグローバル変数へのアクセス、トラブルシューティングなどに関する情報は、VEXスニペットを参照してください。

エクスポート

デフォルトでは、パーティクルノードのみが変更したいアトリビュートをエクスポートします。これによって、誤って@massのようなアトリビュートを作成してしまい、それらのアトリビュートが読み込まれようとすることを回避します。

しかし、デバッグする時には、パーティクル上の任意のアトリビュートを書き出すことで、ジオメトリのスプレッドシート内でそのアトリビュートの値を確認することができるので、時には役に立ちます。

アトリビュートを強制的に書き込み可能にさせるには、exportキーワードでアトリビュートを宣言します:

export float @mytest = 0;
See also

パーティクル

はじめよう

挙動

次のステップ

リファレンス