vmdの回転読み込みが分かった

slerpで短い方の弧で補完させるためには2つのクォータニオン内積が非負になるようにしてやる必要があった。


今フレームと1つ前のフレームの回転クォータニオン内積をチェックして負だったときにフラグを立てて以降のフレームのクォータニオンを[-w, -x, -y, -z]に反転させてやるとblenderでもうまくいく。次に内積が負だったときに反転フラグを解除する。


ついでに、オイラー角を経由しないで直接クォータニオンを代入する道を探ったのだが、BlenderのMathUtils.Quaternionの挙動が微妙だった。

微妙1.
Quaternion(w, x, y, z)がQuaternion(w, 0, 0, 0)になる。
使い方が違うのか?

微妙2.
q0 # Quaternion(w0, x0, y0, z0)
q1 # Quaternion(w1, x1, y1, z1)
とあるとたぶん
q0 * q1 = q # Quaternion(w0*w1, x0*x1, y0*y1, z0*z1)
のような動き。要素通しの積なんか使い道あるのだろうか?


といわけでvmdインポータがわりと動くようになった。
http://github.com/ousttrue/blender-mmd-importer

参考文献

実例で学ぶゲーム3D数学

実例で学ぶゲーム3D数学

9.4.13 slerp

類書ではこの本が一番実用的だと思う。