在三維網格形變算法中,個人比較喜歡下面兩個算法,算法的效果都比較不錯, 不同的是文章[Lipman et al. 2005]算法對控制點平移不太敏感。下面分別介紹這兩個算法:
文章[Lipman et al. 2005]提出的網格形變算法需要求解兩次稀疏線性方程組:第一個方程定義了網格上離散坐標系之間的關系,通過求解該方程可以重組每個頂點的坐標系;第二個方程記錄了頂點在局部坐標系的位置信息,通過求解該方程可以得到每個頂點的幾何坐標。
在網格頂點建立局部坐標系(b1i,b2i,Ni),i∈V。對於(i,j)∈E,定義差分算子δ:
δj(b1i) = b1j – b1i
δj(b2i) = b2j – b2i
δj(Ni) = Nj – Ni
將差分算子表示為b1i,b2i,Ni的形式:
δj(b1i) = C11ijb1i + C12ijb2i + C13ijNi
δj(b2i) = C21ijb1i + C22ijb2i + C23ijNi
δj(Ni) = C31ijb1i + C32ijb2i + C33ijNi
進一步表示為:
b1j = (C11ij+1)b1i + C12ijb2i + C13ijNi
b2j = C21ijb1i + (C22ij+1)b2i + C23ijNi
Nj = C31ijb1i + C32ijb2i + (C33ij+1)Ni
上式為第一個方程,記錄了網格上離散坐標系之間的關系,其中的系數可以由原始網格得到。
xj - xi = <eij , b1i >b1i + <eij , b2i >b2i + <eij , Ni >Ni
上式為第二個方程,記錄了頂點在局部坐標系的位置信息,其中的系數也可以由原始網格得到。
算法效果:
文章[Sorkine et al. 2007]提出了ARAP的網格形變算法,網格頂點的一環鄰域三角片組成一個單元(Cell),當頂點i對應的單元Ci變形為Ci’時,定義其剛性(rigidity)能量函數為:
網格上所有單元的剛性能量之和為:
根據能量函數,算法實現過程分兩步進行迭代,第一步更新Ri,第二步更新 pi’,下面為具體推導過程。
1.更新Ri:
設eij = pi - pj,那么能量函數E(S’)可以表示為:
忽略不含Ri的項,那么:
定義協方差矩陣Si:,將Si奇異值分解:Si = UiΣiViT,那么Ri = ViUiT。
2.更新pi’:
權重wij和wi分別為:wij = 1/2(cotαij + cotβij),wi = 1。我們將E(S’)對pi’求偏導,並令其等於零:
上式中wij = wji,於是,那么我們可以得到:
上式相當於求解稀疏矩陣方程組。
算法效果:
本文為原創,轉載請注明出處:http://www.cnblogs.com/shushen。
參考文獻:
[1] Y. Lipman, O. Sorkine, D. Levin, and D. Cohen-Or. 2005. "Linear rotation-invariant coordinates for meshes." In ACM SIGGRAPH 2005 Papers (SIGGRAPH '05) 24:3 (2005), 479-487.
[2] O. Sorkine and M. Alexa. "As-Rigid-As-Possible Surface Modeling." In Proc. of Eurographics Symposium on Geometry Processing. Aire-la-Ville, Switzerland: Eurographics Association, 2007.