VEX&VOP チートシート


これは Houdini Apprentice Advent Calendar 2019 1日目の記事です。
初日から奇を衒った内容になってしまいましたが、vex/vopの比較表をまとめてみます。
毎年似たようなこと書いている気がしなくもないです。

はじめに

VOP は VEX のラッパーです。Houdini は実質、 SOP(VOP)+DOP です。
MEL 無しで Maya を使う辛さほどではないと思いますが、VEX なしで Houdini を使いこなすのも難しいです。
DSL(と数学)の実力がそのままDCCアプリケーションでの表現に反映される感覚をひしひし感じます。

参考のチュートリアルを見ていると、VEX と VOP が混ざって結構混乱します。
VOP の操作を VEX でどうするのか都度調べてたりするので、表にまとめてみました。
優劣や使用頻度はともかく、類似度で並べています。
もっと良い方法、比較対象があれば、ご指摘頂けると嬉しいです。

対応表

  • Houdini Apprentice 17.5.391
VOP VEX ノード
SOP Attribute SOP Attribute Expression, Group Expression, Attribute Wrangle SOP
DOP Geometry VOP, Gas Field VOP Geometry Wrangle, Gas Field Wrangle SOP
COP VOP COP2 Filter, VOP COP2 Generator COP VEX Filter, VEX Generator COP
構造体 Struct VOP $HIP/vex/include にヘッダーを配置
フロー制御 if, for-loop, while VOP if, for, while
パラメータ Bind VOP, Parameter VOP ch関数
相互運用 inline code VOP, snippet VOP vopwritevfl (Save VEX to Code file)
ポイントクラウド Point Cloud Open VOP pcopen/pclose関数
アトリビュート Attribute Create SOP addvariablename
デバッグ なし(Geometry Spreadsheet) printf関数, assertマクロ
Python node.createNode node.parm("snippet").set
HDK VOP_Nodeクラス VEX_VexOp or CVEX_Context::run()

並べてみると、四則演算や制御文をVOPでやる意味はほとんどありません。

HOM (Houdini Object Model)

基本的なノードの操作は以前まとめてみました。VEX の文字列を Python で書いてみます。
余談ですがtextwrapモジュールで書き込めば、VEXもきれいに整形されます。

vex.py
import hou
import textwrap

def set_vex():
    vex = textwrap.dedent("""\
    // Average Neighbouring Points
    int n[] = neighbours(0, @ptnum);
    vector avgP = @P;

    // Loops over all elements of n, setting pt
    // to be the value of each element
    foreach (int pt; n)
    {
        avgP += point(0, "P", pt);
    }
    """)
    wrangle = hou.node("/obj/geo1").createNode("attribwrangle")
    wrangle.parm("snippet").set(vex)

書けるといえば書けるのですが、そこまで重要ではないですね。
Python AST から VEX にトランスパイルするぐらいでないとインラインで
VEX書き込んでもあまり...

まとめ

ノードベースの弱点は、他人へ技術や知識を移植し辛いことだと思います。
上級者のhip見ろってことだと思いますが...
単発機能だけじゃなく一覧で見るのも理解が深まっていいですね。