拉普拉斯变形(Laplacian Deformation)思想及原理

欢迎关注更多精彩
关注我,学习常用算法与数据结构,一题多解,降维打击。

基本问题

普遍的应用是对一个三维物体推动或拉动某一处,求出三维物体最后会变形成什么样。

如上图所示:以一个表面为例,S是一个完整的三角网格。现在固定住最外圈的F部分。顶部黄色H是可以拖动的部分,现在将H拖动到某个地方,问整个网格形变最终结果。

拉普拉斯算子


对于网格中的每个顶 v i 对于网格中的每个顶v_i 对于网格中的每个顶vi

都有一个拉普拉斯算子

δ i = L ( v i ) = ( δ i x , δ i y , δ i z ) = v i − ∑ j ∈ N ( i ) w i j v j δ_i=L(v_i)=(δ_i^x,δ_i^y,δ_i^z) = v_i- \displaystyle \sum_{j\in N(i)}w_{ij}v_j δi=L(vi)=(δix,δiy,δiz)=vijN(i)wijvj

N ( i ) 表示 v i 的 1 领域,由 w i j 组成的矩阵 L 称为拉普拉斯矩阵 N(i)表示v_i的1领域,由 w_{ij} 组成的矩阵L 称为拉普拉斯矩阵 N(i)表示vi1领域,由wij组成的矩阵L称为拉普拉斯矩阵

L = [ w 1 , 1 w 1 , 2 . . . w 0 , n w 2 , 1 w 2 , 2 . . . w 2 , n w 3 , 1 w 3 , 2 . . . w 3 , n . . . . . . . . . . . . w n , 1 w n , 2 . . . w n , n ] L=\begin{bmatrix}w_{1,1}&w_{1,2}&...&w_{0,n}\\w_{2,1}&w_{2,2}&...&w_{2,n}\\w_{3,1}&w_{3,2}&...&w_{3,n}\\...&...&...&...\\w_{n,1}&w_{n,2}&...&w_{n,n}\\\end{bmatrix} L= w1,1w2,1w3,1...wn,1w1,2w2,2w3,2...wn,2...............w0,nw2,nw3,n...wn,n

w i j 有 3 种取值方式, w i j = 1 , w i j = 1 d i , w i j = c o t α i j + c o t β i j , d i 代表 v i 的度 w_{ij} 有3种取值方式,w_{ij} =1,w_{ij} =\frac{1}{d_i}, w_{ij} =cotα_{ij}+cotβ_{ij}, d_{i}代表v_i的度 wij3种取值方式,wij=1wij=di1,wij=cotαij+cotβij,di代表vi的度
cot表示法

拉普拉斯算子蕴含着曲面的局部特征信息,网格曲面的拉普拉斯坐标其在网格变形、网格平滑、网格去噪等方面都有着重要的应用。

能量方程构建

顶点有n个
v 1 , v 2 , . . . , v n v_1, v_2, ..., v_n v1,v2,...,vn
其中前m个顶点属于S,H区域。
δ i = L ( v i ) δ_i=L(v_i) δi=L(vi)

移动以后的点为
v 1 ′ , v 2 ′ , . . . , v n ′ v'_1, v'_2, ..., v'_n v1,v2,...,vn
其中前m个顶点属于S,H区域。

δ i ′ = L ( v i ′ ) δ'_i=L(v'_i) δi=L(vi)

按照拉普拉斯算子定义,我们希望变形后拉普拉斯算子尽量不变。同时s,h区域的点要尽量接近给定的点。

要使下列式子尽量满足

δ i ′ = δ i , f o r   i = 1   t o   n δ'_i=δ_i, for \ i=1 \ to \ n δi=δi,for i=1 to n
v i ′ = v i , f o r   i = 1   t o   m v'_i=v_i, for \ i=1 \ to \ m vi=vi,for i=1 to m

能量方程如下

令 ∆ ′ = L V ′ , ∆ = L V 令∆'=LV', ∆=LV =LV,=LV

a r c m i n ∑ i = 1 n ∣ ∣ ∆ i ′ − ∆ i ∣ ∣ 2 + ∑ i = 1 m ∣ ∣ v i ′ − v i ∣ ∣ 2 arc min \sum^{n}_{i=1}||∆'_i-∆_i||^2+\sum^{m}_{i=1}||v'_i-v_i||^2 arcmini=1n∣∣ii2+i=1m∣∣vivi2

我们如果可以解出上述式子使得能量最小,那么就确定了最终的点的位置了。

对式子进行拆分,可以发现是一个最小二乘问题。

可以对x,y,z进行拆分得到下式

E = ∑ i = 1 n ∣ ∣ ∆ i ′ − ∆ i ∣ ∣ 2 + ∑ i = 1 m ∣ ∣ v i ′ − v i ∣ ∣ 2 E=\sum^{n}_{i=1}||∆'_i-∆_i||^2+\sum^{m}_{i=1}||v'_i-v_i||^2 E=i=1n∣∣ii2+i=1m∣∣vivi2

