[Houdini] Vellum Rest Blend を読んでみた
概要
今回は Vellum Rest Blend を読んでみたいと思います
メモを残した hip ファイルはこちら
こんなかんじ
環境
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 を叩きます
重複を考慮しつつ、四面体の体積を求める要領で計算します
四面体の体積を求める話はこちらに図があります
orientedRestDifference
type が pinorient or bendtwist のときのみ aadiff に計算結果が格納されます
共役な rest vector (quaternion) と orrient の乗算結果を 軸と角度のベクトルに変換しています
共役なクォータニオンを乗算する == クォータニオンの除算 でした
orient から restvector 分の回転を打ち消す操作っぽいです
updateRestVectorOrient
aadiff を degree に変換したもの * amount を返します
aadiff の 正規化された軸 + 角度なので、length を取ると角度分だけ取り出せます
ついでに restvector も aadiff を考慮したものに更新します
computeRestVectorDifference
type がいずれかのときのみ計算します
- TetFiber (== tetfiber || tetfibernorm)
- TriARAP (== triarap || triarapnl || triarapnorm)
TetFiber のときは、computeTetFiberRestLength を計算し
restvector との差分を格納します
computeTetFiberRestLength はこちら
TriARAP のときは、まず computeTriRestMatrix で逆行列を求めます
逆行列が存在しない場合は打ち切ります
computeTriRestMatrix はこちら
こちらを参考に極分解をします
polardecomp2d では R を求めています
最後に material 座標系と diff をとっています
ここでの material coordinates (space) とはなんだろう... (謎)
Tips
input があるかどうかの判定
opinput を拾って、その文字数カウントで行っていました
strlen(opinput("..", 3)) > 0
カハンの加算アルゴリズム
accumVec で使用していたので、こちらに
A robust method to extract the rotational part of deformations.
extractRotation にて3x3 の行列から回転成分を抽出する方法を用いていました
一番最後にあります
https://matthias-research.github.io/pages/publications/stablePolarDecomp.pdf
まとめ
久々に数学がでてきてちょっと苦戦しました... まだわからないところがあったり、
以前出てきた部分があったりしてちょっとおもしろかったです
何かあれば Twitter までお気軽にどうぞ~ twitter.com