欢迎关注更多精彩
关注我,学习常用算法与数据结构,一题多解,降维打击。
基本问题
普遍的应用是对一个三维物体推动或拉动某一处,求出三维物体最后会变形成什么样。
如上图所示:以一个表面为例,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)=vi−j∈N(i)∑wijvj
N ( i ) 表示 v i 的 1 领域,由 w i j 组成的矩阵 L 称为拉普拉斯矩阵 N(i)表示v_i的1领域,由 w_{ij} 组成的矩阵L 称为拉普拉斯矩阵 N(i)表示vi的1领域,由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的度
wij有3种取值方式,wij=1,wij=di1,wij=cotαij+cotβij,di代表vi的度
拉普拉斯算子蕴含着曲面的局部特征信息,网格曲面的拉普拉斯坐标其在网格变形、网格平滑、网格去噪等方面都有着重要的应用。
能量方程构建
顶点有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 arcmin∑i=1n∣∣∆i′−∆i∣∣2+∑i=1m∣∣vi′−vi∣∣2
我们如果可以解出上述式子使得能量最小,那么就确定了最终的点的位置了。
对式子进行拆分,可以发现是一个最小二乘问题。
可以对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∣∣∆i′−∆i∣∣2+∑i=1m∣∣vi′−vi∣∣2
= ∑ 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(∆ix′−∆ix)2+∑i=1n(∆iy′−∆iy)2+∑i=1n(∆iz′−∆iz)2+∑i=1m(vix′−vix)2+∑i=1m(viy′−viy)2+∑i=1m(viz′−viz)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= ∆1x′−∆1x...∆nx′−∆nxv1x′−v1x...vmx′−vmx
向量T一共有(n+m)行
由于后面是已知量,可以进一步拆分成
A
x
−
B
形式
由于后面是已知量,可以进一步拆分成 Ax-B形式
由于后面是已知量,可以进一步拆分成Ax−B形式
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]∗ v1x′v2x′...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 H是m行,n列,前面m行m列组成一个单位矩阵
则 E = ∣ ∣ T ∣ ∣ 2 , 就是求解 E 的最小值,问题就是转化成求解 m i n ∣ ∣ A x − B ∣ ∣ 2 , 这是一最小二乘问题 则E=||T||^2, 就是求解E的最小值,问题就是转化成求解 min ||Ax-B||^2, 这是一最小二乘问题 则E=∣∣T∣∣2,就是求解E的最小值,问题就是转化成求解min∣∣Ax−B∣∣2,这是一最小二乘问题
最小二乘问题求解
设有一个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
∂x∂f=0,∂y∂f=0,∂z∂f=0
那么对于 ∣ ∣ A x − B ∣ ∣ 2 如何求偏导呢 那么对于||Ax-B||^2 如何求偏导呢 那么对于∣∣Ax−B∣∣2如何求偏导呢
∣ ∣ A x − B ∣ ∣ 2 = ( A x − B ) T ( A x − B ) ||Ax-B||^2=(Ax-B)^T(Ax-B) ∣∣Ax−B∣∣2=(Ax−B)T(Ax−B)
( 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 (xTAT−BT)(Ax−B)=xTATAx−xTATB−BTAx+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∂∣∣Ax−B∣∣2=∂x∂xTATAx−∂x∂xTATB−∂x∂BTAx+∂x∂BTB
只要对上述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} A⋅x= a11⋅x1+a12⋅x2+...a1n⋅xna21⋅x1+a22⋅x2+...a2n⋅xnam1⋅x1+am2⋅x2+...amn⋅xn
求偏导 ∂ 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 求偏导∂x∂A⋅x= 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 ∂x∂Ax=AT,∂xT∂Ax=A,∂x∂(xA)=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∂(xT⋅A⋅x)=(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∂∣∣Ax−B∣∣2=∂x∂xTATAx−∂x∂xTATB−∂x∂BTAx+∂x∂BTB
= ( 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)x−ATB−ATB+0
= 2 A T A x − 2 A T B =2A^TAx-2A^TB =2ATAx−2ATB
令导数为0解得
⇒ x = ( A T A ) − 1 A T B \Rightarrow x=(A^TA)^{-1}A^TB ⇒x=(ATA)−1ATB
应用
- 物体变形,物体挤压变形,旋转变形
- 模型配准问题,游戏皮肤覆盖,衣服穿着,材料包裹
- 动画制作
本人码农,希望通过自己的分享,让大家更容易学懂计算机知识。