1.背景
PD(Projective Dynamics)仿真算法是一种“可并行化计算的”高效的软体形变模拟(或成为仿真、动画)算法,与传统的基于力的有限元方法不同的是,PD算法直接作用于顶点位置,通过最小化能量函数的方式来求得一个稳定的解。能量函数一般包括“系统偏离预期位置的能量”和“顶点位置约束能量”两部分组成,最小化能量函数可以通过引入辅助变量的方法转换为求解一个线性方程组的问题。详细的PD算法不在这里展开。

本文要讨论的是PD算法中对于四面体网格模型“形状约束”的求解中矩阵论知识的应用。
四面体网格模型的“元”为四个顶点组成的四面体
{
x
1
,
x
2
,
x
3
,
x
4
}
\{\mathbf{x}_1,\mathbf{x}_2,\mathbf{x}_3,\mathbf{x}_4\}
{x1,x2,x3,x4},我们定义其形状
X
=
[
x
2
−
x
1
,
x
3
−
x
1
,
x
4
−
x
1
]
,
(1.1)
\mathbf{X}=[\mathbf{x}_2-\mathbf{x}_1,\mathbf{x}_3-\mathbf{x}_1,\mathbf{x}_4-\mathbf{x}_1], \tag{1.1}
X=[x2−x1,x3−x1,x4−x1],(1.1)
定义形状的方式可能有很多,但是需要与空间位置无关,也就是要满足平移不变性。假设初始形状为“非奇异的”
X
0
\mathbf{X}_0
X0,那么对于变形之后的四面体形状
X
\mathbf{X}
X,有
X
=
F
X
0
或
F
=
X
X
0
−
1
,
(1.2)
\mathbf{X}=\mathbf{F}\mathbf{X}_0 \quad \text{或} \quad \mathbf{F}=\mathbf{X}\mathbf{X}_0^{-1}, \tag{1.2}
X=FX0或F=XX0−1,(1.2)
其中
F
\mathbf{F}
F就是变形梯度矩阵。在PD算法中对于约束需要导出一个能量项,因此本文探讨的是如何导出变形梯度矩阵的能量函数。
2.极分解
为了对变形梯度矩阵进行“符合物理规律”的分解,首先需要了解极分解(polar decomposition)定理。
定理2.1(极分解):设 A \mathbf{A} A是 n n n阶实方阵,则一定存在正交矩阵 Q \mathbf{Q} Q和唯一的半正定矩阵 T \mathbf{T} T,使得 A = Q T \mathbf{A}=\mathbf{Q}\mathbf{T} A=QT。若 A \mathbf{A} A可逆,则 Q \mathbf{Q} Q也是唯一的,并且 T \mathbf{T} T是正定的。
证明:
存在奇异值分解
A
=
V
S
U
T
\mathbf{A}=\mathbf{V}\mathbf{S}\mathbf{U}^T
A=VSUT,其中
V
,
U
\mathbf{V},\mathbf{U}
V,U是正交阵,
S
=
diag
{
σ
1
,
…
,
σ
r
,
0
,
…
,
0
}
\mathbf{S}=\text{diag}\{\sigma_1,\dots,\sigma_r,0,\dots,0\}
S=diag{σ1,…,σr,0,…,0},
σ
1
≥
⋯
≥
σ
r
>
0
\sigma_1\ge\dots\ge\sigma_r>0
σ1≥⋯≥σr>0,做变换
A
=
V
S
U
T
=
V
U
T
U
S
U
T
=
Q
T
,
Q
=
V
U
T
,
T
=
U
S
U
T
,
(2.1)
\begin{aligned} \mathbf{A}&=\mathbf{V}\mathbf{S}\mathbf{U}^T \\ &=\mathbf{V}\mathbf{U}^T\mathbf{U}\mathbf{S}\mathbf{U}^T \\ &=\mathbf{Q}\mathbf{T} ,\\ \mathbf{Q}&=\mathbf{V}\mathbf{U}^T , \quad \mathbf{T}=\mathbf{U}\mathbf{S}\mathbf{U}^T, \end{aligned} \tag{2.1}
AQ=VSUT=VUTUSUT=QT,=VUT,T=USUT,(2.1)
则
Q
\mathbf{Q}
Q是正交矩阵,
T
\mathbf{T}
T是半正定矩阵(特征值不小于0,对称);注意到
T
=
U
S
U
T
=
(
U
S
U
T
U
S
U
T
)
1
2
=
(
U
S
S
U
T
)
1
2
=
(
A
T
A
)
1
2
,
(2.2)
\begin{aligned} \mathbf{T}&=\mathbf{U}\mathbf{S}\mathbf{U}^T \\ &= (\mathbf{U}\mathbf{S}\mathbf{U}^T\mathbf{U}\mathbf{S}\mathbf{U}^T)^{\frac{1}{2}} \\ &= (\mathbf{U}\mathbf{S}\mathbf{S}\mathbf{U}^T)^{\frac{1}{2}} \\ &= (\mathbf{A}^T\mathbf{A})^{\frac{1}{2}}, \end{aligned} \tag{2.2}
T=USUT=(USUTUSUT)21=(USSUT)21=(ATA)21,(2.2)
其中
A
T
A
\mathbf{A}^T\mathbf{A}
ATA是半正定矩阵,有
r
=
r
(
A
T
A
)
=
r
(
A
)
r=r(\mathbf{A}^T\mathbf{A})=r(\mathbf{A})
r=r(ATA)=r(A)个非零特征值,则其平方根共有
2
r
2^r
2r种可能性,显然对于每个非零特征值都有正负两种平方根(即
±
σ
i
\pm\sigma_i
±σi)可以选取。而当所有非零特征值都选择正平方根(
σ
i
\sigma_i
σi)时,“半正定矩阵”
T
\mathbf{T}
T就是唯一的。为什么
Q
\mathbf{Q}
Q不唯一呢?因为
T
\mathbf{T}
T里面有些特征值是
0
0
0。
当
A
\mathbf{A}
A可逆,也就是
A
\mathbf{A}
A的特征值都不为
0
0
0,此时显然
T
\mathbf{T}
T是正定的,也是可逆的,因此
Q
\mathbf{Q}
Q唯一确定:
Q
=
A
T
−
1
(2.3)
\mathbf{Q}=\mathbf{A}\mathbf{T}^{-1} \tag{2.3}
Q=AT−1(2.3)
3.变形梯度的分解
回顾变形梯度的定义式1.1,首先规定一点,四面体形状 X \mathbf{X} X在任何时候都是“非奇异”的,也就是不会退化成平面的情况。因此,变形梯度是可逆的。
根据定理2.1,可对变形梯度进行极分解:
F
=
R
S
,
(3.1)
\mathbf{F}=\mathbf{R}\mathbf{S}, \tag{3.1}
F=RS,(3.1)
其中
R
\mathbf{R}
R是“唯一的“正交阵,
S
\mathbf{S}
S是”唯一的”正定阵。
这么做的好处是分解后的矩阵将“变形”的旋转部分和其它部分分离开来, R \mathbf{R} R是旋转部分(“rotation”), S \mathbf{S} S是拉伸和切变部分(“stretch"和"shear”)。 ∣ S ∣ |\mathbf{S}| ∣S∣描述了四面体的体积变化。
具体分解步骤(前面的公式是教材上的公式,这里为了适应NumPy的定义换了符号):
- 奇异值分解: F = U S V \mathbf{F}=\mathbf{U}\mathbf{S}\mathbf{V} F=USV;
- 计算 R = U V \mathbf{R}=\mathbf{U}\mathbf{V} R=UV 和 S = V T S V \mathbf{S}=\mathbf{V}^T\mathbf{S}\mathbf{V} S=VTSV 。
4.实验
为了可视化地验证变形梯度矩阵的极分解,我设计了一个小实验:固定四面体的顶点
x
1
=
(
0
,
0
,
0
)
T
\mathbf{x}_1=(0,0,0)^T
x1=(0,0,0)T,变形前后的形状矩阵设置为
X
1
=
[
1
0
0
0
1
0
0
0
1
]
,
X
2
=
[
−
0.5
−
1.3
0
1.5
0
0
0
0
2.3
]
,
(4.1)
\begin{aligned} \mathbf{X}_1=\left[\begin{matrix} 1&0&0\\0&1&0\\0&0&1 \end{matrix}\right], \quad \mathbf{X}_2=\left[\begin{matrix} -0.5&-1.3&0\\1.5&0&0\\ 0&0&2.3 \end{matrix}\right], \end{aligned} \tag{4.1}
X1=⎣⎡100010001⎦⎤,X2=⎣⎡−0.51.50−1.300002.3⎦⎤,(4.1)
直观上来看上述变形就是将四面体绕 z z z轴旋转90°,并且每个轴的方向拉伸一个系数,然后把 x 2 \mathbf{x}_2 x2沿 x x x轴移动 − 0.5 -0.5 −0.5。
根据第3节讲的变形梯度矩阵极分解的步骤,得到的结果为
R
=
[
−
0.17579064
−
0.98442758
0
0.98442758
−
0.17579064
0
0
0
1
]
,
S
=
[
1.56453668
0.22852783
0
0.22852783
1.27975585
0
0
0
2.3
]
,
∣
R
∣
=
1
,
∣
S
∣
=
4.485
,
(4.2)
\begin{aligned} &\mathbf{R}=\left[\begin{matrix} -0.17579064&-0.98442758&0\\0.98442758&-0.17579064&0\\0&0&1 \end{matrix}\right], \quad \mathbf{S}=\left[\begin{matrix} 1.56453668&0.22852783&0\\0.22852783&1.27975585&0\\ 0&0&2.3 \end{matrix}\right], \\ &|\mathbf{R}|=1, \quad |\mathbf{S}|=4.485, \end{aligned} \tag{4.2}
R=⎣⎡−0.175790640.984427580−0.98442758−0.175790640001⎦⎤,S=⎣⎡1.564536680.2285278300.228527831.279755850002.3⎦⎤,∣R∣=1,∣S∣=4.485,(4.2)
单独对初始形状
X
1
\mathbf{X}_1
X1应用
R
\mathbf{R}
R和
S
\mathbf{S}
S的结果如下:
实验结果符合预期。