mmd-for-unity-proj / mmd-for-unity

MikuMikuDance for Unity
BSD 3-Clause "New" or "Revised" License
415 stars 83 forks source link

IKに依って変形された差分量が付与親の差分量として正しく計算されない事が有る不具合の修正 #9

Closed eral closed 11 years ago

eral commented 11 years ago

概要

頂点変形順に依って、IKに依って変形された差分量が 付与親の差分量として正しく計算されない事が有る不具合を修正しました。

詳細

修正内容

腰キャンセルボーンを持つモデルに於ける足周りの頂点スキニングは下記3つのボーンが連携する事で行われます。

  A. IKボーン         ユーザーが足を操作する為に移動させるボーン   B. IK変形対象ボーン         IKボーンの移動に伴い、インバースキネマティクスアルゴリズムに従って移動するボーン   C. Bを付与親として持つ頂点ウェイト参照ボーン         このボーンが動いて初めて頂点はスキニングされます

Tda式アペンドミクさんは、これらのボーンの変形順番が B→A→C と為っています。 前回迄の差分量初期化と更新・参照タイミングではこれで正常に動作しました。

  1. 全ボーンの差分量を零化(Bの差分量≒零)
  2. Bボーンの更新(Bの差分量≒ΔB)
  3. Aボーンの更新(Bの差分量≒ΔB + AのIK)
  4. Cボーンの更新(付与親の差分量≒Bの差分量≒ΔB + AのIK)

しかしula式巡音ルカさん他のモデルに於いてボーンの変形順番が B→C→A と言う並びが有り、 この場合に、IKの変形が頂点スキニングの変形に伝わっていませんでした。

  1. 全ボーンの差分量を零化(Bの差分量≒零)
  2. Bボーンの更新(Bの差分量≒ΔB)
  3. Cボーンの更新(付与親の差分量≒Bの差分量≒ΔB)) ←AのIKが伝わっていない
  4. Aボーンの更新(Bの差分量≒ΔB + AのIK)

これを改善する為に、IKのみ変形を先行して行う2パスにしました。

  1. 全ボーンの差分量を零化(Bの差分量≒零)
  2. 全ボーンのIKを更新(Bの差分量≒AのIK)
  3. Bボーンの更新(Bの差分量≒AのIK + ΔB)
  4. Cボーンの更新(付与親の差分量≒Bの差分量≒AのIK + ΔB)) ←AのIKが伝わる
  5. Aボーンの更新(Bの差分量≒AのIK + ΔB)

この対応に依り B→A→C でも B→C→A でもIKが正常に伝達される様に為りました。

問題点

この対応に於ける最大の問題点はPMX仕様書に記述されている変形仕様と異なる事です。

●ボーン変形 □変形順序 ボーンの変形順序は (中略) 順に変形を行う。 1つのボーンにおけるローカル変形処理はIKからのリンク参照を除いて1回のみ。 (PMX仕様 ver2.1依り)

引用の様にボーンの変形処理は各々1回で完結するので、本来ならば1パスの筈です。 ですので2パスの今方式は、PMXの変形としては明らかに間違っています。

では今回の変換方式の影響は何処かと言うと、よく分かっていません。 想像するに“IK変形の適応が1フレーム早く為る。”様な気がします。、 と言う依り正確には“PMXの仕様ではIK変形の適応が1フレーム遅れるけれど、今方式ではそれがエミュレート出来ていない。”様な気がします。、 様な気がしますと弱気なのはMMDでIK変形の適応が1フレーム遅れている様に見えないからです。

今方式でも正常に動作しないモデルの存在を確認していますのでまだ色々問題を含んだ付与親計算式だと思いますが、 改善されたモデルは居ても悪化したモデルが居ないので取り敢えずPullRequest出しておきます。

テストモデル

作者名 式 モデル名 (バージョン) 結果 備考
ula式巡音ルカ(Ver3.11) 今回の変更に依り正常化
K-Masaki.jp式銀次郎(20130612b) まだIKか付与親がおかしい
あにまさ式初音ミク(MMD Ver.8.03(x64)付属) 以前から正常、変更に依る不具合は見られない
Lat式ミク(Ver2.3) 以前から正常、変更に依る不具合は見られない
Tda式初音ミク・アペンド(Ver1.00) 以前から正常、変更に依る不具合は見られない
GRGSIBERIA commented 11 years ago

Pull request&ご報告ありがとうございます. IKが1フレーム遅れているか否かは,正確な数値を取り出せない以上,見た目として破綻なく動いていればパスということにしましょう.MMDは30フレームで動作しているので,その1フレームの遅れもエミュレートしようとすると,無駄な処理が多くなると考えられます.PMXの仕様そのものも,MMD先行で開発されたわけではない事情があるので,多少の誤差も許容できるのではないかと思われます.

GRGSIBERIA commented 11 years ago

1フレームの遅れのエミュレートについては,もし本当にIKが1フレーム遅れて処理されているのであれば,アニメータもその遅れを前提としてアニメーションを組んでいるということになる,という意味です.その差はごくわずかなので,作った本人と本業のアニメータにしか違いに気付かないだろうと思います.