H15 if block


Houdini 15 から新しいループブロックノードタイプがVOPs内に追加された。これにより、従来は Subnet を使って行っていたループ処理がSubnetノードなしに組み込めるようになった。Subnetを使った方法はループのルーチンをカプセル化できたため視認し易かったが、Subnet 内外への行き来と結線が非常に面倒であった。

ここでは新しいBlockノードのうち、If文の作成方法を紹介。

  1. 元シーンの作成
  2. H14 までの方法
  3. H15 での方法
  4. まとめ
あわせて、細かい新機能のうち、
  • Shift + Enter によるノード作成
  • x キーによる VOP ノードでの Visualizeノードの作成
もあわせて紹介。

使用したバージョン: 15.0.179.22 (H15 Beta)
シーンファイルへのリンクは一番下にあり。

1. 元のシーン作成

Grid (ポリゴン平面)を作成しノイズを一部のみに与える。

  1. Grid 作成
    1. Size 10x10
    2. Rows と Columns をそれぞれ 100x100
  2. Attribute Vop を作成
    1. TAB->AttribVOPとタイプし、ノードを確定するために Enterの代わりに Shift+Enter を実行。これにより、grid1 と attribvop1 が自動的にノードが接続され、作成された attribvop1 に表示フラグが設定される。
    2. i キー押すなりダブルクリックするなりして、attribvop1 の中に入る。
  3. Anti-Aliased noise 作成
    1. TAB->AAnoise とタイプし、Shift+Enter で確定。aanoise1 ノードが作成され、自動的に geometryvopglobal1 の P 出力と、aanoise1 の pos 入力がつながる。
    2. aanoise1 の出力(noise) 上にカーソルを置き、 x キーを押すと Visualize ノードが出来る。

      この Visualize ノードによって、aanoise1 の結果がビューポートに表示される。
      • もう一度 x を押すと切れる。
      • 他のノードの出力にカーソルを配置して x を押せばそちらにつながる。
      • 例えば geometryvopglobal1 の P の上にカーソルを持ってきて x を押せばこちらに Visualize ノードが移る。

        ビューポートの様子
      • もう一度押せば切れる。
  4. aanoise1 の Signature を "1D Input, 1D Noise" から "3D Input, 3D Noise" に変更。
      aanoise1 の出力(noise) 上にカーソルを置き、 x キーを押すと visualize1 がここに戻る。
  5. Length ノード作成
    • TAB -> Length で length1 ノードを作成。ここでは Enter で確定。
    • Globalの P から接続。
    • 出力 (len) をクリック、x を押せば Visualize がこちらに移る。
  6. Compare ノードを作成
    1. TAB -> Compare で compare1 ノードを作成。
    2. Test を "< (less than)"
    3. Compare to Float の値を 3 にする
    4. カーソルを bool 出力の上に移し、x をクリックしてVisualize ノードをこちらに移す
    5. visualize1 の Visualizers タブ以下の Color Type を Ramp Attribute に変更

      (オブジェクトクリックするなり、カメラをタンブルするなり)再描画をかければ影響範囲が表示される。
  7. Two Way Switch を作成
    1. TAB -> Two Way Switch で twoway1 ノードを作成。
    2. compare1 の出力を twoway1 の Condition に
    3. aanoise1 の出力を input1 に
    4. Globals のCd を input2 に
    5. Visualize をはずし、twoway1 の出力を geometryvopoutput の Cd に接続
    これで元のシーンが完成。visualize1 は削除してよい。
ただし、この方法は常に AA Noise をすべての頂点に対して演算を行った後で Switch を実行している。例え ノイズのかかる領域が全体の10%だったとしても常に100%に対して演算を行った上で Switchで切り替えているので、効率の良い構成とは言えない。これは VEX コードを見ればわかる。
上記赤線の部分を RMB クリックし、VEX/VOP Options->View VEX Code... を実行。表示されるコードの下の方を見ると、ノイズ (vop_fbmNoiseFV) が全体にかかっていることがわかる。

そこで if を使って領域を限定する必要がある。

2. H14 までの方法

Houdini 14 までは、if ノードを作成、その中に if が True の時に実行するノードを配置する必要があった。この (旧) if ノードは H15 では TAB メニューに表示されないので、テキストポート経由で作成する必要がある。

  1. Textport を表示。以下のコマンドを入力。
    cd /obj/grid/attribvop1
    opadd if

    これで (旧) if ノード (if1) が出来る。
    1. compare1 の出力を if1 の condition に
    2. globals の Cd を if の次の入力に (デフォルト値)
    3. globals の P を if の次の入力に
  2. aanoise1 を コピー (Ctrl+C)
  3. if1 の中に入り、 ペースト (Ctrl+v)
    1. subinput1 の _P を aanoise1 に pos
    2. aanoise1 の noise を suboutput1 の _Cd に
    3. if1 の外に出て、if1 の _Cd 出力を geometryvopoutput1 の Cd 入力に接続。
    結果は twoway1 の場合と同じになる。
  4. twoway1 は削除。
      VEXコードを先ほど同じ要領で見ると、ノイズ (vop_fbmNoiseFV) が if 構文の中で実行されるようになっていることがわかる。
(旧) if ノードを使った場合、入力の結線、ノードのコピペなど、使い勝手はあまりよくない。 if 内で処理するノードが 一つであればそれほど問題ではないが、十数から数十になれば間違う確率も非常に高くなる。 最初に接続したノードがデフォルトの出力なるなど初見ではわからないことも多かった。

3. H15 からの方法

Houdini 15 から If Block ノードグループを使用。これは、if_begin と if_end ノードの2つで構成されている。この二つは、旧 if ノード内部のsubinput と suboutput に相当する。ただし、他のノードと同じレベルに出来るため、ノードへの出入りの手間が不要になる。

  1. TAB -> If Block を実行。青く囲まれた二つのノード if_begin1 と end_if1 が出来る。
  2. if_begin1 の condition に compare1 を
  3. False の場合の値 globals の Cdを if_begin1の最初の入力に接続
  4. True の場合の値 aanoise の出力を end_if1 の入力に接続
  5. 結果となる end_if1 の出力を output1 の Cd に接続

これで同じ結果になる。

まとめ

  • If Block について
    • if_begin ノードに False 時の値のノードを、if_end ノードに True の値のノードを接続する。
    • if_begin1を選択すると begin1 と end1の間に水色の接続線が描かれ、この二つがつながっていることがわかる。
    • end_if1 の Enclose Inputs をオンにすると aaonise が青い領域に含まれる。オフにすれば外れる。
        オフもオンも結果は同じになるかもしれないが、オフの時には、上記の例の aanoise1は if ブロックの外で演算されるので、演算効率は悪くなる。ノードグラフの見た目の処理だけではないので、注意が必要。
    • Shift+Enter
        ノードを確定時に Enter の代わりに Shift+Enter を実行するとノードが自動的に接続され、作成したノードに表示フラグが設定される。
    • Visualize ノード
        VOPノード内で、カーソルをノードの出力の上に配置、xキーを押すと、Visualize ノードが作成され、そのノードの出力結果が確認可能になった。

    シーンファイル:

    • if_block.zip (36KB) ここで使っているファイルは
      • if_original.hip: 元シーン
      • if_h14_if.hip: H14の if
      • if_h15_if.hip: H15の if

  • 0 件のコメント:

    コメントを投稿