[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 に含まれる頂点数) を 頂点が含まれる面の数で割っています
この辺をまとめた公式ドキュメントを見つけたので貼っておきます
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(組み込み)アトリビュート
@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
参考
まとめ
読み進めるにあたり、結構基礎っぽい内容が多くなってしまいました
次回はもう少し内容に入れる...はず
手元ではこんな感じでコメントを書きながら読んでいます
ようやくswitch_mass_method
まで来ました...
Vellum Constraints が一段落したらhipファイルを公開予定です
何かあれば Twitter までどうぞ~