= ∑ i = 1 n ( ∆ i x ′ − ∆ i x ) 2 + ∑ i = 1 n ( ∆ i y ′ − ∆ i y ) 2 + ∑ i = 1 n ( ∆ i z ′ − ∆ i z ) 2 + ∑ i = 1 m ( v i x ′ − v i x ) 2 + ∑ i = 1 m ( v i y ′ − v i y ) 2 + ∑ i = 1 m ( v i z ′ − v i z ) 2 =\sum^{n}_{i=1}(∆'_{ix}-∆_{ix})^2+\sum^{n}_{i=1}(∆'_{iy}-∆_{iy})^2+\sum^{n}_{i=1}(∆'_{iz}-∆_{iz})^2+\sum^{m}_{i=1}(v'_{ix}-v_{ix})^2+\sum^{m}_{i=1}(v'_{iy}-v_{iy})^2+\sum^{m}_{i=1}(v'_{iz}-v_{iz})^2 =i=1n(ixix)2+i=1n(iyiy)2+i=1n(iziz)2+i=1m(vixvix)2+i=1m(viyviy)2+i=1m(vizviz)2

上面x,y,z是独立的可以分开求解

可让向量 T = [ ∆ 1 x ′ − ∆ 1 x . . . ∆ n x ′ − ∆ n x v 1 x ′ − v 1 x . . . v m x ′ − v m x ] 可让向量T=\begin {bmatrix} ∆'_{1x}-∆_{1x}\\...\\∆'_{nx}-∆_{nx}\\\\v'_{1x}-v_{1x}\\...\\v'_{mx}-v_{mx} \end {bmatrix} 可让向量T= 1x1x...nxnxv1xv1x...vmxvmx

向量T一共有(n+m)行
由于后面是已知量,可以进一步拆分成 A x − B 形式 由于后面是已知量,可以进一步拆分成 Ax-B形式 由于后面是已知量,可以进一步拆分成AxB形式

T = [ L H ] ∗ [ v 1 x ′ v 2 x ′ . . . v n x ′ ] − [ ∆ 1 x . . . ∆ n x v 1 x . . . v m x ] T=\begin {bmatrix} L \\ H \end {bmatrix}*\begin {bmatrix} v'_{1x} \\ v'_{2x}\\...\\v'_{nx} \end {bmatrix} - \begin {bmatrix} ∆_{1x}\\...\\∆_{nx}\\\\v_{1x}\\...\\v_{mx} \end {bmatrix} T=[LH] v1xv2x...vnx 1x...nxv1x...vmx

L 是拉普拉斯矩阵, H = [ 1 0 . . . 0 . . . 0 0 1 . . . 0 . . . 0 . . . . . . . . . . . . . . . . . . 0 0 0 1 . . . 0 ] H 是 m 行, n 列 , 前面 m 行 m 列组成一个单位矩阵 L是拉普拉斯矩阵,H=\begin {bmatrix} 1&0&...&0&...&0\\0&1&...&0&...&0\\...&...&...&...&...&...\\0&0&0&1&...&0 \end {bmatrix} H是m行,n列, 前面m行m列组成一个单位矩阵 L是拉普拉斯矩阵,H= 10...001...0.........000...1............00...0 Hm行,n,前面mm列组成一个单位矩阵

则 E = ∣ ∣ T ∣ ∣ 2 , 就是求解 E 的最小值,问题就是转化成求解 m i n ∣ ∣ A x − B ∣ ∣ 2 , 这是一最小二乘问题 则E=||T||^2, 就是求解E的最小值,问题就是转化成求解 min ||Ax-B||^2, 这是一最小二乘问题 E=∣∣T2,就是求解E的最小值,问题就是转化成求解min∣∣AxB2,这是一最小二乘问题

最小二乘问题求解

设有一个f(x,y,z)函数,求最小值,最简单的方法就是求驻点。
求驻点直接求偏导,并令其等于0即可。
∂ f ∂ x = 0 , ∂ f ∂ y = 0 , ∂ f ∂ z = 0 \frac{∂f}{∂x}=0,\frac{∂f}{∂y}=0, \frac{∂f}{∂z}=0 xf=0,yf=0,zf=0

那么对于 ∣ ∣ A x − B ∣ ∣ 2 如何求偏导呢 那么对于||Ax-B||^2 如何求偏导呢 那么对于∣∣AxB2如何求偏导呢

∣ ∣ A x − B ∣ ∣ 2 = ( A x − B ) T ( A x − B ) ||Ax-B||^2=(Ax-B)^T(Ax-B) ∣∣AxB2=(AxB)T(AxB)

( x T A T − B T ) ( A x − B ) = x T A T A x − x T A T B − B T A x + B T B (x^TA^T-B^T)(Ax-B)=x^TA^TAx-x^TA^TB-B^TAx+B^TB (xTATBT)(AxB)=xTATAxxTATBBTAx+BTB

