链接:*Skinning with Dual Quaternions,
DynamicFusion Paper
第一篇csdn的文章,主要是看网上讲DQB的少,所以打算写一个比较全的,希望得到大佬们的指点。
如果仔细去看DynamicFusion这篇非刚性3D重构 (no-rigid 3D reconstruction) 的朋友会发现,与刚性变化 (rigid transformation) 不同,非刚性重构要求算式对每帧计算一个扭曲场( Warp Field )。这个扭曲场会作为介质将非刚性变换的点转换成刚性变换的点从而进行进一步传统的刚性变化分析 ( W : S ( x ) → S E 3 ( x ) W: S(x)\rightarrow SE_3(x) W:S(x)→SE3(x))。然而,如果用传统的稠密法 (Truncated Signed Distance)去建立这个三维的扭曲场,由于要对每个 3维晶柱点 (voxel) 去做 6DoF 变换的估计,这个过程计算要求是非常大的。
(假如有一张 25 6 2 256^2 2562的图,那么算法则需要生成 25 6 3 256^3 2563的晶柱体 (voxels),每个晶柱体有6个变量 (rotation + translation),则这个算法要生成 6 ∗ 25 6 3 6 * 256^3 6∗2563个变量)
为了缩短计算时间,作者在文章中表示,由于在现实生活中非刚性运动相对平滑,所以我们可以建立一个稀疏的扭曲场,然后用这些稀疏的变量 (6DoF transformation) 去做插值 (interpolation) 从而得到一个稠密的扭曲场。为了保持在做插值中的几何结构,作者在此用到了一个叫dual-quaternion blending (DQB)的算法。
那么下面我们就一起来欣赏一下作者说的这个DQB
四元是传统意义上的欧拉角旋转矩阵的延伸,其重要性是保持旋转矩阵不进入万向死节所(gimbal lock)。如果一个旋转矩阵进入了gimbal lock中,那么这个矩阵就失去了原有的3DoF,从而不能自由的表示物体接下来的旋转状态。如果我们加入一个维度的话,我们就可以避免gimbal锁的发生。这就是为什么Quarternion是做Graphic大佬们的最爱谈论的东西。
将一个欧拉角转动矩阵转化为四元的方式很简单,提示:用 R = e x p ( [ w ] × ) R = exp([w]_\times) R=exp([w]×) (skew symmetric的特征)去想此变换式
R S E 3 = [ r 00 r 01 r 02 r 10 r 11 r 12 r 20 r 21 r 22 ] R_{SE_3} = \begin{bmatrix} r_{00} & r_{01} & r_{02} \\ r_{10} & r_{11} & r_{12} \\ r_{20} & r_{21} & r_{22} \end{bmatrix} RSE3=⎣⎡r00r10r20r01r11r21r02r12r22⎦⎤
q ( R S E 3 ) = [ q w = 1 + r 00 + r 11 + r 22 / 2 q x = ( r 21 − r 12 ) / ( 4 q w ) q y = ( r 02 − r 20 ) / ( 4 q w ) q z = ( r 10 − r 01 ) / ( 4 q w ) ] q(R_{SE_3}) = \begin{bmatrix} q_w = \sqrt{1 + r_{00} + r_{11} + r_{22}} / 2 \\ q_x = (r_{21} - r_{12})/(4q_w) \\ q_y = (r_{02} - r_{20})/(4q_w) \\ q_z = (r_{10} - r_{01})/(4q_w) \\ \end{bmatrix} q(RSE3)=⎣⎢⎢⎡qw=1+r00+r11+r22/2qx=(r21−r12)/(4qw)qy=(r02−r20)/(4qw)qz=(r10−r01)/(4qw)⎦⎥⎥⎤
验证的旋转四元的性质:
在computer graphics中,非刚性变换主要是由众多刚性变换近似而成。我们在dynamicfusion中提到过,如果对每个voxel都进行一个刚性变换的评估,这种过程非常繁杂,所以我们需要借助权重插值来将稀疏的非刚性变换来转换到稠密的非刚性变换 (non-rigid transformation field)
求刚性变换的权重插值主要是要算出由一个6DoF刚性变换 (quaternion + translation)过渡到另外一个6DoF刚性变换过程中任意一个值:
q ∗ = w 1 q 1 + w 2 q 2 , s.t. w 1 + w 2 = 1 q^* = w_1 q_1 + w_2q_2, \text{ s.t. } w_1 + w_2 = 1 q∗=w1q1+w2q2, s.t. w1+w2=1
在双四元混合文章中,作者解释说如果对四元(Quaternion)直接用权重插值在过渡过程中会改变quaternion的几何特性,如果要避免表面出现断层现象,我们要保证新的权重插值保持以下几个特性:
(下面这个图表示了如果对四元向量擅用权重插值的话会导致过渡过程出现断层现象)
如果想要达成以上目标,作者提出用双四元法对刚性变换做权重插值(interpolation)。想必到现在intro已经做得差不多了,下面我们就来详细讲解双四元混合法。
双四元(dual quarternion)可以想象成一个对原来四元的向量的延伸,而其中每一个值都是个双元(dual number)的数值。
q ^ = [ a 0 + ϵ b 0 a 1 + ϵ b 1 a 2 + ϵ b 2 a 3 + ϵ b 3 ] = q 0 + ϵ q ϵ , where ϵ 2 = 0 \hat{q} = \begin{bmatrix} a_0 + \epsilon b_0 \\ a_1 + \epsilon b_1 \\ a_2 + \epsilon b_2 \\ a_3 + \epsilon b_3 \\ \end{bmatrix} = q_0 + \epsilon q_\epsilon \text {, where } \epsilon^2 = 0 q^=⎣⎢⎢⎡a0+ϵb0a1+ϵb1a2+ϵb2a3+ϵb3⎦⎥⎥⎤=q0+ϵqϵ, where ϵ2=0
大家可以通过complex number对于real number的影响来看双四元是如何解决对四元空间的过渡断层问题(太深奥,我也讲不清楚,希望有大神可以代替我讲一讲)
双四元的基本计算: q ^ = q 0 + ϵ q ϵ \hat{q} = q_0 + \epsilon q_\epsilon q^=q0+ϵqϵ
3D 点 v v v:
文章中说通常3D的向量 v = [ x y z ] v = \begin{bmatrix}x \\ y \\ z \end{bmatrix} v=⎣⎡xyz⎦⎤都能转换成 v ^ \hat{v} v^ (单元双四元,unit dual quaternion),转换方式如下:
v ^ = [ 1 ϵ x ϵ y ϵ z ] = [ 1 0 0 0 ] + ϵ [ 0 x y z ] = q 0 + ϵ q ϵ \hat{v} = \begin{bmatrix} 1 \\ \epsilon x \\ \epsilon y \\ \epsilon z \end{bmatrix} = \begin{bmatrix}1 \\ 0 \\ 0 \\ 0 \end{bmatrix} + \epsilon \begin{bmatrix}0 \\ x \\ y \\ z \end{bmatrix} = q_0 + \epsilon q_\epsilon v^=⎣⎢⎢⎡1ϵxϵyϵz⎦⎥⎥⎤=⎣⎢⎢⎡1000⎦⎥⎥⎤+ϵ⎣⎢⎢⎡0xyz⎦⎥⎥⎤=q0+ϵqϵ
其中 ∣ ∣ q 0 ∣ ∣ = 1 ||q_0|| = 1 ∣∣q0∣∣=1, < q 0 , q ϵ > = 0
旋转 R R R:
我们都知道旋转矩阵转换来的四元( R → q r R\rightarrow q_r R→qr)本身就是一个单元向量( ∣ ∣ q ∣ ∣ = 1 ||q|| = 1 ∣∣q∣∣=1),所以对于 q r q_r qr,它的双四元和四元是一样的。我们知道所有的3D空间中旋转后的点 x ′ = R x x' = R x x′=Rx,都可以另用对应的四元来表示 x ′ = q r x q r − 1 x' = q_rxq_r^{-1} x′=qrxqr−1。在双四元空间,只要先将点和旋转的都转换进入双四元空间,之后两者之间的关系都是相似的 x ′ ^ = q ^ x ^ q ∗ ^ ˉ \hat{x'} = \hat{q}\hat{x}\bar{\hat{q^*}} x′^=q^x^q∗^ˉ 在这里 q ∗ ^ \hat{q^*} q∗^等同于 q − 1 q^{-1} q−1的性质。
我们可以进一步简化上面的式子得出:
x ′ ^ = q ( 1 + ϵ ( x i + y j + z k ) ) q − 1 = 1 + ϵ q ( x i + y j + z k ) q − 1 \hat{x'} = q(1 + \epsilon(xi + yj+zk))q^{-1} = 1 +\epsilon q(xi+yj+zk)q^{-1} x′^=q(1+ϵ(xi+yj+zk))q−1=1+ϵq(xi+yj+zk)q−1
如果我们看原式中 q ϵ q_\epsilon qϵ这项,是不是很像 q x q − 1 qxq^{-1} qxq−1。
位移 t t t:
文章表示 q x q − 1 qxq^{-1} qxq−1这个elegant的公式不仅能表示旋转特性,还能表示translation的几何特性 x ′ ^ = t ^ x ^ t ∗ ^ ˉ \hat{x'} = \hat{t}\hat{x}\bar{\hat{t^*}} x′^=t^x^t∗^ˉ
在这里从 t = [ t 0 t 1 t 2 ] t = \begin{bmatrix}t_0 \\ t_1\\ t_2\end{bmatrix} t=⎣⎡t0t1t2⎦⎤转换到双四元的公式为:
t ^ = [ 1 0 0 0 ] + ϵ / 2 [ 0 t 0 t 1 t 2 ] \hat{t} = \begin{bmatrix}1 \\ 0 \\ 0 \\ 0 \end{bmatrix} + \epsilon/2\begin{bmatrix}0 \\ t_0 \\ t_1 \\ t_2 \end{bmatrix} t^=⎣⎢⎢⎡1000⎦⎥⎥⎤+ϵ/2⎣⎢⎢⎡0t0t1t2⎦⎥⎥⎤
如果在这里不除2的话,原点就会向 t t t方向移动两次,如果我们带入到之前的公式的话,我们会看到:
t ^ x ^ t ^ ∗ ˉ = 1 + ϵ ( ( x + t 0 ) i + ( y + t 1 ) j + ( z + t 2 ) k ) \hat{t}\hat{x}\bar{\hat{t}^*} = 1 + \epsilon ((x+t_0)i + (y+t_1)j + (z+t_2)k) t^x^t^∗ˉ=1+ϵ((x+t0)i+(y+t1)j+(z+t2)k)
有了R和t,我们的rigid transform对应的双四元就可表示为:
( t ^ q ^ ) x ^ ( q ∗ ^ t ∗ ^ ) (\hat{t} \hat{q}) \hat{x} (\hat{q^*}\hat{t^*}) (t^q^)x^(q∗^t∗^)
其中 T ^ = ( t ^ q ^ ) = ( 1 + ϵ / 2 ( t 0 i + t 1 j + t 2 k ) ) q r \hat{T} = (\hat{t}\hat{q}) = (1 + \epsilon/2(t_0i + t_1j + t_2k))q_r T^=(t^q^)=(1+ϵ/2(t0i+t1j+t2k))qr
如果想从 T ^ \hat{T} T^转换成R和t的话也很简单:
R ← q r R \leftarrow q_r R←qr
t ← 2 ∗ q ϵ ∗ q r − 1 t \leftarrow 2 * q_\epsilon * q_r ^{-1} t←2∗qϵ∗qr−1
到这里我们终于可以讲一直拖了半天的算法(DQB),看懂Dual Quaternion的同学会发现,这无非就是在双四元空间中做权重的一个算法。文章中的公式如下:
D L B ( w ; q 1 ^ , q 2 ^ . . . q n ^ ) = w 1 q 1 ^ + . . . + w n q n ^ ∣ ∣ w 1 q 1 ^ + . . . + w n q n ^ ∣ ∣ DLB(\textbf{w}; \hat{q_1}, \hat{q_2}...\hat{q_n}) = \frac{w_1\hat{q_1} + ...+w_n\hat{q_n}}{||w_1\hat{q_1} + ... + w_n\hat{q_n}||} DLB(w;q1^,q2^...qn^)=∣∣w1q1^+...+wnqn^∣∣w1q1^+...+wnqn^
之后的文章通过运用双四元的性质去证明这个在双四元空间下的权重方法达到了之前作者对优秀刚性过渡插值的三点要求(部分证明更新中。。。着急的朋友可以先看原文)
然而故事还没有结束,DQB文章只说明了怎么取做刚性变换的权重,而没有像DynamicFusion里融合了高斯牛顿优化去求最佳解。这种全新的solver叫做pre-conditioned conjugate gradient descent solver。但是我希望看完这篇讲解,大家能对Quaternion的重要性有一个更好的认知。