グニョグニョ動く柔軟物の実装の一つにShape Matching法があります.
この手法は2005年のSIGGRAPHで発表されたものです.
www.youtube.com
幾何的な制約条件をもとに物体を変形させていく手法で,
有限要素法(FEM)とは全く別のアプローチをとっています.
FEMと比較したShape Matchingの特徴として,以下のものがあります.
- 計算量が小さく高速
- 物理的に不正確
- 実装が容易
なので,CGなど,見た目がそれっぽければよい場面においては使える手法です.
今回は,上述の論文を読んで実装してみました.
手続き
各頂点のgoalpositionを毎ステップ求めていきます.
アルゴリズムは論文に書いてある通りなのですが,
初期位置の決定,初期重心の決定,qi=xi^0-xcm^0を予め求めておいて,
- 重心xcmの計算
- Apqの計算
- S=sqrt(Apq^t,Apq)の計算
- R=ApqS^(-1)の計算
- 各頂点のgoalposition=R(xi^0-xcm^0)+xcmの計算
- 速度と変位を求めて反映
というステップを毎サイクルまわします.
Apq^tとApqの積は対称行列なので,jacobi法で固有値固有ベクトルだして対角化し,
平方根求めるのが速いらしいです.
六面体要素ではこんな感じになりました.
www.youtube.com
www.youtube.com
Unity WebGL Player | basicPhysics
WebGLで遊べます(読み込みに少し時間がかかります).
球をカーソルで引っ張ってみてください.
最小の六面体要素ごとに,shape matchingを行っています.
shape matchingを行う要素の重なりが大きくなるほど,変形しにくくなります.
CPUに逐次計算をさせています.
ShapeMatchingをより複雑な変形を高速に行うための手法としては,
FastLSM(Lattice shape matching)とFastASM(Adaptive shape matching)が代表的です.