MRが楽しい

MRやVRについて学習したことを書き残す

UnityにMMDのダンスモーションを取り込んでモーションとして利用する(その4)

前回記事の続きとなります。
bluebirdofoz.hatenablog.com

Unityに取り込んだダンスモーションをユニティちゃんのモーションとして利用してみます。
f:id:bluebirdofoz:20170709042811j:plain
ちゃんと流用できています。ただ、微妙に動きがおかしいところがあります。

まずMMD for Unityの説明にあった「UnityとMikuMikuDanceでは線形補間の方法が異なる」のが原因と考えました。
MMD for Unityの使い方
 https://mmd-for-unity-proj.github.io/mmd-for-unity/howto.html
もしそうならば、線形補完をBlender上でやればよい訳です。

幸い、Blenderではモーションはおかしくなっていないので、この問題はBlender上でキーフレームを増やすことで解決できます。
ファイルサイズも増えますが、モデル自体に比べれば小さいです。

しかし自動で行う方法が分からなかったのでUWSCを使って全てのキーフレームを半自動の手動設定を行いました。
f:id:bluebirdofoz:20170709042844j:plain
以下、UWSCの実行プログラムです。キーボード操作とマウス操作で等間隔にキーフレームを打ちこみます。

MMV(1120,500,100)
CNT = 1
WHILE CNT < 324
 KBD(VK_RIGHT,CLICK,100)
 KBD(VK_RIGHT,CLICK,100)
 KBD(VK_RIGHT,CLICK,100)
 KBD(VK_RIGHT,CLICK,100)
 KBD(VK_RIGHT,CLICK,100)
 KBD(VK_RIGHT,CLICK,100)
 KBD(VK_RIGHT,CLICK,100)
 KBD(VK_RIGHT,CLICK,100)
 KBD(VK_RIGHT,CLICK,100)
 KBD(VK_RIGHT,CLICK,100)
 SLEEP(0.1)
 KBD(VK_I,CLICK,100)
 SLEEP(0.1)
 BTN(LEFT,CLICK,1120,500,100)
 CNT = CNT + 1
WEND

もはや力技です。私自身の疲労の色が伺え始めます。


しかし更に問題が。モーションをよくみると、下半身の部分が動いていませんでした。
これはダンスモーションのキーフレームが「下半身」ボーンに割り当てられているのに、Unityのhuman mecanimの下半身認識は「腰」ボーンで行われているためです。
Unityのhuman mecanimの下半身認識を「下半身」ボーンに切り替えます。すると以下のエラーが発生しました。
f:id:bluebirdofoz:20170709042916j:plain
human mecanimでは上半身ボーンの親ボーンは下半身ボーンでないとダメのようです。

確認してみると、mmd_toolsでBlenderに読み込んだモデルは確かに「上半身」ボーンの親が「腰」ボーンになっていました。
どんな影響が出るか、現状ではわかりませんが、「上半身」ボーンの親を「下半身」ボーンに変更します。
f:id:bluebirdofoz:20170709042935j:plain

変更を完了し、改めてFBX形式で出力します。
今度は「下半身」ボーンをちゃんと設定して反映すると……。
f:id:bluebirdofoz:20170709043002j:plain

やはりというか、ダンス時の上半身の動きがおかしくなりました……。
特にターンなどの腰を捻る動きの歪みが酷いことから、ボーンを変更した影響と見られます。
結局のところ、MMDのボーン構造とhuman mecanimのボーン構造に違いがあったと言う事なので、この違いをモーションとして上手くマージする手段が必要です。
f:id:bluebirdofoz:20170709124523j:plain
Rigifyのボーン構造とMMDモデルのボーン構造を比較したところ。下半身部分のボーンが逆方向なのが分かります。
当然ながらMMDのダンスモーションはこの下半身ボーンが下方向である前提でボーンの位置回転キーフレームが設定されている訳です。
流石にこれは一朝一夕の知識と作業では修正対応できません。

今回のところは、BlenderからUnityへのモーション持ち込みについて一通り学ぶことができたのでよしとします。
MMDのダンスモーションをUnityに取り込むのは一旦保留ですね。