h15 polyExtrude

Houdini 15 からの PolyExtrude

Houdini 15 から Polygon Extrude の機能が大幅に強化され。非常に強力になった。例えば

反面、過去に行えていたことが出来なくなった部分もある。その一つが Hscript を元にしたローカル変数の使用。ここでは、それを回避するための新しい方法を紹介。

使用バージョン: Houdini 15.0.291 (11/18追記: これからダウンロードするのであれば 15.0.297 以降を推奨。大幅なパフォーマンス向上およびバグ修正あり。
参考シーンファイルへのリンクは一番下にあり。

Houdini 14 で出来たこと

Houdini 14 およびそれ以前では、PolyExtrude の Local Translate Z に $PR 等を元にしたエクスプレッションを挿入して、面のIDを元にした Extrude が可能だった。例えば、

fit01( rand($PR), 1, 3) // Houdini 15 では不可。This will NOT work in H15.

こうすると、下のような結果を得ることが出来た。

このシーンファイルは、ここから入手可能。

このアプローチには問題もあった:

  • Hscript がシングルスレッドであること
  • 結果、小さいものであればお手軽に動かせるが、大きなデータには非効率である。

Houdini 15 での方法

上と同様のことを Houdini 15 で作成する方法を以下に紹介。

  1. Create シェルフの Grid を Ctrl クリック、原点に grid_object1 を作成。i キーを押すなり、ダブルクリックするなりして中に入る。
  2. grid1 のサイズを 4x4 から 10x10に変更 (しなくとも良いと思うが)。
  3. grid1 の出力から、TAB->Attribute->Attribute Wrangleを作成。Attribute Create ではなく、Attribute Wrangle を使う理由はこちらを参照のこと。

    attribwrangle1 が出来る。ちなみに確定時に Enter ではなく、Shift+Enter を押すと自動的に作成されたノードに表示フラグが移動する。これは H15 からの新機能。
    • Run Overを Primitive (面) に
    • VEXpression の部分に

      i@xamount = @primnum;

      と入力し、フィールド外の部分をクリックしてリフレッシュ。"xamount" は予約語ではないので何でも良い。primnumはVEX/Wrangle 言語を元にした Hscript の $PR に相当する面のIDを返す変数。予約語。

    Geometry Spreadsheet で Primitive の項を見れば、面の ID と同じ値が xamount アトリビュートの値としてアサインされていることがわかる。
  4. attribwrangl1 の出力から、TAB->Polygon->PolyExtrudeを作成。
    • Divide Into を Individual Elements に
    • Distance を 1 に
    • Front Group のトグルをオンに (後々使用)
    • ずっと下のほう、Z Scale のトグルを オンにし、有効になったフィールドに attribwrangle1 ノードで定義した xamount を指定。
    これで、各面が xamount アトリビュートの値、つまりは各面の ID 値をもとに突き出された。
    • Distance を 0.1 にするとビューポートに収まる。

      Distance を調整することで Z scale で指定したアトリビュート値と組み合わせた設定がエクスプレッションを詰め込まなくとも可能になった。その他にも、非常に多くの機能強化が盛り込まれている。
  5. 突き出しの値を面単位でランダム化するため、 TAB->Attribute->Attribute Randomize を実行。できた attribrandomize1 ノードを attribwrangle1 と polyextrude1 の間に挿入する。
    • Attribute Class を Primitives に
    • Attribute Name を attribwrangle1 ノードで定義した xamount に
    • Operation を Multiply に
    • Distribution タブ以下の Dimensions の値を1 に
    すると、以下のようになる。

    Distribution タブ以下の Distribution を Uniform (デフォルト)から他に変える事で様々なランダム方法を試すことが可能。
  6. 突き出しの前面を着色するには、polyextrude1 の出力から TAB->Material->Color を実行。
    • Group にpolyextrude1 で作成した extrudeFront を指定
    • Class を Primitive に
    • Color Type を Random に
    その結果がこちら。

    これでほぼ同じことが出来た。
  7. H14 のサンプルファイルと同じように、この平面オブジェクトを三角関数を使って移動させ、影響範囲を限定するには、同じ要領が適用可能。まず、grid1 と attribwrangle1 の間に transform1 を挿入。
    今回は、Hscript の代わりに Python を使って記述。
    • Hscript では、以下のように記述した。
      sin ($FF* 3)* 5
    • Pythonでは、次のようになる。
      sin (radians(frame() * 3))* 5
      パラメータフィールドに Pythonベースのエクスプレッションを記述する手っ取り早い方法は、何かエクスプレッションを書いた上で、RMB->Expression->Change Language to Python を実行。Hscript は背景が緑だが、Python は赤。

      Python は、Houdini に無関係に、角度の指定はラジアン。
  8. transform1 と attribwrangle1 の間に Group ノードを挿入。
    • Entry を Primitive に
    • Operation を Group By Expression に
    • Filter Expression に @P.x > 0
    • このグループ (group1) を polyextrude1 の Group フィールドに指定し、再生すれば上記 H14と同じアニメーションを再現可能。

まとめ

  • Hscript ベースから脱却し、VEX/Wrangle ベースに移行することで、より効率の良いネットワーク構築が可能になる。
  • シーンファイル: h15_polyExtrude.hip (104KB)
  • これからダウンロードするのであれば 15.0.297 以降を推奨。大幅なパフォーマンス向上およびバグ修正あり。

0 件のコメント:

コメントを投稿