mikoto

mikotoのmkmファイルにはそれぞれのボーンの親ボーンのクオータニオンからの回転差分のinverseが記録されている。モデルローカル座標系での子ボーンの回転を表すクォータニオンをQ(i)その親のクォータニオンをQ(i-1)とすると、親子間の回転差分を表すクォータニオンは Q(i-1)^-1 * Q(i) で表されるが、mkmにはQ(i) * Q(i-1)^-1 が記録されている。ここでのクォータニオンの値は便宜上すべて(0,0,1)を向いていてrollは(0,1,0)向きを0度とした仮想骨からの回転とする。人間モデルの各関節のクォータニオンを全て(0,0,0,1)にしてやると前方向に手足を伸ばして思い切り前屈したような格好になる。本当ならモデルの初期状態を基準にした値がはいっていれば描画時の計算は楽なのだが、ボーンのアニメーションデータがメッシュの構造に依存しないという点でこちらの方が都合がよい。

mkmのデータを実際に使うにはまず、この上記クォータニオンの算出方法でmqoで形成されているボーンの初期位置に各ボーンをもっていったときのクォータニオンQ(初期値,bone:i)をすべてはじきだしておく必要がある。さて、描画時には当然前屈姿勢からではなく、mqoに作られている初期状態の大の字から現フレームのポーズへの差分回転を表すクォータニオンが必要となる。これは各関節で「初期状態から現在の姿勢への回転」から「その親の骨の初期状態から現在の姿勢への回転」を引いたものである。式にすると、
( Q(初期値,bone:i)^-1 * Q(現フレーム,bone:i) ) * ( Q(現フレーム,bone:i-1)^-1 * Q(初期値,bone:i-1) )
mkmに記録されているのが Q(bone:i) * Q(bone:i-1)^-1 であることを使ってこの式をまとめてみれば、これはmkmのクォータニオンをキー間で補間してでたクォータニオンの両端から自分の初期値クォータニオンのinverseと自分の親ボーンの初期値クォータニオンをかけてやればよいがわかる。
Q(初期値,bone:i)^-1 * Q(mkm:bone:i) * Q(初期値,bone:i-1)