一、核心思想
首先,文章题目名为《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 v_i v i 和 v ~ i \tilde{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 ) ∣
v_4=v_1+(v_2-v_1)\times(v_3-v_1)/\sqrt{|(v_2-v_1)\times(v_3-v_1)|}
v 4 = v 1 + ( v 2 − v 1 ) × ( v 3 − v 1 ) / ∣ ( v 2 − v 1 ) × ( v 3 − v 1 ) ∣
同理 v ~ i \tilde{v}_i v ~ i 也有相应的计算方式。( v 2 − v 1 ) × ( v 3 − v 1 ) / ∣ ( v 2 − v 1 ) × ( v 3 − v 1 ) ∣ (v_2-v_1)\times(v_3-v_1)/\sqrt{|(v_2-v_1)\times(v_3-v_1)|} ( v 2 − v 1 ) × ( v 3 − v 1 ) / ∣ ( v 2 − v 1 ) × ( v 3 − v 1 ) ∣ 是计算垂直于三角形所在平面的单位向量,而整个式子就是将该单位向量平移到三角形上。这里之所以选择加 v 1 v_1 v 1 ,和后面的简化运算有关。当然,这里可以用 v 2 v_2 v 2 或者 v 3 v_3 v 3 ,那么本式,和后面的公式都要对应的替换。补充知识: 坐标叉乘运算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 ) = ( m q − n p , n o − l q , l p − m o )
假设,四个点的坐标依次为 v 1 ( x 1 , y 1 , z 1 ) v_1(x_1,y_1,z_1) v 1 ( x 1 , y 1 , z 1 ) , v 2 ( x 2 , y 2 , z 2 ) v_2(x_2,y_2,z_2) v 2 ( x 2 , y 2 , z 2 ) ,v 3 ( x 3 , y 3 , z 3 ) v_3(x_3,y_3,z_3) v 3 ( x 3 , y 3 , z 3 ) , v 4 ( x 4 , y 4 , z 4 ) v_4(x_4,y_4,z_4) v 4 ( x 4 , y 4 , z 4 ) ,那么 v i v_i v i 和 v ~ i \tilde{v}_i v ~ i 都是3 × \times × 4的矩阵。两者之间可以通过一个3 × \times × 3的仿射矩阵 Q Q Q 和偏移量 d d d 联系在一起,如下(原文公式(2)):Q v i + d = v ~ i , i ∈ 1...4
Qv_i+d=\tilde{v}_i, \quad i \in 1 ... 4
Q v i + d = v ~ i , i ∈ 1 . . . 4
原文说到,为了消去 d d d ,就对每一项减去 v 1 v_1 v 1 ,就可以得到 Q V = V ~ QV=\tilde{V} Q V = V ~ ,其中(原文公式(3)):
第一次看到这里的时候,比较懒,直接默认这是成立的,而这一次为了这篇博客,我就稍微的思考了一下:
已知:
v ~ i = Q v i + d \tilde{v}_i=Qv_i+d v ~ i = Q v i + d
d = v ~ 1 − Q v 1 d=\tilde{v}_1-Qv_1 d = v ~ 1 − Q v 1
把 d d d 代入第一个式子,得:
v ~ i = Q v i + v ~ 1 − Q v 1 \tilde{v}_i=Qv_i+\tilde{v}_1-Qv_1 v ~ i = Q v i + v ~ 1 − Q v 1
左右调整一下之后,得:
v ~ i − v ~ 1 = Q ( v i − v 1 ) \tilde{v}_i-\tilde{v}_1=Q(v_i-v_1) v ~ i − v ~ 1 = Q ( v i − v 1 )
于是就可以得到原文公式(3)。所以 Q V = V ~ QV=\tilde{V} Q V = V ~ ,于是 Q = V ~ V − 1 Q=\tilde{V}V^{-1} Q = V ~ V − 1 。
(待续。。。。。。。。。。。。。。。。。。。。。。。。。。)