てんちょーの技術日誌

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

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

概要

こちらの続きです

shop-0761.hatenablog.com

環境

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

読んでいく

途中で出てくる Model については Triangle Stretch の項でまとめて紹介します

Tetrahedral Fiber

ドキュメントより

各四面体が、ポイント上のmaterialWで指定された方向(このアトリビュートがなければ{0, 0, 1})に沿って平坦化を試みる拘束に変換されます。 これらの拘束をVellum Constraint Propertyを使って、シミュレーション中にそれがアニメーションされるほどに弱い剛性を設定することで、ボリュームの収縮効果をシミュレーションすることができます。

注) Houdini 19.0.622, 19.0.720 では Tetrahedral Fiber を含む Vellum Solver を
実行するとHoudini がクラッシュする可能性があります
(手元の環境の問題かもしれないですが)


2022/11/13 追記

どうやらグラボのドライバーとのかみ合わせが悪いようです
とりあえず手元では下記で動いているっぽいです

Geforce Game Ready ドライバー 526.47
Houdini 19.0.796 (daily)


事前準備として、まず Tet Conform でポリゴンを四面体にしておきます
次に materialW Attribute を作成します(Attributeがない場合は自動で {0,0,1} で作成されます )
この materialW は最終的にジオメトリの local space に変換されることに注意です

実際の処理は、対象となる point が

  • 四面体 (typeId == 21) である
  • __constraintsrc 属している
  • 4点からなる prim に属している

ときに行われます


computeTetRestMatrix

ここでは p3 を各点から打ち消す (p3 を原点に戻す) ことで、四面体の体積の公式である

 \frac{1}{6} | det M |

に落とし込むことができます
(Mを転置しているのはおそらくこの後の計算で便利だからかな...?)

  | det M | = 0 の場合は、 逆行列が存在しないので打ち切ります

参考

www.headboost.jp

そして、 restMatrix : M の逆行列、 volume: 四面体の体積、として値を返します


computeTetFiberRestLength

materialW について軽く触れておきます

ここでは materialW がすでにあれば、各頂点の値を全て足して正規化します

その後、material W は restM の転置行列と掛け算することで、座標変換されます


すべて成功した場合、4点は tet として addprim されます
その prim に対して下記を設定します

  • __stretchconstraints (group)
  • restlength (四面体の体積)
  • type (ここでは Non-LinearARAP なら tetfiber, それ以外なら tetfibernorm)
  • Stiffness (Stretch の Stiffiness の値)
  • Damping Ratio (Stretch の Damping Ratio の値)
  • restvector (materialW)

Tetrahedral Stretch

Model によって type が変わります

  • Non-Linear ARAP : tetarapnl
  • Linear ARAP : tetarap
  • Scale-Invariant ARAP : tetarapnorm

さらに Preserve Volume が有効になっていれば、 上記文字列の末尾に vol が付与されます

処理内容は computeTetFiberRestLength とほぼ同じです
差は Stretch の Rest Length Scale が考慮されるくらいです

  • __stretchconstraints (group)
  • restlength (四面体の体積) * Rest Length Scale (Stretch の Rest Length Scale の値)
  • type (Modelによって異なる)
  • Stiffness (Stretch の Stiffiness の値)
  • Damping Ratio (Stretch の Damping Ratio の値)
  • restvector ({0, 0, 0, 1})

Tips

Softbody

www.sidefx.com

ドキュメントより

各四面体は、指定した剛性に応じて伸びや捻じれを除去することで四面体をAs-Rigid-As-Possible(ARAP:可能な限り硬く)に維持する拘束に変換されます。 Preserve Volume が有効になっている場合、 Tetrahedral Volume 拘束の動作方法と同様に、この拘束は、さらに非常に強い内部剛性を使いつつ、指定した Damping Ratio を使って体積の維持を試みます。

まとめ

ようやく Constraint Type ごとの分岐に終わりが見えてきました...

何かあれば Twitter までお気軽にどうぞ~ twitter.com