一、Laplace平滑
簡單的拉普拉斯平滑演算法的原理是將每個頂點都移動到相鄰頂點的平均位置,即采用所謂傘狀算子:

在傘狀結構中表示這樣的程序如下圖:

拉普拉斯平滑演算法有很多進一步的變形,首先在求取平均位置時,可以采用不同的加權策略,例如對不同的鄰接點采用不同的權值,一般來說,距離中心點P較遠的鄰接點,我們可以讓他對P平滑后的位置影響小一點,這樣就可以采用一種距離的倒數為權值的拉普拉斯平滑,

有時為了控制平滑的速率,也會引入引數lambda來控制平滑的速率,即從原來所執行的:
轉變成
同時,平滑演算法往往可以反復對Mesh執行,使得Mesh越來越光順,迭代次數T也是平滑演算法中重要的引數,
二、切向Laplace平滑

右邊圖中的第三幅,代表reproject的效果,需要額外實作(比如用AABBtree等),在公式中沒有體現,
另一種寫法:

區別在于(I - ni . ni.T),還有正負號
三、改進的切向Laplace平滑(基于面積的切向Laplace平滑)

首先計算gi:

然后用以下公式將gi被投影會pi的切面:

其中ni是pi的法向,λ是阻尼系數用來防止震蕩,
一些Voronoi面積大的節點擁有更大的重力,所以吸引了其它節點,因此減小了他們自身的面積,一般通過<20次迭代,面積方差可以減小5倍,最終產生一個每個節點面積大致相同的網格,如下圖所示,

代碼:
Eigen::Vector3d tangential_smooth(const Tuple& t)
{
auto one_ring_tris = get_one_ring_tris_for_vertex(t);
if (one_ring_tris.size() < 2) return vertex_attrs[t.vid(*this)].pos;
Eigen::Vector3d after_smooth = smooth(t); // 計算了普通Laplace平滑后的點位置
// get normal and area of each face
auto area = [](auto& m, auto& verts) {
return ((m.vertex_attrs[verts[0].vid(m)].pos - m.vertex_attrs[verts[2].vid(m)].pos)
.cross(
m.vertex_attrs[verts[1].vid(m)].pos - m.vertex_attrs[verts[2].vid(m)].pos))
.norm() /
2.0;
};
auto normal = [](auto& m, auto& verts) {
return ((m.vertex_attrs[verts[0].vid(m)].pos - m.vertex_attrs[verts[2].vid(m)].pos)
.cross(
m.vertex_attrs[verts[1].vid(m)].pos - m.vertex_attrs[verts[2].vid(m)].pos))
.normalized();
};
auto w0 = 0.0;
Eigen::Vector3d n0(0.0, 0.0, 0.0);
for (auto& e : one_ring_tris) {
auto verts = oriented_tri_vertices(e);
w0 += area(*this, verts);
n0 += area(*this, verts) * normal(*this, verts);
}
n0 /= w0;
if (n0.norm() < 1e-10) return vertex_attrs[t.vid(*this)].pos;
n0 = n0.normalized();
after_smooth += n0 * n0.transpose() * (vertex_attrs[t.vid(*this)].pos - after_smooth);
assert(check_mesh_connectivity_validity());
return after_smooth;
}
四、非流形網格的平滑
對于non-manifold網格,上面的公式是否還適用,有待調研,
參考文獻:
sgp04 M. Botsch and L. Kobbelt / Remeshing for Multiresolution Modeling
Polygon mesh processing (Botsch M., et al.) Chapter6 Section 6.5 Triangle-based Remeshing
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/553014.html
標籤:其他
下一篇:返回列表
