異方性カーネル†パーティクルから陰関数を生成する場合,以下のような平滑化カーネルを用いる. ここで,はスケーリング定数,はシミュレーション次元, は距離が遠くなるほど値が滑らかに小さくなるローカルサポートの対称関数である. この定義はいわゆるメタボールと同じようなものであり, 生成された表面は凸凹になってしまう(下図左).このような表面はblobbyであると呼ばれる. blobbyな表面を改善するために,Yuら ¬e{Yu2010:J. Yu and G. Turk, Reconstructing Surfaces of Particle-Based Fluids Using Anisotropic Kernels, In Proceedings of the 2010 ACM SIGGRAPH/Eurographics symposium on Computer animation, 2010}; は従来の等方性のカーネルの代わりに異方性カーネル(anisotropic kernel)を導入した. つまり,の代わりに正定値行列を用いて, とすることで,ベクトルに回転と伸縮を与え,球の代わりに楕円体形状のカーネルとする. 法線方向に短軸がくるような楕円体を設定することで,滑らかでかつエッジがよりくっきりと出るような表面を得ることができる(下図右). また,表面付近でのパーティクルの不規則な分布を解消するために, パーティクル位置に関しても平滑化を行い更新位置を計算する. 全パーティクルに対して,とを計算することで以下の陰関数場を得る.
以下で¬e{Yu2010};の,の計算方法について述べる. パーティクル位置更新†不規則なパーティクル配置を修正するために,以下のLaplacianスムージングでパーティクル中心位置を更新する. は定数で,¬e{Yu2010};は0.9から1を推奨している. は重み関数で, とする.この重み関数は異方性を算出するための共分散行列の計算に用いられる. 異方性をより正確に推定するためにはより多くのパーティクルが必要であるため, 有効半径はシミュレーションで用いる有効半径の2倍にする. 注意として,は表面生成のみに用い,シミュレーションには使わない. そのため,更新前の位置を上書きするのではなく,別の変数に格納するようにする. 共分散行列の計算†を計算するために,重み付き主成分分析(WPCA:Weighted Principal Component Analysis)¬e{Koren2003:Y. Koren and L. Carmel, Visualization of labeled data using linear transformations, In Proceedings of IEEE Information Visualization, 2003.};を用いる. 主成分分析(PCA)は画像認識などでよく用いられるデータ解析手法で, 分散したデータの特徴をよくとらえた新しい軸(主軸)を設定することでデータ量を減らしたりすることに用いられている. WPCAはPCAに重みをつけることで,外れ値(outlier)やノイズに対してロバストにしたものである. WPCAではまず,データ点での重みを計算し,次に重みを考慮した共分散行列(covariance matrix)を算出, 最後にの固有値解析により固有ベクトルをもとめ,大きな固有値を持つ固有ベクトルを新しい主軸とする. ここでは,WPCAの結果からを求める. まず,重み付き平均位置を計算する. はパーティクルの近傍パーティクルの中心を示している. 重みを使うことで,から大きく離れた外れ値の影響は小さくなる. から各近傍パーティクルの位置へのベクトルの積をとることで,共分散行列を得る. 重み関数にはパーティクル位置更新で使ったものと同じものを用いる. 共分散行列の特異値分解†楕円の伸縮方向を得るために共分散行列を特異値分解して,固有値,固有ベクトルを求める. は固有ベクトルを各列に持つ回転行列,は対角要素に固有値を持つ対角行列である. 大きな変形や近傍にパーティクルが少ない孤立したパーティクルなどに対応するために以下の処理を行いを修正する.
ここで,である. ¬e{Yu2010};は,を用いている. 異方性カーネル用行列$G$の算出†はの逆行列にをかけたものになる. 結果†SPH法の実装の結果:SPH法の実装(GPU実装含む)で示した立方体形状の水塊がなだらかなスロープ上に落下するシーンでの結果をしめす.パーティクル数は約25,000,メッシュ化(MC法)のグリッド解像度は256x103x103である. まず,共分散行列を球に適用することで,パーティクルを楕円体として描画した結果を示す.
メッシュを抽出して,GLSLで屈折表面として描画した結果を以下に示す.
異方性カーネルで表面が滑らかになるとともに,両サイドの壁に沿ってできた薄い水膜もうまく再現できている. さらにシミュレーションを進めた時の結果を以下に示す.
拡大したものは以下
メッシュを抽出して,GLSLで屈折表面として描画した結果を以下に示す.
計算時間はだいたい,SPH計算に5ms/frame,異方性カーネルのGの計算に10ms/frame,異方性カーネルを適用した上でのメッシュ化に145ms/frame(従来の等方性カーネルの場合は15ms/frame)であった.ちなみにSPHでの計算,異方性の計算,および,MC法によるメッシュ化はすべてCUDAを使ってGPU上で実装し,GeForceGTX580上でテストした. パーティクルを直接描画する際に,等方性カーネルはポイントスプライトを使ったが,異方性カーネルの場合はglutSolidSphereに共分散行列を変換行列として設定して楕円体として描画した.そのため,描画に時間がかかっているので注意(私の環境だと異方性カーネルで85ms/frame, ポイントスプライトによる等方性カーネルは15ms/frame). サンプルコード(GPU実装)†SPH法の実装(GPU実装含む)で示したSPH法のコードに上記の異方性カーネルの実装を追加し,さらにFLTKでGUIを追加したコードを以下に置く.SPH計算,異方性計算,および,MC法によるメッシュ化はすべてCUDAを使って実装した.
さらに,3Dモデルファイルの入出力のrx_model.libも必要(ver0.5以上).
|