一般有兩種曲面平滑的方式:
Denoising:一般是去掉凸出曲面的部分(高頻部分),而保留和曲面相當(dāng)?shù)牟糠郑ǖ皖l部分)。即需要一個在離散三角形網(wǎng)格曲面上的低通濾波器(low-pass filters),并且需要建立頻率的相關(guān)概念。
Fairing:在平均(個人認(rèn)為翻譯成抹平更形象一些)的過程中,所做的不僅僅只是去除高頻的部分。抹平的過程相當(dāng)于是對曲面做了一個變換,使其從各個角度(曲率、高階導(dǎo)數(shù))上看盡可能的光滑。
傅里葉變換
傅里葉變換表示一種映射f,它將函數(shù)從空間域(spatial domain)f(x)變換到頻域(frequency domain)F(ω)
上式中的指數(shù)部分通過歐拉公式可以展開成如下的復(fù)數(shù)形式:
這是一個包含有正弦和余弦函數(shù)的,以ω為自變量的(可以看作是頻率)函數(shù),可以將這個函數(shù)看做向量空間上的一組正交基,即頻域(frequency domain)。
可以將f(x)(可積的復(fù)數(shù)函數(shù))看作向量空間中的一個元素,然后對它做下面的內(nèi)積運算:
那么,傅里葉變換在這里表示了一種基的變換。通過將向量f投影到不同頻率的基向量上,然后對其進(jìn)行累加操作,這樣就完成了從空間域(spatial domain)到頻域(frequency domain)的轉(zhuǎn)換。
如果我們要除去頻率比較高的部分,保留
只需要將上面的累加式改寫為如下的形式
對于離散的三角形網(wǎng)格,需要將連續(xù)的函數(shù)f(x)用如下逐頂點的矩陣形式來表示
同樣的如果要將拉普拉斯一貝爾特拉米算子(Laplace-Beltrami operator)應(yīng)用到函數(shù)上同樣也需要將變成逐頂點的矩陣形式,這樣算子就變成了相應(yīng)的拉普拉斯一貝爾特拉米矩陣L了
根據(jù)之前的知識,可以知道,對于上面式子的每一行是按下面的方法進(jìn)行運算的:
權(quán)重wij取值的時候要保證矩陣L是對稱的。前面提到過兩種取值的方法:
- Uniform形式
- Cotangent形式
可以發(fā)現(xiàn),對函數(shù)eω是拉普拉斯算子的特征函數(shù),因為:
這樣1維傅里葉變換中的基就是拉普拉斯一貝爾特拉米算子的特征矩陣,很自然的可以想到,對于2維流型曲面其同樣成立。
在處理離散形式的時候,eω就變成了矩陣L的特征向量e1...en,對于ei,用如下逐頂點的矩陣來表示
ei的特征值代表了點vi所處頻域的頻率,ei(vk)表示頂點的振幅。
對矩陣L的所有特征向量進(jìn)行累加可以得到和前面相似的式子:
如果要濾掉高頻部分,那么只需要對前m個特征向量進(jìn)行累加即可:
通過下圖可以看到,隨著m的逐漸減小,即濾掉的頻率越來低,模型的凸出部分(細(xì)節(jié)信息)在逐漸的消失。
為了得到特征向量需要對拉普拉斯矩陣進(jìn)行特征分解,而當(dāng)模型的頂點比較多的時候,代價是時分昂貴的。
而下面的Diffusion Flow方法則相對來說更容易實現(xiàn),效率也更高一些。
Diffusion Flow
諸如熱擴(kuò)散和布朗運動之類的物理過程可以使用下面的擴(kuò)散方程來表示

從形式上來看,這是一個二階線性偏微分方程,通常f(x, t)表示某點x在時刻的溫度,這個方程描述了無體內(nèi)熱運動的規(guī)律。
要將其運用到曲面網(wǎng)格上,首先是將連續(xù)形式的拉普拉斯一貝爾特拉米算子替換為離散形式,然后將函數(shù)f改寫為逐頂點形式

為了簡介,可以使用矩陣的形式來表示

等式左邊的偏導(dǎo)數(shù)可以改寫成微商的形式

化簡得到

為了保證在h比較大的情況下的準(zhǔn)確性,通常會將上式改寫成如下形式:

然后將自變量相同的移到一邊,寫成如下矩陣方程:

最后要做的就是用上面的方程去更新網(wǎng)格的每一個定點

由于定點的拉普拉斯一貝爾特拉米算子等于其平均曲率法向量
所以上面的方式實際上是讓每一個定點沿著其法向量的方向移動,移動距離由這一點的平均曲率H決定。
一個很重要的一點是,只有在算子的權(quán)重系數(shù)wij的取法是cotangent方法,定點才會向上面說的那樣更新。當(dāng)系數(shù)的取法是uniform時,每個頂點會向著重心的方向移動。

Diffusion Flow方法比之前使用傅里葉變換來說計算量更低,但是其主要的思想仍然是移除高頻噪音(模型上不平滑的地方)而保留低頻部分。
Fairing
Fairing這種方法的思想則與前兩種不同,其目標(biāo)是通過計算使得網(wǎng)格盡可能的光滑。判定光滑程度的方法各不相同,但是總的原則就是要盡可能的光滑,避免不必要的細(xì)節(jié)或者毛刺。
總的思路是:
- 定義一個量來衡量曲面的不平滑程度
- 更新曲面以最小化曲面的不平滑程度
一個比較常用的描述不平滑程度的函數(shù)是使用曲面的面積

在限定了曲面邊界的情況下,不平滑的曲面相對的面積應(yīng)該更大。當(dāng)其取最小值的時候,外形應(yīng)該像沒有鼓起來的被夾緊的肥皂泡一樣。
不過這個函數(shù)是高度非線性的,包含了第一基本型行列式的平方根,另外其計算的效率也不會太高。其改進(jìn)形式如下(參考:Dirichlet energy):

為了求最小值,簡化上面的模型至一維的情況

在一維的情況下,限制條件就從邊界變成了區(qū)間。假設(shè)當(dāng)函數(shù)E的自變量函數(shù)取f時E取到最小值,并且限制條件的區(qū)間為[a, b],那么對于任意函數(shù)u,并且u(a) = u(b) = 0,都有E(f) < E(f+λu),那么當(dāng)λ = 0時,E取最小值,其對于λ的偏導(dǎo)數(shù)的值也為0

用分部積分公式展開上面的積分

因為u(a) = u(b) = 0所以最終

由于上式對于任意滿足u(a) = u(b) = 0的函數(shù)u都成立,所以

上式推廣到二維情況同樣試用,所以對于改進(jìn)后的函數(shù)同樣可以用這個方法

為了把上面的方法應(yīng)用到三角形網(wǎng)格的曲面上,只需要和前面一樣將算子和函數(shù)改為離散形式即可

除了用面積來衡量不光滑度之外,還可以使用曲面的主曲率:

或者主曲率相對切向量的變化率:

當(dāng)k = 1時,以面積為度量的不平滑度取最小值;k = 2時以主曲率為度量的不平滑度取最小值;k = 3時以主曲率相對切向量的變化率為度量的不平滑度取最小值

下圖中紫色的區(qū)域就是通過上面的方法平滑得到

算子中權(quán)重取法的不同也會產(chǎn)生不同的結(jié)果,使用Uniform的取法會導(dǎo)致一些區(qū)域的頂點密度過高,使用Cotangent則能夠達(dá)到期望的平滑效果
