『mmdpaimaya』 MMDとmayaの間でモデルを変換するpythonスクリプト

# はじめに
"mmdpaimaya"は、MMDのモデルをmayaの中に読み込んだり、maya作成されたモデルをMMDモデルファイル(.pmx)に変換することができるpythonスクリプトです。

このスクリプトはgithubで配布しています >> **https://github.com/phyblas/mmdpaimaya**
ダウンロードリンク >> **https://github.com/phyblas/mmdpaimaya/archive/master.zip**

![mmdpaimayaの説明](https://phyblas.hinaboshi.com/rup/yami/2018/a04.jpg)

## 機能
- .pmdや.pmxや.xファイルの3Dモデルをmayaシーン内に読み込み
- mayaの中でキャラクターのモデルのHuman IKの準備
- mayaで作られたモデルをmmd用の.pmxファイルに書き出し


# 使い方

## pykakasiのインストール

mmdpaimayaを使うためには、まずpykakasiというモジュールが必要です。簡単にpipでインストールできます。
maya2022以降のpython3はすでにpipがあるので便利です。

詳しくは https://help.autodesk.com/view/MAYAUL/2022/JPN/?guid=GUID-72A245EC-CDB4-46AB-BEE0-4BBBF9791627

例えばwindowsのcommand promptでは

```
cd "C:\Program Files\Autodesk\Maya2022\bin\"
mayapy -m pip install pykakasi
```

macのterminalでは

```
cd /Applications/Autodesk/maya2022/Maya.app/Contents/bin
./mayapy -m pip install pykakasi
```

## mmdpaimayaをmayaスクリプトフォルダに置く

mmdpaimayaというフォルダをmayaスクリプトフォルダに置きます。そのmayaスクリプトフォルダは、OSや言語によって異なります。例えば

- **windows日本語版**: My Documents\maya\\*バージョン*\ja_JP\scripts
- **windows英語版**: My Documents\maya\\*バージョン*\scripts
- **mac日本語版**: ~/Library/Preferences/Autodesk/maya/*バージョン*/ja_JP/scripts
- **mac英語版**: ~/Library/Preferences/Autodesk/maya/*バージョン*/scripts

そこに置いた後もう一度Mayaを起動したら、これでMayaからモジュールとして使うことができるようになります。

![maya scripts](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202903/7080f987-6584-896a-402c-8e6dccc2bc94.png)


## mayaの中で使う時
スクリプトエディタで以下の通り入力して、実行します。

```python
import mmdpaimaya
mmdpaimaya.yamikuma()
```
![script editor](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202903/80877a60-c898-e054-cb2c-bcf4a83c3708.png)

このスクリプトをシェルフに保存した方が使いやすくなるはずです。

余談ですが、「yamikuma」という関数の名前の由来は「miku」と「maya」で、特に意味ありません。

問題がなければこのようなウィンドウが出てきます。

![mmdpaimaya](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202903/07713e19-2064-c6ac-7d92-788955139fbb.png)



# MMD > Maya
まずはインポート機能です。好きなMMDモデルファイルを選択してmayaのシーン内に読み込むための部分です。

![mmd > maya](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202903/2121ce2d-90e8-351f-9096-5ad206816b41.png)

### ファイル
ここにインポートしたいファイルを選びます。外からファイルをドラッグしてここにドロップするという方法も使用できます。

### 尺度
大きさの倍数です。MMDとmayaで使う単位は違うので適切に尺度を指定することをおすすめします。単位がセンチの場合は8xで、メートルの場合は0.08xがいいです。

### 材質ごとにポリゴンを分割する
これを選んだら、違う材質を使った面を違うポリゴンとして分割するのです。
ただしポリゴンを分割したらblend shapeも骨も使えなくなります。

### 骨も作る
選択されたらMMD内のポーンはmayaのジョイントに変換されます。
ただしIKは無視されます。mayaで使う時、mayaのHuman IKを使うのがおすすめです。

### ブレンドシェープも作る
選択されたら、頂点モーフからmayaの中のブレンドシェープが作られます。
ただし使えるのは頂点モーフだけで、その他のモーフは使えないので無視されます。
モーフの名前は全部ローマ字に変換されます。

![shape_editor](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202903/b659caaa-6e74-4883-a347-79919c269b10.png)

### 材質
arnoldでレンダリングする場合、普段standardSurfaceを使います。blinn、lambert、phongを選択することもできます。

### 作成開始

名前が.pmx, .pmx, .xで終わるファイルが正しく選ばれたら、作成開始ボタンができます。

『終わったらこのウィンドウを閉じる』を選択しておいたら、作成完了の後すぐにこのウィンドウが閉じられます。


## 使用できるモデル
基本的に.pmdと.pmxと.xファイルならほとんど順調にインポートできるはずですが、エラーが出たり、使う時に不具合が発生するモデルもあります。

エラーが発生する場合、スクリプトエディタを調べれば原因をわかってある程度問題を解決できるかもしれません。

## 注意
- MMD以外の使用が禁止されるモデルがあります。ちゃんとそれぞれのモデルの**利用規約**を読んで下さい
- MMDでは綺麗に使えるのに、mayaで使うと台無しっていうモデルもあります
- エラーや不具合を見つけたら、お伝えください。できるなら方法を探して直します
- pykakasiで漢字からロマジに変換するので、ジョイントやモーフや材質の名前の中の漢字の読み間違いで変な名前になる場合が多いので、もし気になったら手動で名前を変えたりする必要があります

## まだmayaに導入できないこと
MMDとmayaの仕組みは結構違うため、MMDでは使えてもmayaへ変換したら使用できない機能が多少あります。

- SDEFのスキンウェイトは使えず、BDEF2扱い
- 頂点モーフ以外のモーフ
- 剛体
- スフィアマップ



# Human IKの管理

キャラクターのモデルをmayaで使う時にHuman IKを使ったらとても便利なので、簡単に適用できる機能も作っておきました。

『Human IKの管理』のウィンドウを開けたら、シーン内でmmdpaimayaでインポートされたモデルが選択肢に現れます。選択して『定義』ボタンを押したら、適当なジョイントに割り当てます。

![HIK管理](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202903/3686ec65-5076-973a-eb07-eff2330f43b2.png)

それと、自動的に腕を広げてHuman IK標準のＴポースにります。
ただしまだ完全にTポースになっていない場合や不具合が起きる場合もあるので、その時まだ手動で調整する必要があるでしょう。
![Ｔポース](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202903/7e8942f7-42b6-38a0-a8ab-62bebe334f72.png)

このスクリプトは名前から割り当てるジョイントを推測するという仕組みなので、予想外に例外的な名前が付けられたボーンの場合は見つからないかもしれません。その時まだ手動で処理する必要があります。

『コントロールリグの作成』をする前に、ジョイントの割り当てが正しく整っているかどうか確認してください。

特に**指**のところは要注意です。指先のボーンが作られていないモデルも多いようです。その場合このまま指のIKを使わない方がいいです。


# Maya > MMD
mayaのシーン内のポリゴンを.pmxファイルにエクスポートする機能です。

![maya > mmd](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202903/a019d550-5781-27d7-1ba1-866b5392bf4d.png)

複雑な方法でできたポリゴンは、エクスポートする時にエラーが出る可能性が多いです。その場合、エクスポートする前に全部のポリゴンを結合したり、作成ヒストリを削除したりしておいたら、解決できるかもしれません。

『材質を使う』を選択したら、maya内の材質はMMDの材質に変換します。
ただし変換できる材質はstandardSurface、blinn、lambert、phongのみです。

『テクスチャをコピーする』を選択したら、ポリゴンのマテリアルに割り当てられたテクスチャのファイルをすべて.pmxファイルと同じ場所にコピーします。

あと、ファイルテクスチャ以外のテクスチャ（チェッカやランプなど）はMMDでは使えないので、無視されます。



# 旧バージョンとの違い

2018年に旧バージョンができましたが、あれはMaya2015 ~ 2018用です。

旧バージョンの説明はこの記事 https://qiita.com/phyblas/items/53161a1d83ec3d81f649

今回のバージョンはmaya2022以降のpython3だけ使用できます。以前のmayaバージョンではpython2.7が使われていたので使えません。

大体の違いは例えば：
- .pmdと.pmxのデータを読み込むために、元々pymeshio（https://github.com/ousttrue/pymeshio ）が使われたが、今blender_mmd_tools（https://github.com/powroupi/blender_mmd_tools ）から書き換えたコードを使用しています。
- もう直接pkg_resourcesとjaconvモジュールをインストールする必要がなく、pykakasiモジュールをpipでインストールすれば完了
- maya pythonのAPIスクリプトをAPI 1.0の代わりにAPI 2.0を使います（APIの違いに関しては https://qiita.com/phyblas/items/4b32118498631c1c0e4c ）
- Human IKの適用のための機能を追加します
- あまり必要ない機能は廃止します

他にももっと詳しく言えば、色んなところで改善したり最適化したりしました。


# 謝辞

この**mmdpaimaya**はYomogiさんのPmxIO（http://mayatech.blog.jp/archives/3009881.html ）と@GRGSIBERIAさんのmmd-transporter（http://www.nicovideo.jp/watch/sm23644737 ）を参考として書いたもので、製作者に感謝の言葉をお送り致します。

その他にも、.pmdと.pmxを読み込むためのblender_mmd_tools（https://github.com/powroupi/blender_mmd_tools ）や日本語をローマ字に変換するためのpykakasi（https://github.com/miurahr/pykakasi ）などのモジュールの製作者も感謝の言葉をお送り致します。


# 終わりに
このスクリプトを使ってみんなさんに役に立てたら嬉しいです。

もし何か問題や改善するための意見があれば、遠慮なくここ（qiita）でもgithubの方でもコメントを書いてください。

これからもまだもっと開発していくつもりです。なので追加して欲しい機能があればリクエストしてもいいのです。できるなら頑張って書いてみます。