wacchoz’s note

プログラミングとか数学について

スキニングの話(3)

次はDual Quaternionを使ったスキニング手法。

Ladislav Kavan et al.,2008, Geometric skinning with approximate dual quaternion blending, ACM Trans. Graph. 27, 4, 105.

Quaternionは回転しか表せず、平行移動は表せないのがとっても不満です。
Dual Quaternionはその不満を解消するツールです。

Dual Quaternionは

\displaystyle \hat{\mathbf{q}}=\mathbf{q}_0+\epsilon\mathbf{q}_\epsilon

のように定義されます。
ここで\epsilonは"dual unit"と呼ばれ、 \epsilon^2=0という特殊な規則に従う数です。
\mathbf{q}_0\mathbf{q}_\epsilonは普通のQuaternionであり、前者はnon-dual part、後者はdual partと呼ぶことにします。
Quaternionと\epsilonの積は可換です。

さて、回転を表すdual quaternionはnon-dual partの \mathbf{q}_\epsilonを0とし、

 \displaystyle \hat{\mathbf{q}}=\mathbf{q}_0

とするだけ。つまり今までのquaternionと同じだ。

では今までと変わったのは何かというと、平行移動を表せることだ。
平行移動 (t_0 ,t_1, t_2)を表すには

 \displaystyle \hat{\mathbf{t}}=1+\frac{\epsilon}{2}(t_0\mathbf{i}+t_1\mathbf{j}+t_2\mathbf{k})

のようnon-dual partを1とし、dual partに平行移動成分を持たせたものとなる。
2で割るのは回転のquaternionのときと似ている。

平行移動と回転移動を合成するには普通に乗算すればよい。

さて、実際に頂点にdual quaternionを作用させるには、まず頂点座標\mathbf{v}

 \displaystyle \hat{\mathbf{v}}=1+\epsilon(v_0\mathbf{i}+v_1\mathbf{j}+v_2\mathbf{k})

のように変換し、

 \displaystyle \mathbf{v}'=\hat{\mathbf{q}}\hat{\mathbf{v}}\overline{\hat{\mathbf{q}}^*}

とすればよい。

回転と平行移動を合成するというよりは、平行移動しながら回転するという螺旋的なイメージの方が合っている。
実際、

\displaystyle \hat{\mathbf{q}}=\cos\frac{\hat{\theta}}{2}+\hat{\mathbf{s}}\sin\frac{\hat{\theta}}{2}

というdual quaternionを考えてみる。\thetasは両方ともdual quaternionである。
これは螺旋軸に沿った回転と平行移動を表す。
\theta_0は回転角を表し、\theta_\epsilonは螺旋軸に沿った平行移動量を表す。
またs_0は螺旋軸の向きの単位ベクトルを表す。
 s_\epsilonだけわかりにくいのだが、回転中心をrとしたとき、s_\epsilon=r\times s_0となる。


さてこれをスキニングにどう使うのか。
まず回転を表すquaternionと平行移動を合成して、dual quaternionを作る。
これをボーンウェイトに従って線形補間する。
このdual quaternionを使って頂点を変換すればよい。
この変換について、論文中に高速化の方法が書かれているため、実装する際には参照するとよい。