PmxIO for Maya ver0.50b

投稿者: | 2017/05/11

Maya用スクリプト、PmxIO for Mayaを配布します。
PmxIOはMMD(MikuMikuDance)用モデルデータ、PMXファイルをMayaで読み書きする為のスクリプトです。

スクリーンショット

ダウンロード

PmxIO_for_Maya_v0.50b.zip (100.5 KB)

インストール方法

  1. ダウンロードしたZipを解凍してください。

  2. 解凍した中に入っているpmxioフォルダを任意のフォルダに移動します。
    移動先のフォルダは何処でも良いのですが、Pythonパスを通す必要があります。
    一般的にはMayaのスクリプトフォルダ等がよく使われます。
    ../Documents/maya/2017/ja_JP/scripts

  3. コピー先のフォルダ(pmxioの一つ上のフォルダ)にPythonパスを通します。
    Pythonパスの通し方はネットで調べれば色々とやり方がヒットしますが、ここでWindows7での設定方法を紹介しています。

  4. Pythonパスの設定が終わったら、OKを押して設定画面を全て閉じ、Mayaを起動します。

  5. Mayaのコマンドシェルフに以下のPythonコードを登録します。

import pmxio
pmxio.run()

シェルフボタンをクリックして、無事PmxIOが起動すれば完了です。

仕様

以下は主にver0.11aでの仕様になります。
最新版のver0.50bの仕様については追々追加していきます。

また、動作はMaya2017日本語版にて確認しています。

インポーター

区分 説明
ファイルタイプ PMX / PMD
一部の特殊なデータ(グループモーフ等)を持ったファイルは、
読み込めない事があります。その場合、該当するデータを
PMX Editor等で削除することで読み込めるようになります。
メッシュ 頂点座標、法線、UV1の読み込み(UV2~4は非対応)
ボーン 全て通常ボーンとして読み込み
スキンウェイト BDEF1~4対応
SDEFはBDEF2扱い
QDEFは非対応
マテリアル Blinnとして読み込み
テクスチャ カラーマップのみサポート
「アルファを接続」にチェックを入れた場合、
アルファを持ったテクスチャをマテリアルのtransparencyに接続する
その他 PMX内で使用される名前及びコメントを追加のアトリビュートとして取得

エクスポーター

区分 説明
ファイルタイプ PMXのみ
メッシュ 頂点座標、法線、カレントUVの出力(UV1)
四角形以上のフェースは三角形に分割
頂点フェースを自動的に個々の頂点として分離(MMDが頂点フェースに対応してない為)
現時点では常にWorld座標として出力
ボーン 選択メッシュにバインドされたボーンを自動的に出力
スキンウェイト ウェイト数に応じてBDEF1~4として出力
ウェイト数が5以上だった場合、値の小さい方から切り捨てて正規化
マテリアル BlinnまたはLambertに対応
テクスチャ カラーマップのみサポート
モーフ ベースメッシュ名をプリフィックスに持つ名前のメッシュをモーフとして扱う
例) ベース: Face モーフ: FaceSmile1
ベースとモーフメッシュの頂点数は一致している必要がある
その他 各ノードの追加のアトリビュートに設定された名前及びコメントを出力
Jp Name: 日本語名
En Name: 英語名
Notes: コメント

謝辞

最後に、PmxIOはPythonライブラリPyMeshIOを使用して作成しています。
また、配布するパッケージ内にPyMeshIOのソースコードを同梱しています。
素晴らしいライブラリを作成してくださった作者様にこの場を借りてお礼申し上げます。
MeshIOプロジェクト

