凹みTips

C++、JavaScript、Unity、ガジェット等の Tips について雑多に書いています。

PMD を Mecanim 出来る PMD2FBX & MMD4Mecanim を試してみた

追記(2013/09/29)

最新の MMD4Mechanim は、PMX の対応や Unity 上のみでの変換が可能など、より高機能かつ簡単になっています。詳細は本家サイト様のチュートリアルをご覧ください。

はじめに

PMD2FBX & MMD4Mecanim は Nora さん(@Stereoarts)によって作成された、MMD のモデルを Unity 上で Mecanim を利用して動かすためのツール/ライブラリです。
MMD for Unity では MMD モデル(PMD)の読み込みと、MMD モーション(VMD)の読み込みが可能でしたが、Unity 4.0 から新機能として追加された便利なアニメーション機能の Mecanim を利用することができませんでした。一方こちらは VMD によるモーションの代わりに強力な Mecanim を使用することができます。どちらも素晴らしいツールとなっていますので用途に応じて使い分けるのが良いと思います。
前回までは MFU で PMD + VMD で作業をしてきたので、今回、PMD2FBX & MMD4Mecanim を使って Mecanim で MMD のキャラクタを動かすことにチャレンジしてみました。最新版とマニュアルで一部名称が異なる部分もあったのでスクリーンショットを交えて手順や作業内容を備忘録としてまとめておきます(基本的にはマニュアルと変わりません)。

デモ

出来るようになることデモです:

ダウンロード

私がダウンロードした時点では、20130716 版が最新でした。

ツール概要

  • PMD2FBX
    • MMD 専用のキャラクターデータである PMD(Polygon Model File)を汎用の 3D データである FBX へと Mecanim に適合する形で変換する EXE
  • MMD4Mecanim

同梱されているチュートリアル.pdf の図によると、以下の様な流れのようです。

モデルの取り込み

物理演算用のスクリプトは現在は Lat式ミクさん用にチューニングされたもののようなので、まずは Lat式ミクさんの取り込みを試してみます。

以下の手順で変換を行います。

1. pmd2fbx.exe をコマンドラインから実行
$ pmd2fbx.exe Lat式ミクVer2.3_Normal.pmd

グワーッと変換の様子が表示された後、 「Export external. End of export.」と表示されるので、変換を行ったフォルダを確認すると以下の4つのファイルが出来ています。

  • Lat式ミクVer2.3_Normal.col.fbx
  • Lat式ミクVer2.3_Normal.exp.bytes
  • Lat式ミクVer2.3_Normal.fbx
  • Lat式ミクVer2.3_Normal.pmd.xml

チュートリアルによると変換に失敗する場合は、「pmd2fbx」フォルダ内の「pmd2fbx.xml」を編集すれば良いようです。ファイルをみてみると、次のように MMD の各パーツの日本語名を英語名に変換する設定が記述されています。

<?xml version="1.0" encoding="UTF-8"?>
<PMD2FBXConfig>
    <ReplaceNameList>
        <ReplaceName> <From>飾り</From> <To>Accessories</To> </ReplaceName>
        <ReplaceName> <From>眼鏡</From> <To>Glasses</To> </ReplaceName>
        <ReplaceName> <From>メガネ</From> <To>Glasses</To> </ReplaceName>
        <ReplaceName> <From></From> <To>Hair</To> </ReplaceName>
        <ReplaceName> <From>スカート</From> <To>Skirt</To> </ReplaceName>
        ...(略)
    </ReplaceNameList>
</PMD2FBXConfig>

その他の設定に関しては「pmd2fbx」フォルダ内のサンプル設定をご覧ください。モデル毎に応じた変換も可能なようです。
Tda式ミクさんも試してみましたがエラーなく変換可能でした。

2. Unity へ取り込む
  1. 「MMD4Mecanim」フォルダを Unity の Project ビューへドラッグ&ドロップ
  2. Project ビューで「LatMiku」フォルダを作成し、先ほど生成した以下の3つのファイルを放り込む
    • Lat式ミクVer2.3_Normal.col.fbx
    • Lat式ミクVer2.3_Normal.fbx
    • Lat式ミクVer2.3_Normal.pmd.xml
  3. 同階層に「Textures」フォルダを作成し、bmp および sph、spa ファイルを放り込む
    • スフィア用 sph / spa はファイル名の末尾に bmp を付加してから追加

