Meshes & deformation

Laplacian Smoothing

ラプラシアン平滑化

近くの頂点を参照して表面を滑らかにする。

6 / 10

Interactive demo

Preparing the demo…

Laplacian Smoothing

Drag to orbit, Ctrl/⌘ + scroll to zoom. Use two fingers on touch screens.

This explanation is currently available in Japanese.

ひとことで

メッシュの各頂点を、辺でつながった周りの頂点の平均の位置へ少しずつ近づけることで、表面の細かい凸凹を消してなめらかにする方法です。画像のぼかしをメッシュでやるようなものです。計算がとても簡単で速い反面、くり返すと形全体が縮んでいくので、縮まない改良版(タウビン法)もよく使われます。

ゲームでの使いどころ

  • ボクセル・マーチングキューブの地形:マーチングキューブやボクセルで作った地形の階段状の段差をならす。
  • スカルプトの「スムーズ」ブラシ:モデリングツールや地形エディタで、なぞった所だけをなめらかにする。
  • スキャンデータの雑音除去:写真測量や 3D スキャンで取り込んだモデルの細かいノイズを消す。
  • スキニングの補正:関節の周りで変形がかくかくする所だけを、ならして見た目を整える(デルタマッシュ変形の土台)。

しくみ

頂点 pi\mathbf{p}_i につながった頂点の集合を N(i)N(i) とすると、ラプラシアン(周りの平均からのずれ)は

L(pi)=1∣N(i)∣∑j∈N(i)pj−piL(\mathbf{p}_i) = \frac{1}{|N(i)|} \sum_{j \in N(i)} \mathbf{p}_j - \mathbf{p}_i

です。これに割合 λ\lambda(0〜1)を掛けて足します。

pi←pi+λ L(pi)\mathbf{p}_i \leftarrow \mathbf{p}_i + \lambda\, L(\mathbf{p}_i)

細かい凸凹ほどラプラシアンが大きいので、先に消えていきます。ところが、球のような大きなふくらみも「周りの平均より外側」なので、くり返すと少しずつ内側へ引き寄せられ、形全体が縮みます。

タウビン法は、λ\lambda で縮める一歩のあとに、負の値 μ\mu(∣μ∣>λ|\mu| > \lambda)で押し戻す一歩を行います。

p←p+λL(p),p←p+μL(p)\mathbf{p} \leftarrow \mathbf{p} + \lambda L(\mathbf{p}), \qquad \mathbf{p} \leftarrow \mathbf{p} + \mu L(\mathbf{p})

細かい凸凹(高い周波数)は縮める一歩でほぼ消え、押し戻す一歩では戻りません。大きなふくらみ(低い周波数)は縮めた分だけ押し戻されるので、大きさが保たれます。通過させる周波数 kPBk_{PB}(0.1 程度)から μ=1/(kPB−1/λ)\mu = 1 / (k_{PB} - 1/\lambda) と決めます。

実装のポイント

  • 同時に更新する:頂点を 1 つずつその場で書き換えると、処理の順番で結果が偏ります。新しい位置は別の配列に書いて、最後に入れ替えます。
  • 境界と固定:開いたメッシュの縁の頂点は、内側にしか隣がないので内側へ縮みます。縁は動かさないか、縁に沿った隣だけで平均します。
  • 重みの工夫:単純な平均(均一重み)は、三角形の大きさがばらばらだと形がゆがみます。辺の向かいの角から決める余接(コタンジェント)重みを使うと、形に忠実になります。
  • 部分的にかける:ブラシのように、影響の強さを場所ごとに変えて λ\lambda に掛けます。

つまずきやすい点

  • 縮む・やせる:単純なラプラシアン平滑化をくり返すと、体積が減り続け、細い部分(指や角)から消えていきます。タウビン法を使うか、回数を少なめにします。
  • 大事な角まで丸まる:机の角のように、残したい鋭い辺もなめらかになります。辺の角度で重みを下げるなどして守ります。
  • 法線の更新忘れ:位置を動かしたら法線も計算し直さないと、光の当たり方が元のままでおかしく見えます。

デモで試すこと

  1. 「ボクセルの階段」の形が、くり返すにつれてなめらかになっていきます。「回数を自動で増やす」を切り、「くり返しの回数」を 0 にすると元の階段状の形が見えます。
  2. 右下のグラフで、ラプラシアン平滑化では体積が減り続けることを確かめてください。
  3. 「タウビン」に切り替えると、同じようになめらかになるのに、体積がほとんど 100% のまま保たれます。
  4. 「元の形を重ねる」で、縮んでいく様子を元の形と比べられます。「スキャンの雑音」は、ほんの数回でほぼ消えることもわかります。

References

libigl Tutorial ↗

A general reference for this subcategory.