∂ ∣ ∣ A x − B ∣ ∣ 2 ∂ x = ∂ x T A T A x ∂ x − ∂ x T A T B ∂ x − ∂ B T A x ∂ x + ∂ B T B ∂ x \frac {∂||Ax-B||^2}{∂x} = \frac {∂x^TA^TAx}{∂x}- \frac {∂x^TA^TB}{∂x}- \frac {∂B^TAx}{∂x}+\frac {∂B^TB}{∂x} x∣∣AxB2=xxTATAxxxTATBxBTAx+xBTB

只要对上述4项分别求导即可。

对于 A = [ a 11 a 12 . . . a 1 n a 21 a 22 . . . a 2 n . . . . . . . . . . . . a m 1 a m 2 . . . a m n ] , x → = [ x 1 x 2 . . . x n ] 对于A = \begin {bmatrix} a_{11}&a_{12}&...&a_{1n}\\a_{21}&a_{22}&...&a_{2n}\\...&...&...&...\\a_{m1}&a_{m2}&...&a_{mn} \end {bmatrix}, \overrightarrow{x}=\begin {bmatrix} x_{1}\\x_2\\...\\x_n \end {bmatrix} 对于A= a11a21...am1a12a22...am2............a1na2n...amn ,x = x1x2...xn

A ⋅ x → = [ a 11 ⋅ x 1 + a 12 ⋅ x 2 + . . . a 1 n ⋅ x n a 21 ⋅ x 1 + a 22 ⋅ x 2 + . . . a 2 n ⋅ x n a m 1 ⋅ x 1 + a m 2 ⋅ x 2 + . . . a m n ⋅ x n ] A\cdot\overrightarrow{x}=\begin {bmatrix} a_{11} \cdot x_1+a_{12}\cdot x_2+...a_{1n}\cdot x_n\\a_{21} \cdot x_1+a_{22}\cdot x_2+...a_{2n}\cdot x_n\\ a_{m1} \cdot x_1+a_{m2}\cdot x_2+...a_{mn}\cdot x_n\\\end {bmatrix} Ax = a11x1+a12x2+...a1nxna21x1+a22x2+...a2nxnam1x1+am2x2+...amnxn

求偏导 ∂ A ⋅ x → ∂ x = [ a 11 a 21 . . . a m 1 a 12 a 22 . . . a m 2 . . . . . . . . . . . . a 1 n a 2 n . . . a m n ] = A T 求偏导 \frac {∂A\cdot \overrightarrow{x}}{∂x} =\begin {bmatrix} a_{11}&a_{21}&...&a_{m1}\\a_{12}&a_{22}&...&a_{m2}\\...&...&...&...\\a_{1n}&a_{2n}&...&a_{mn} \end {bmatrix}=A^T 求偏导xAx = a11a12...a1na21a22...a2n............am1am2...amn =AT

同理其他求导如下

∂ A x → ∂ x = A T , ∂ A x → ∂ x T = A , ∂ ( x → A ) ∂ x = A \frac {∂A \overrightarrow{x}}{∂x}=A^T, \frac {∂A \overrightarrow{x}}{∂x^T}=A,\frac {∂(\overrightarrow{x}A)}{∂x}=A xAx =AT,xTAx =A,x(x A)=A

∂ ( x → T ⋅ A ⋅ x → ) ∂ x = ( A T + A ) x \frac {∂(\overrightarrow{x}^T\cdot A \cdot \overrightarrow{x})}{∂x}=(A^T+A)x x(x TAx )=(AT+A)x

∂ ∣ ∣ A x − B ∣ ∣ 2 ∂ x = ∂ x T A T A x ∂ x − ∂ x T A T B ∂ x − ∂ B T A x ∂ x + ∂ B T B ∂ x \frac {∂||Ax-B||^2}{∂x} = \frac {∂x^TA^TAx}{∂x}- \frac {∂x^TA^TB}{∂x}- \frac {∂B^TAx}{∂x}+\frac {∂B^TB}{∂x} x∣∣AxB2=xxTATAxxxTATBxBTAx+xBTB

= ( A T A + A T A ) x − A T B − A T B + 0 =(A^TA+A^TA)x-A^TB-A^TB+0 =(ATA+ATA)xATBATB+0

= 2 A T A x − 2 A T B =2A^TAx-2A^TB =2ATAx2ATB

令导数为0解得

⇒ x = ( A T A ) − 1 A T B \Rightarrow x=(A^TA)^{-1}A^TB x=(ATA)1ATB

应用

  1. 物体变形,物体挤压变形,旋转变形
  2. 模型配准问题,游戏皮肤覆盖,衣服穿着,材料包裹
  3. 动画制作

本人码农,希望通过自己的分享,让大家更容易学懂计算机知识。

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值