これで以下のような状態になります。

Lat式ミクさん、テクスチャ貼らないと凄い顔してる。。

3. Mecanim を設定する
  1. Lat式ミクVer2.3_Normal を選択
  2. Rig > Animation Type を Humanoid へ変更
  3. Configure ボタンを押下
  4. Done ボタンを押下

特に破綻もなく綺麗に変換されました。

4. マテリアル設定
  1. Plugin > MMD4Mecanim > Loader を選択
  2. FBX を FBX File にドラッグ & ドロップ
  3. Convert

これでテクスチャが当たります!

Muscles の各パラメータを弄ってみると綺麗に動いてくれることが分かります。

これで他のモデルと同じように Asset Store から落として来た Mecanim を利用したアニメーションが可能となります。

5. 髪の毛とスカートの物理挙動の追加
  1. Plugin > MMD4Mecanim > Postfix を選択
  2. 上段の Fbx (GameObject) には Hierarchy ビューの GameObject を、下段の Fbx には Project ビューの Prefab をドラッグ&ドロップ
  3. Convert
  4. ダウンロードしたフォルダ内の LatMiku フォルダから以下の3つのスクリプトを Project ビューへ追加
    • LatMiku.cs
    • LatMikuFixHair.cs
    • LatMikuFixSkirt.cs
  5. Root > joint_Char > joint_Center > joint_HipMaster 内にある 4 つの Skirt の GameObject に LatMikuFixSkirt.cs をアタッチ
    • これをしないとスカートが大変なことになります。Script 内では FixedUpdate と LastUpdate で重力の付加や角度制限を行なっているようです。
  6. Root > joint_Char > joint_Center > joint_Torso > joint_Neck > joint_Head > joint_HeadT 内にある RightHair と LeftHair に LatMikuFixHair.cs をアタッチ
    • こちらも同じ補正をしているようです。
  7. Lat式ミクVer2.3_Normal に LatMiku.cs をアタッチ
    • ここでは Awake のタイミングでルート、上半身、スカート、髪の毛のレイヤとレイヤ同士のコリジョン判定の有無を設定しているようです。

流れを画像でまとめると以下になります:




Mecanim の利用

それでは Mecanim を利用してみます。

  1. Asset Store からダウンロード出来る「Mecanim Example Scenes」から以下の項目を Import
    • Animations
    • Characters
    • Controllers
    • Locomotion
    • Scripts
  2. 「Lat式ミクVer2.3_Normal」に Character Controller と Rigidbody コンポーネントを追加
  3. Character Controller の Center を (0, 1, 0) に設定
    • これで地面に足がつくようになります。
  4. Import した Controllers フォルダから「Layer」を「Lat式ミクVer2.3_Normal」の Animator にアタッチ
    • Layer は走る&ジャンプするだけのコントローラです
  5. Import した Scripts フォルダから「IdeleRunJump」を「Lat式ミクVer2.3_Normal」にアタッチ
    • キーの状態をアニメーションと紐付けるだけのシンプルなスクリプトです

これで走るようになります。

素晴らしい!!!

(追記:2013/07/24)表情について

質問がありましたので、表情について調べてみました。

Nora さんがおっしゃっているように、MMD4Mecanim は表情にも対応されています。

  1. 「Lat式ミクVer2.3_Normal」に「MMD4MecanimExpression.cs」をアタッチ
  2. 「Skkined Mesh Renderer」に「U_Char」を指定
  3. 「Expression File」に「Lat式ミクVer2.3_Normal.exp」を指定
  4. 「Index File」に「Lat式ミクVer2.3_Normal.idx」を指定

これで実行すると、図のように「Expressions」項目に設定項目が表示されます。Type を選択して Weight を 0 〜 1 の間で指定してあげると対象の表情になります。実行時にこの表情を弄ってあげるスクリプトを書けば動的に表情を変化させることが可能だと思います。

おわりに

将来的に PMX 対応する予定もあるとのことなので今後の更新に期待です。
モーションを MMD で作ってそれを Mecanim で利用する形に出来たら良いな