てんちょーの技術日誌

自分がつまづいたこととかメモ

[Houdini] Vellum Constraints を読んでみた その1

概要

普段漫然と便利だな~~と思って仕組みを知らずに使っている
各ノードの中身を読んでみようというのをやってみます

今回は Vellum Constraints の Vellum Cloth をベースに見ていきます

--- 2022/12/07 追記 ---
一通り読み終わりました
メモを残した hipファイルは こちら

サンプルが足りてないので追って追加したいです...

--- 追記おわり ---

環境

OS: Windows 10
Houdini: 19.0.622
Redshift: redshift_v3.0.62 (たぶん)

読んでいく

めちゃでかい...

たぶん全部を追うと大変なので、ポイントになりそうなとこだけピックアップしながら
紹介していこうと思います

Layer

Vellum Solverの Layer Shock パラメータは、布を何層にも重ねる時に、各層の軽さを制御します。デフォルトでは、下層にある布は上層にある布よりも4倍重くなります。Vellum Constraintsノードの Layer パラメータを使って、layerアトリビュートを設定することができます。

vellum cloth より

TODO: 気になるのであとで追いかける

compute_varying_mass

各頂点がどのくらいの重量かを計算するパートがあったので軽く紹介します
分かりやすいPoly分の一部を抜粋してます

int prims[] = pointprims(0, @ptnum);
foreach(int prim; prims)
{
    ...
    if (type == 1) // polys
    {
        if (primintrinsic(0, "closed", prim))  // polygons
            append(polys, prim);
        ...
    }
}
float measure = 0;
...
else if (len(polys))
{
    foreach(int p; polys)
    {
        int npts = len(primpoints(0, p));
        float area = prim(1, "area", p);
        measure += area / npts;
    }
}
...
float density = chf("density");
@__computedmass = density * measure;

(事前に measure した面積(area) / prim に含まれる頂点数) を 頂点が含まれる面の数で割っています

この辺をまとめた公式ドキュメントを見つけたので貼っておきます

www.sidefx.com

Tips

というより、読んでる最中に気になったものを書いておきます

参照先の見方が分からない

こういうどこかの値を参照しているのだけど、君どこ...というときがありますが、
Edit Expression で中身を確認することができます

Attribute がUI上どこにあるのか分からない

虫眼鏡マークから検索窓が出ます

Edit Parameter Interface でも一覧が表示できます
Hideされているパラメータの場合は虫眼鏡マークからの検索では引っかからないので、
こちらで検索して探してみるとよいかもしれません

文字列比較の expression

strcmp を使っていました

!strcmp(chs("../constrainttype"), "pin")

これは通常の文字列比較に加え、ASCIIコード順による判定も可能なようです
Expression なので chs("../constrainttype") != "pin" のようには書けないっぽい

Spare Input

下記のように Geometryへ -1 でアクセスしている箇所がありました

npointsgroup(-1, "__pinsrc")

これは Spare Input と呼ばれる機能で、インプットを増やせます
VEX や Expression でアクセスするときは、-1, -2 ... と減る方向に index が変わります

参考 nomoreretake.net cgworld.jp 【ゼロから始めるHoudini】 10 - 処理の効率を考えよう - YouTube

Intrinsic(組み込み)アトリビュート

www.sidefx.com

@intrinsic:typeid==1 というexpressionを見つけたので、内訳を調べました
今回は Poly 判定をしているようです

windows→ shell から ginfo コマンドが使えます

>ginfo -P
Primitive Type: Null
Primitive Type: Poly
  Family mask: 0x00000001
Primitive Type: NURBCurve
  Family mask: 0x00000003
Primitive Type: BezierCurve
  Family mask: 0x00000003
Primitive Type: Mesh
  Family mask: 0x00000004
Primitive Type: NURBMesh
  Family mask: 0x0000000c
Primitive Type: BezierMesh
  Family mask: 0x0000000c
Primitive Type: PasteSurf
Primitive Type: Circle
  Family mask: 0x00000010
Primitive Type: Sphere
  Family mask: 0x00000010
Primitive Type: Tube
  Family mask: 0x00000010
Primitive Type: Part
Primitive Type: MetaBall
  Family mask: 0x00000020
Primitive Type: MetaSQuad
  Family mask: 0x00000020
Primitive Type: TriFan
Primitive Type: TriStrip
Primitive Type: TriBezier
Primitive Type: Volume
Primitive Type: Tetrahedron
  Family mask: 0x00000040
Primitive Type: PolySoup
Primitive Type: VDB
Primitive Type: PackedGeometry
Primitive Type: PackedDisk
Primitive Type: PackedFragment
Primitive Type: PackedAgent
Primitive Type: PackedDiskSequence
Primitive Type: AlembicRef
Primitive Type: PackedUSD

参考

www.sidefx.com

まとめ

読み進めるにあたり、結構基礎っぽい内容が多くなってしまいました
次回はもう少し内容に入れる...はず

手元ではこんな感じでコメントを書きながら読んでいます
ようやくswitch_mass_method まで来ました...

Vellum Constraints が一段落したらhipファイルを公開予定です

何かあれば Twitter までどうぞ~

twitter.com