一、核心思想
首先,文章题目名为《Deformation Transfer for Triangle Meshes》,即三角网格的形变迁移。这一理论的核心观点可以参考下图,已知条件需要包括三个信息:
1、源始网格
S
S
S,也就是下图中第一行的第一匹马;
2、与
S
S
S 对应的发生形变的网格
S
′
S'
S′,也就是第一行后面的各种各样的马;
3、目标网格
T
T
T,也就是我们想要让他像
S
S
S 形变方式一样的目标,即图中第二行的第一只骆驼。
通过上述三点已知条件,从而得到生成的形变网格
T
′
T'
T′, 也就是第二行后面各种各样的网格。需要注意的是,每一对
S
S
S 和
T
T
T, 或者
S
′
S'
S′ 和
T
′
T'
T′,也就是图中的每一列,在形态上是一致的。
根据形变迁移的理论,
S
S
S 和
S
′
S'
S′ 之间一定存在着确定的形变关系,那么
T
T
T 和
T
′
T'
T′ 之间也一定存在着相类似的形变关系。
作者在摘要中提到,他们提出的是一种通用的方法,
S
S
S 和
T
T
T 之间不需要拥有相同数量的顶点、三角形或者相同的点与点之间的连接方式。
二、算法分析
1、Deformation Transfer (形变迁移)
形变迁移的目的是将源变形所表现出的形状变化传递到目标上。
我们知道三点成面,这也是三角网格的由来。在二维平面中,一个三角形如何发生变化都不会离开这个平面维度,但是空间中,一个三角形发生形变,就有很大的可能离开它原始的平面。因此,作者引入了一个三角形面外的一个点作为辅助,来探寻该三角形的空间变化。
首先令
v
i
\mathbf{v}_i
vi 和
v
~
i
\tilde{\mathbf{v}}_i
v~i,
i
∈
1
,
2
,
3
i \in{1,2,3}
i∈1,2,3,分别表示三角形形变前后的三个顶点,那么第四个顶点可以通过以下公式(原文公式(1)
)得到:
v
4
=
v
1
+
(
v
2
−
v
1
)
×
(
v
3
−
v
1
)
/
∣
(
v
2
−
v
1
)
×
(
v
3
−
v
1
)
∣
\mathbf{v}_4=\mathbf{v}_1+(\mathbf{v}_2-\mathbf{v}_1)\times(\mathbf{v}_3-\mathbf{v}_1)/\sqrt{|(\mathbf{v}_2-\mathbf{v}_1)\times(\mathbf{v}_3-\mathbf{v}_1)|}
v4=v1+(v2−v1)×(v3−v1)/∣(v2−v1)×(v3−v1)∣
同理
v
~
i
\tilde{\mathbf{v}}_i
v~i 也有相应的计算方式。
(
v
2
−
v
1
)
×
(
v
3
−
v
1
)
/
∣
(
v
2
−
v
1
)
×
(
v
3
−
v
1
)
∣
(\mathbf{v}_2-\mathbf{v}_1)\times(\mathbf{v}_3-\mathbf{v}_1)/\sqrt{|(\mathbf{v}_2-\mathbf{v}_1)\times(\mathbf{v}_3-\mathbf{v}_1)|}
(v2−v1)×(v3−v1)/∣(v2−v1)×(v3−v1)∣是计算垂直于三角形所在平面的单位向量,而整个式子就是将该单位向量平移到三角形上。这里之所以选择加
v
1
\mathbf{v}_1
v1,和后面的简化运算有关。当然,这里可以用
v
2
\mathbf{v}_2
v2 或者
v
3
\mathbf{v}_3
v3,那么本式,和后面的公式都要对应的替换。
补充知识: 坐标叉乘运算
a
×
b
=
(
l
,
m
,
n
)
×
(
o
,
p
,
q
)
=
(
m
q
−
n
p
,
n
o
−
l
q
,
l
p
−
m
o
)
a\times b=(l,m,n)\times (o,p,q)=(mq-np,no-lq,lp-mo)
a×b=(l,m,n)×(o,p,q)=(mq−np,no−lq,lp−mo)
假设,四个点的坐标依次为
v
1
(
x
1
,
y
1
,
z
1
)
v_1(x_1,y_1,z_1)
v1(x1,y1,z1),
v
2
(
x
2
,
y
2
,
z
2
)
v_2(x_2,y_2,z_2)
v2(x2,y2,z2),
v
3
(
x
3
,
y
3
,
z
3
)
v_3(x_3,y_3,z_3)
v3(x3,y3,z3),
v
4
(
x
4
,
y
4
,
z
4
)
v_4(x_4,y_4,z_4)
v4(x4,y4,z4),那么
v
i
v_i
vi 和
v
~
i
\tilde{v}_i
v~i 都是3
×
\times
× 4的矩阵。两者之间可以通过一个3
×
\times
× 3的仿射矩阵
Q
\mathbf{Q}
Q 和偏移量
d
\mathbf{d}
d 联系在一起,如下(原文公式(2)
):
Q
v
i
+
d
=
v
~
i
,
i
∈
1...4
\mathbf{Q}\mathbf{v}_i+\mathbf{d}=\tilde{\mathbf{v}}_i, \quad i \in 1 ... 4
Qvi+d=v~i,i∈1...4
原文说到,为了消去
d
\mathbf{d}
d,就对每一项减去
v
1
\mathbf{v}_1
v1,就可以得到
Q
V
=
V
~
\mathbf{Q}\mathbf{V}=\tilde{\mathbf{V}}
QV=V~,其中(原文公式(3)
):
对于两个公式的推导如下:
已知:
v
~
i
=
Q
v
i
+
d
\tilde{\mathbf{v}}_i=\mathbf{Q}\mathbf{v}_i+\mathbf{d}
v~i=Qvi+d
d
=
v
~
1
−
Q
v
1
\mathbf{d}=\tilde{\mathbf{v}}_1-\mathbf{Q}\mathbf{v}_1
d=v~1−Qv1
把
d
\mathbf{d}
d 代入第一个式子,得:
v
~
i
=
Q
v
i
+
v
~
1
−
Q
v
1
\tilde{\mathbf{v}}_i=\mathbf{Q}\mathbf{v}_i+\tilde{\mathbf{v}}_1-\mathbf{Q}\mathbf{v}_1
v~i=Qvi+v~1−Qv1
左右调整一下之后,得:
v
~
i
−
v
~
1
=
Q
(
v
i
−
v
1
)
\tilde{\mathbf{v}}_i-\tilde{\mathbf{v}}_1=\mathbf{Q}(\mathbf{v}_i-\mathbf{v}_1)
v~i−v~1=Q(vi−v1)
于是就可以得到原文公式(3)
。所以
Q
V
=
V
~
\mathbf{Q}\mathbf{V}=\tilde{\mathbf{V}}
QV=V~,于是
Q
=
V
~
V
−
1
\mathbf{Q}=\tilde{\mathbf{V}}\mathbf{V}^{-1}
Q=V~V−1 (原文公式(4)
)。
除了模型形变前后需要建立联系之外(如上所述),源始网格
S
\mathbf{S}
S 和目标网格
T
\mathbf{T}
T 之间也要建立联系(如下)。
由于形变是建立在三角网格的基础上的,因此源始网格中的三角形需要和目标网格中的三角形建立一一对应关系,即两者之间存在一个映射
M
M
M,如原文公式(5)
:
M
=
{
(
s
1
,
t
1
)
,
(
s
2
,
t
2
)
,
…
,
(
s
∣
M
∣
,
t
∣
M
∣
)
}
M=\left\{\left(s_{1}, t_{1}\right),\left(s_{2}, t_{2}\right), \ldots,\left(s_{|M|}, t_{|M|}\right)\right\}
M={(s1,t1),(s2,t2),…,(s∣M∣,t∣M∣)}
原文中提到,对于
M
M
M 没有任何限制,可以理解为这是在编程时需要自行建立的。
那么问题又来了,当我们求得仿射矩阵之后,只依靠源始网格
S
S
S 的仿射矩阵求解形变还是不够的。
S
S
S 和
T
T
T 之间还是存在着差异,不能只依靠一个仿射矩阵,通过前面的论述,一个仿射矩阵实际上只能改变方向(因为
v
4
\mathbf{v}_4
v4 )和尺寸大小(因为
v
1
,
v
2
,
v
3
\mathbf{v}_1,\mathbf{v}_2,\mathbf{v}_3
v1,v2,v3),而不能改变位置(因为没有
d
\mathbf{d}
d ),如下图A所示。而且,直接用
S
S
S 的
d
\mathbf{d}
d 也不能很好的解决这个问题,如下图B所示,因为
d
\mathbf{d}
d 收到尺寸和位置的影响。因此要利用三角网格之间共享顶点的机理来解决这个问题,效果如下图C所示。
针对上述问题,假设
S
S
S 的仿射矩阵为
S
\mathbf{S}
S,
T
T
T 的仿射矩阵为
T
\mathbf{T}
T。首先,根据共享顶点的原理,发生形变后,相邻的两个三角网格满足如下关系(原文公式(6)
):
T
j
v
i
+
d
j
=
T
k
v
i
+
d
k
,
∀
i
,
∀
j
,
k
∈
p
(
v
i
)
\mathbf{T}_{j} \mathbf{v}_{i}+\mathbf{d}_{j}=\mathbf{T}_{k} \mathbf{v}_{i}+\mathbf{d}_{k}, \quad \forall i, \forall j, k \in p\left(v_{i}\right)
Tjvi+dj=Tkvi+dk,∀i,∀j,k∈p(vi)
其中,
j
j
j 和
k
k
k 表示两个相邻的三角网格,
v
i
\mathbf{v}_{i}
vi 表示两个三角网格共同的顶点,
p
p
p 表示所有的三角网格集合。这一步这参考下图。
因此,最终的目标是在保证顶点共享的前提下,根据
M
M
M 的匹配关系,尽可能的缩小非平移参数即两组仿射矩阵之间的差距。于是可以用一个约束优化问题来表示(原文公式(7)
):
min
T
1
+
d
1
…
T
∣
T
∣
+
d
∣
T
∣
∑
j
=
1
∣
M
∣
∥
S
s
j
−
T
t
j
∥
F
2
subject to
T
j
v
i
+
d
j
=
T
k
v
i
+
d
k
,
∀
i
,
∀
j
,
k
∈
p
(
v
i
)
\begin{aligned} \min _{\mathbf{T}_{1}+\mathbf{d}_{1} \ldots \mathbf{T}_{|T|}+\mathbf{d}_{|T|}} & \sum_{j=1}^{|M|}\left\|\mathbf{S}_{s_{j}}-\mathbf{T}_{t_{j}}\right\|_{F}^{2} \\ \text { subject to } & \mathbf{T}_{j} \mathbf{v}_{i}+\mathbf{d}_{j}=\mathbf{T}_{k} \mathbf{v}_{i}+\mathbf{d}_{k}, \quad \forall i, \forall j, k \in p\left(v_{i}\right) \end{aligned}
T1+d1…T∣T∣+d∣T∣min subject to j=1∑∣M∣∥∥Ssj−Ttj∥∥F2Tjvi+dj=Tkvi+dk,∀i,∀j,k∈p(vi)
∣
T
∣
|T|
∣T∣ 表示目标网格
T
T
T 中三角形的个数,
F
F
F 表示范数。
2、Vertex Formulation(顶点公式)
虽然原文公式(7)
已经能够解决这样一个形变问题,但是若能消去约束条件那就更好了。根据原文公式(4)
,可以得到
T
=
V
~
V
−
1
\mathbf{T}=\tilde{\mathbf{V}}\mathbf{V}^{-1}
T=V~V−1,其中
V
−
1
\mathbf{V}^{-1}
V−1 是已知的属于
T
T
T 的顶点,而
V
~
\tilde\mathbf{V}
V~ 是未知的属于
T
′
T'
T′ 的顶点。因此,我们可以认为
T
\mathbf{T}
T 是关于未知的形变向量的线性组合。又因为
S
\mathbf{S}
S 是可以求得的,所以原文公式(7)
的最小化问题可以重写为原文公式(8)
:
min
v
~
1
…
v
~
n
∑
j
=
1
∣
M
∣
∥
S
s
j
−
T
t
j
∥
F
2
\min _{\tilde{\mathbf{v}}_{1} \ldots \tilde{\mathbf{v}}_{n}} \sum_{j=1}^{|M|}\left\|\mathbf{S}_{s_{j}}-\mathbf{T}_{t_{j}}\right\|_{F}^{2}
v~1…v~nminj=1∑∣M∣∥∥Ssj−Ttj∥∥F2
于是就可以将这样一个问题看作是一个最小二乘求解的问题,如原文公式(9)
min
v
~
1
…
v
~
n
∥
c
−
A
x
~
∥
2
2
\min _{\tilde{\boldsymbol{\mathbf{v}}}_{1} \ldots \tilde{\boldsymbol{\mathbf{v}}}_{n}}\|\mathbf{c}-\mathbf{A} \tilde{\mathbf{x}}\|_{2}^{2}
v~1…v~nmin∥c−Ax~∥22
其中,
x
~
\tilde{\mathbf{x}}
x~ 是未知的形变顶点所在位置,
c
\mathbf{c}
c 是包含整个源始网格的形变转换矩阵,
A
\mathbf{A}
A 是关于目标网格中未形变的顶点位置。于是这个的最小二乘解就可以求得(原文公式(10)
):
A
T
A
x
~
=
A
T
c
\mathbf{A}^{\mathrm{T}} \mathbf{A} \tilde{\mathbf{x}}=\mathbf{A}^{\mathrm{T}} \mathbf{c}
ATAx~=ATc
3、Correspondence(一致性)
这一节主要是寻找源三角网格和目标三角网格之间的映射关系原文公式(5)
,即源三角形与目标三角形之间的对应关系决定了源网格的变形如何传递到目标上。作者的对应技术是一个正则化的迭代最近点算法,在用户选择的标记点的辅助下,将源网格变形为目标网格。然后,通过搜索中心距离较近的源三角形和目标三角形对来计算三角对应关系。
(关于这一节对我当下任务来说没什么用处,所以具体分析等以后有时间了再来弄。)