PmxIO for Maya ver0.50b」への39件のフィードバック

  1. リッツ

    ツイッターで連絡させていただきましたリッツです。

    こちらのツールについて、更新楽しみにしておりました。
    誠にありがとうございます。
    MMDをmayaと互換性を持たせることで3DCGに興味のある。専門学生や大学生などの3Dアニメーターが直面するモデル不足に対しての解決や、
    ハードルをグッと下げて頂けると、僕自身感じており、とても感謝しております。

    ありがとうございました。

    返信
    1. Yomogi 投稿作成者

      こちらこそ、使って頂いてありがとうございます!
      要望とかも可能な範囲で受け付けますので、何かあったらご連絡ください。

      返信
  2. 専門学校CG科学生です。
    おかげさまで私の作品と他人の作品と比べて学んでいます。
    ありがとうございます。

    返信
    1. Yomogi 投稿作成者

      コメント有り難うございます!
      そう言って貰えると作って良かったと思えます。
      ありがとうございます!

      返信
      1. お久しぶりです。
        現在MMD用のキャラー作ってますがMaya 2018で作業してます。
        マテリアルやリギングなどモデル自体をどう書き出しすればいいんですか

        返信
  3. はらん

    MMDモデルをMayaで開く方法を調べていて、いまいち理解できず困っていたところ知恵袋からこちらのブログに飛んできました!
    Pythonパスというものを設定しないといけなかったんですね(;´・ω・)
    あなた様のおかげでまた一つ賢くなれました(`・ω・´)b
    掲載ありがとうございました。

    返信
    1. Yomogi 投稿作成者

      コメント有り難うございます!
      知恵袋・・・でしょうか。どんな質問だったか気になります。
      何はともあれ、お役に立てて幸いです!

      返信
  4. MMDer

    アップデートありがとうございます!!
    モーフ対応待ち望んでいました。
    とても助かります。

    本当にありがとうございました。

    返信
    1. Yomogi 投稿作成者

      コメント有り難うございます!
      ちゃんと動いていれば良いのですが・・・
      動いてなかったら教えてください!

      返信
  5. 弐等兵

    ああ、2ヵ月遅れでしたがようやく更新に気づくことができました、ありがとうございます!
    あなたの作ったツールのお陰でmayaでモデルを作り、MMDに送り出すことができました、感謝してもしきれません。

    返信
    1. Yomogi 投稿作成者

      コメント有り難うございます!
      こちらも、スクリプトを使って貰えて嬉しいです。
      使っていて、何かバグなどありましたら教えてください。

      返信
  6. 匿名

    import pmxio
    pmxio.run()
    # pymel.internal.factories : MFnDagNode.model is deprecated
    # pymel.core : Updating pymel with pre-loaded plugins: Fur, modelingToolkit, OpenEXRLoader, DirectConnect, AbcImport, mayaHIK, ikSpringSolver, tiffFloatReader, AbcExport, VectorRender, ArubaTessellator, quatNodes, mayaCharacterization, gpuCache, rotateHelper, Substance, MayaMuscle, AutodeskPacketFile, autoLoader, retargeterNodes, fbxmaya, matrixNodes, sceneAssembly, ik2Bsolver
    # 警告: pymel.internal.factories : could not create a PyNode for manipulator type nexManip #
    # エラー: AttributeError: file C:\Users\(アカウント名)\Documents\maya\2014-x64\ja_JP\scripts\pmxio\gui.py line 173: ‘CheckBox’ object has no attribute ‘setChangeCommand’ #

    フォルダの配置や「http://trtools.jp/windows/windows7-pythonpath/」を参照しても、上記のエラーしか出ず、起動出来ません。maya 2014(学生版)、Win8.1といった環境で、このスクリプトは使用できないのですか?

    返信
    1. 匿名

      maya 2015(学生版)、Win8.1で無事開くことができました。maya2014以前には対応してなかったみたいですね…。
      ありがとうございます。

      返信
  7. 匿名

    すいません今日導入しようと思ったんですが全然できなくて困ってます
    わかりやすい動画とかってありますかね

    返信
  8. 匿名

    はじめまして
    MMDモデルのインポートに関して質問があります
    ジョイント方向の設定もしくは変更することは可能でしょうか?
    リグを付けたくてもローカル軸だと難しのです
    ヨモギ様は実際に動かす際にはどのようにやっているのですか?

    返信
  9. 生梅

    エラー報告

    >> とあるモデル.pmx
    インポートを開始しました。
    # 警告: エラーが発生しました。————————————- #
    # 警告: Ver : 0.50b #
    # 警告: Lang: #
    # 警告: Traceback (most recent call last):
    File “gui.py”, line 471, in runBtn_Clicked
    self.runImport()
    File “gui.py”, line 425, in runImport
    importer.run(path, setting, self.putMsg)
    File “importer.py”, line 328, in run
    model = reader.read_from_file(filePath)
    File “reader.py”, line 336, in read_from_file
    pmx=read(io.BytesIO(common.readall(path)))
    File “reader.py”, line 392, in read
    rigidbody_index_size
    File “reader.py”, line 28, in __init__
    “extended uv is not supported”, extended_uv)
    ParseException: (‘extended uv is not supported’, 3)
    #
    # 警告: MeshIOライブラリがこのPMX/PMDファイルに対応していない可能性があります。 #
    # 警告: —————————————————— #
    ————————————————

    おねがいします

    返信
    1. 管理人 投稿作成者

      コメント有り難うございます。
      こちらのエラーですが、PmxIOが使用出来ないデータがPMXファイルに含まれている時に発生します。
      大変申し訳ありませんが、こちらは仕様となります。

      エラーログを見ると、拡張UVが読み込めていないみたいなので、PMX Editor等で拡張UVを削除して再度読み込んでみてください。

      返信
  10. 匿名

    手順5のコードを入力すると

    # エラー: ImportError: file line 11: No module named pmxio.trutils.maya #
    import pmxio
    pmxio.run()
    # エラー: ImportError: file line 1: No module named pmxio #

    とエラーコードが表示されます。解決策を教えていただきたく存じます。

    返信
    1. 管理人 投稿作成者

      うまくスクリプトを読み込めていないみたいです。
      申し訳ありませんが、原因不明です。
      単純に設定がうまくいっていないか、Mayaのバージョンの問題かもしれません。

      返信
  11. 匿名

    このような便利なスクリプトを配布していただき、ありがとうございます。
    こちらの最新版を、以前通りmaya2014でも動作できるようにする方法はあるのでしょうか?

    返信
    1. 管理人 投稿作成者

      2014で読み込めてなかったんですね・・・。
      自分の環境では2014が使えないので、時間が空いたらインストールして確認してみようと思います。

      返信
  12. ピンバック: MayaNote – Hello,World!

  13. 匿名

    はじめまして。
    このようなスクリプトを配布していただきありがとうございます。
    質問なのですがこのスクリプトはMaya2018でも使用できますでしょうか。
    ご返事いただけると幸いです!

    返信
  14. ピンバック: 【Maya】MMDモデル(PMX)をインポートする方法 | CGメソッド

  15. 匿名

    はじめまして。
    このようなスクリプトは通常使用できないようなモデルをMAYAで使用することができ、就職活動用の作品を制作するにあたって大きなモチベーションとなっています。本当にありがとうございます。
    ただ、MAYA2018には完全に対応してないのか、マテリアルが読み込まれません。対処法などありましたら、返信頂けると幸いです。

    返信
  16. MSA

    バグ報告です

    # 警告: エラーが発生しました。————————————- #
    # 警告: Ver : 0.50b #
    # 警告: Lang: #
    # 警告: Traceback (most recent call last):
    File “gui.py”, line 473, in runBtn_Clicked
    self.runExport()
    File “gui.py”, line 456, in runExport
    exporter.run(path, transes, setting, self.putMsg)
    File “__init__.py”, line 31, in run
    model = Model(transes, direc, setting, msgCallback)
    File “mesh.py”, line 349, in __init__
    mesh = Mesh(trans, boneFact, matFact, indexOffset, setting)
    File “mesh.py”, line 191, in __init__
    meshData = MeshData(trans, setting.skinMinWeight)
    File “mesh.py”, line 48, in __init__
    self.joints, self.weights = self._getSkinWeights(mesh, minSkinWeight)
    File “mesh.py”, line 69, in _getSkinWeights
    minSkinWeight, normalize)
    File “skin.py”, line 165, in compressWeights
    s = reduce(redFunc, vertWeights)[1]
    TypeError: reduce() of empty sequence with no initial value
    #
    # 警告: —————————————————— #

    返信
    1. MSA

      .pmxをPmxIO for Maya ver0.50bでインポートした後、エクスポートしようとしたときに発生したものです。

      返信
    2. MSA

      申し訳ありません。自己解決しました。こちらのデータの不備なのでお気になさらず

      返信
  17. MSA

    度々申し訳ありません。
    ボーンとスキンの関係がぐちゃぐちゃ(ズレる?)のですがボーンは何を基準に参照しているのでしょうか?
    (Mayaではボーン1に紐づけられていたスキンオブジェクトが、出力したPmxではボーン2に紐づけられているといった感じです)

    返信
    1. MSA

      ウェイト値は問題なく変換されています。

      返信
    2. 管理人 投稿作成者

      コメントありがとうございます。
      ウェイトですが、メッシュにバインドされたスキンクラスターを参照していたとは思うのですが、何分作ったのが随分前なのと、現在自分がMayaを使っていない(購入してない)ので、状態を確認出来ません…。
      一度スキンウェイトをスクリプト等で外部に書き出して、ヒストリの削除などを行って再バインド、ウェイトのインポート等すれば治るかもしれません。

      返信
  18. いつも大変ありがたく使わせていただいております。
    1点要望があります。
    書き出し時の材質の順番をMaya側から制御できるようになると助かります。
    お手すきの際にご一考いただけたら幸いです。

    返信
    1. 管理人 投稿作成者

      コメント有難うございます。
      PmxIOはあまり更新出来ていませんが、更新する機会があれば参考にしたいと思います。

      返信
  19. 匿名

    このようなエラーがでてしまいエクスポートが使えません。
    解決策がありましたら教えていただけるとありがたいです・・・。

    エラーが発生しました。————————————-
    Ver : 0.50b
    Lang:
    Traceback (most recent call last):
    File “gui.py”, line 473, in runBtn_Clicked
    self.runExport()
    File “gui.py”, line 456, in runExport
    exporter.run(path, transes, setting, self.putMsg)
    File “__init__.py”, line 31, in run
    model = Model(transes, direc, setting, msgCallback)
    File “mesh.py”, line 349, in __init__
    mesh = Mesh(trans, boneFact, matFact, indexOffset, setting)
    File “mesh.py”, line 191, in __init__
    meshData = MeshData(trans, setting.skinMinWeight)
    File “mesh.py”, line 43, in __init__
    res = self._getSeparatedIds(mesh)
    File “mesh.py”, line 150, in _getSeparatedIds
    poIds[i] = ids[0]
    TypeError: ‘NoneType’ object has no attribute ‘__getitem__’

    ——————————————————

    返信
    1. 匿名

      申し訳ありません、こちらで解決いたしました。

      もう一つ疑問点が生じたのですが、エクスポートしたpmxをPmxEditorで読み込むと
      元のテクスチャより、テクスチャの明るさが暗くなった状態で表示されてしまいます。
      解決策等ありますでしょうか・・・?

      返信
  20. 匿名

    初めまして。現在Mayaにてモデリングを行い、ブレンドシェイプにて表情をつけたのですが、pmxエディタに読み込んだ際にモーフで反映がされません。
    ベースのマテリアル名をモーフのプリフィックスとして使用しているのですがやはり反映されませんでした。
    なにか解決策などはありますでしょうか、申し訳ありません。

    返信
  21. 匿名

    対象ジョイントの部分を関連するジョイントツリーにすると以下のエラー文が出て出力出来なくなります。
    インフルエンスのみにすると出力できるのですが必要なボーンが削除されてしまうので
    解決方法等ありましたらよろしくお願いします。

    エラーが発生しました。————————————-
    Ver : 0.50b
    Lang:
    Traceback (most recent call last):
    File “gui.py”, line 473, in runBtn_Clicked
    self.runExport()
    File “gui.py”, line 456, in runExport
    exporter.run(path, transes, setting, self.putMsg)
    File “__init__.py”, line 31, in run
    model = Model(transes, direc, setting, msgCallback)
    File “mesh.py”, line 349, in __init__
    mesh = Mesh(trans, boneFact, matFact, indexOffset, setting)
    File “mesh.py”, line 195, in __init__
    setting.scale, setting.boneTargetMode)
    File “mesh.py”, line 214, in _getDeformers
    bones = boneFact.createFromJoints(meshData.joints, tgtMode)
    File “bone.py”, line 81, in createFromJoints
    joints = self._getJointTree(joints)
    File “bone.py”, line 58, in _getJointTree
    return pm.ls(rootJoints, ap=True, dag=True, type=”joint”)
    File “general.py”, line 1212, in ls
    res = _util.listForNone(cmds.ls(*args, **kwargs))
    File “pmcmds.py”, line 121, in ls_wrapped
    new_args = getMelRepresentation(args)
    File “pmcmds.py”, line 103, in getMelRepresentation
    newargs[index] = getMelRepresentation(value, recursionLimit, maintainDicts)
    File “pmcmds.py”, line 99, in getMelRepresentation
    newargs[index] = value.__melobject__()
    File “utilitytypes.py”, line 569, in newfunc
    return self.f(instance, *args, **kwargs)
    File “nodetypes.py”, line 185, in __melobject__
    return self.name()
    File “nodetypes.py”, line 1436, in name
    name = self._updateName(long)
    File “nodetypes.py”, line 1323, in _updateName
    raise general.MayaNodeError
    MayaNodeError: Maya Node does not exist (or is not unique):: u’None’

    ——————————————————

    返信
    1. 匿名

      MAYAのバージョンを変えたら通りました
      お騒がせいたしました

      返信

コメントを残す

メールアドレスが公開されることはありません。