てんちょーの技術日誌

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

[Houdini] Vellum Rest Blend を読んでみた

概要

今回は Vellum Rest Blend を読んでみたいと思います

メモを残した hip ファイルはこちら

drive.google.com

こんなかんじ

環境

OS: Windows 10
Houdini: 19.5.435
Redshift: redshift_v3.0.62 (たぶん)
Geforce Game Ready ドライバー: 526.98

読んでいく

Vellum Constraints の Hair を使っている場合

内部で Vellum Constraints の Hair を使っている箇所があります
が、パラメータは固定なので、場合によっては改修が必要かもです

compute_volume

findVolumePoints にて各 point が属する prim を対象に、
prim の point 番号が 0, 2, 1 の流れになるように sort したものを格納しておきます

それを用いて computeVolume を叩きます
重複を考慮しつつ、四面体の体積を求める要領で計算します

四面体の体積を求める話はこちらに図があります

shop-0761.hatenablog.com

orientedRestDifference

type が pinorient or bendtwist のときのみ aadiff に計算結果が格納されます
共役な rest vector (quaternion) と orrient の乗算結果を 軸と角度のベクトルに変換しています

共役なクォータニオンを乗算する == クォータニオンの除算 でした
orient から restvector 分の回転を打ち消す操作っぽいです

zenn.dev

darkhorse2.0spec.jp

updateRestVectorOrient

aadiff を degree に変換したもの * amount を返します
aadiff の 正規化された軸 + 角度なので、length を取ると角度分だけ取り出せます

ついでに restvector も aadiff を考慮したものに更新します

computeRestVectorDifference

type がいずれかのときのみ計算します

  • TetFiber (== tetfiber || tetfibernorm)
  • TriARAP (== triarap || triarapnl || triarapnorm)

TetFiber のときは、computeTetFiberRestLength を計算し
restvector との差分を格納します

computeTetFiberRestLength はこちら

shop-0761.hatenablog.com

TriARAP のときは、まず computeTriRestMatrix で逆行列を求めます
逆行列が存在しない場合は打ち切ります

computeTriRestMatrix はこちら

shop-0761.hatenablog.com

こちらを参考に極分解をします

polardecomp2d では R を求めています

最後に material 座標系と diff をとっています
ここでの material coordinates (space) とはなんだろう... (謎)

Tips

input があるかどうかの判定

opinput を拾って、その文字数カウントで行っていました

strlen(opinput("..", 3)) > 0

www.sidefx.com

カハンの加算アルゴリズム

accumVec で使用していたので、こちらに

neuliliilli.hatenablog.com

A robust method to extract the rotational part of deformations.

extractRotation にて3x3 の行列から回転成分を抽出する方法を用いていました
一番最後にあります

https://matthias-research.github.io/pages/publications/stablePolarDecomp.pdf

まとめ

久々に数学がでてきてちょっと苦戦しました... まだわからないところがあったり、
以前出てきた部分があったりしてちょっとおもしろかったです

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