This project is read-only.
1
Vote

モーションをReplayモードで再生すると,フレームが0に戻る瞬間,表示がデフォルト姿勢にもどる

description

モーションをReplayモードで再生すると,一通りモーションを再生して初期フレームに戻る際に,モデルが一瞬デフォルト姿勢に戻ります.
---改善案---
Replay時にフレームを(0ではなく)1.0e-3に戻します.10e-3というのは,MMDMotion.ApplyToModelMovingMatrixで「フレームがひとつの場合のモーションを当てる」か否かの閾値です.
※変更をShoeponブランチとしてコミットしておきました.

以上の変更で,とりあえず表題の問題は解決しますが,調査段階で気になったことを以下に書いておきます.
【その1:ボーンの線形補完において,フレーム0が正しく処理されない?】
MMF.CG.Skinning.BoneMotion.Lerpにて,補完に使用するフレームを探索する際に,
if (Frames[j].FrameNumber < frame && Frames[j + 1].FrameNumber >= frame)
のようにフレーム番号が小さい方を含まないようにしているため,フレームが0だと補完が実行されないのではないかと思いました.
【その2:フレーム0では「フレームがひとつの場合のモーションを当てる」ことになる】
Replay時でなくても,モーションをフレーム0から再生しようとした場合,最初のフレームが「フレームがひとつの場合のモーション」になってしまうのではないかと思います.

以上,確認よろしくお願いします.

comments

LimeStreem wrote Jan 27, 2014 at 3:50 PM

Shoeponブランチのほう、すぐにマージしておきます。
その1については、n番目のボーンフレームのフレーム番号をF(n)としたとき、t番のフレーム再生時にt∈(F(n),F(n+1)]となるようなnを捜索するプログラムになっているが、これを見つかった時点でbreakしているので、t∈[F(n),F(n+1)]となるようなフレームを探せば0のときでも問題なく動き、かつ最終フレームを指定されても動くような気がします。ということで修正をして見ます。

その2については良くわからなかったので、もう少しソースを検証してから返答をしますね。

LimeStreem wrote Jan 27, 2014 at 4:00 PM

あーなんでt∈(F(n),F(n+1)]にしているか考えたら、この後の補完処理で0で割ってしまわないような配慮をしてたんだった。。。
0のときは、補完せずに一番最初のフレームを探索するように対応してみます。