wacchoz’s note

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

スキニングの話(2)

Linear Blend Skinningでしばしばおかしな変形を目にすることになる。
一例を図に示す。
(Ladislav Kavan et al.,Geometric Skinning with Approximate Dual Quaternion Blendingより引用)

f:id:wacchoz:20181110223349p:plain:w450

頂点\mathbf{v}j_1j_2から50%ずつ影響されているとする。
ボーンアニメーションにより、j_1は動かず、j_2が180°回転したとする。
このときj_1の影響でC_{j1}\mathbf{v}に変換され、j_2の影響でC_{j2}\mathbf{v}に変換されるため、50%ずつの重みにより平均した結果、 \mathbf{v}'j_2に一致してしまい、完全にメッシュがつぶれてしまう。
"candy-wrapper"と呼ばれる現象である。

これは重みつき平均を計算する際、単純に線形に平均してしまったことに起因する。
j_1は回転せず、j_2は180°回転しているため、本来であれば\mathbf{v}'は90°回転となってほしいところである。
(+90°なのか-90°なのかという曖昧さは残っているが…)

この例を見ていると、回転をQuaternionでの球面線形補間とするという発想が生まれてくる。
この手法は以下の論文に論じられている。
KAVAN, L., AND ZARA, J. 2005. Spherical blend skinning: A real-time deformation of articulated models. In 2005 ACM SIGGRAPH Symposium on Interactive 3D Graphics and Games, ACM Press, 9–16

回転を補間するのであるが、回転の中心点がどこであるかというのが論文中では詳しく書かれている。
上例のように隣接するボーン2つから影響される場合は単純である。回転中心は誰がどう見てもj_2である。

さて C=B(t)\times M^{-1}を回転部Q_kと移動部m_kに分解しよう。

 \displaystyle C_k=
\begin{pmatrix}
Q_k  & \mathbf{m}_k \\\
\mathbf{0}^T & 1 
\end{pmatrix}

とし、さらにQ_kクォータニオンq_kに変換しよう。

C_{j1}C_{j2}の回転部のクォータニオンを適切に補間したものをQとすると、

 \displaystyle \mathbf{v}'=Q(\mathbf{v}-\mathbf{j}_2)+\mathbf{j}_2]

とすればよい。
これがSpherical Blend Skinningの手法である。
クォータニオンの補間に球面線形補間を使うのが自然であるが、補間計算は頂点毎に行う必要があるため、球面線形補間を行うのは処理が重過ぎる。(arccosが1回にsinが2回)
単純に線形補間を行い正規化してもそれほど誤差がないそうである。

さて上例では隣接したボーンから影響される頂点について考えていた。
このため、j_2を回転中心に選ぶというシンプルな計算であった。

実際には3本以上のボーンから影響される頂点もあるし、隣接しないボーン2本から影響される場合もある。
このような場合にはどのように回転中心を選べばよいであろうか?

まず上例の場合では、回転中心r_c(=j_2)

\displaystyle C_{j_1}\mathbf{r}_c=C_{j_2}\mathbf{r}_c

という関係が成り立っていたことに注目する。

一般にn個のボーンに影響されている場合、回転中心r_c

\displaystyle C_a\mathbf{r}_c=C_b\mathbf{r}_c,\ a,b\in \{j_1,\dots,j_n\}

により定義することができる。

これはnが3以上では優決定系であり、一般的には解が存在しないため、最小二乗法により解くことになる。
回転中心が決まれば、以下の式で変換後の頂点が計算できる。

 \displaystyle \mathbf{v}'=Q(\mathbf{v}-\mathbf{r}_c)+\sum_{i=1}^n w_i C_{j_i}\mathbf{r}_c

しかしながらこの手法が3本以上のボーンなどの一般の場合に使われるかどうか微妙である。
何しろ回転中心の計算はボーンの組み合わせ毎に行わなければならず、面倒すぎるのだ。