Laplacian SmoothingキットをGithubで公開しました。Laplacian Smoothingは、データ平滑化のアルゴリズムの手法で、主に形状データの局所的なノイズを抑え、滑らかな形状にする特徴があります。頂点の位置を、その点に隣接する点の平均位置に向かって少しずつ移動させることで、表面を平滑化します。
Laplacian Smoothingのプラグインを作るにあたり、オープンソースのジオメトリ処理ライブラリのlibiglを使用いたしました。libiglは、シンプルかつ高機能なオープンソースのC++ジオメトリ処理ライブラリで、ヘッダーをインクルードしてプロジェクトをビルドすることができます。今回使用したLaplacian以外にもModoの機能に組み込んだら面白そうな興味深い機能がたくさんあります。今回はlibiglを使ったプラグインを利用して作るプロジェクトの練習のつもりで作りました。Pythonから利用可能なライブラリも用意されているようです。多くの計算処理をEigenを使って行っていますのでEigenの使い方さえマスターできれば簡単に利用できそうです。
Modoの標準のスムースツールは、汎用的でかつマルチタスキングを使って高速化されていますので、多くの場面では標準のスムースツールを使用することができます。今回のLaplacian Smoothingを使うと局所的なディテールが徐々に平滑化したい場合などで有効な方法だと思います。下記はLaplacian SmoothingのStrengthを0.0, 1.0, 2.0に変えてスムージングを行った例です。足先のディテールが徐々になくなっていきます。
下記はModoのスムージングの例です。全体的に一様に平滑化されていますが足先のディテールはそのまま残っています。
このライブラリのLaplacianを使って気がついたのは、平滑化の処理を対して行うと全体に形状がシュリンクしてしまうことです。このプラグインではオリジナルの形状の境界ボックを保存し、平滑した結果がその境界ボックスにフィットするようにスケールを掛けています。形状の表面積に基づいてスケールファクターを求めるなどの考え方もあります。この辺りは実用性を考えながら改善の余地がありそうです。
また、この計算処理は一度のスムージング処理で平滑化が大きく変化するという特徴もあります。上記のStrengthは、実際には平滑化処理を0回、1回、2回掛けた結果です。中間的な調整がやり難いのでこのプラグインでは、処理回数をStrengthとして浮動小数点数に変更し、処理回数の中間値を線型補完するようにしています。Modoのフォールオフにも対応しています。
0 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。