Blender用PMXエクスポーター・トラブル対処法
閉じる
閉じる

新しい記事を投稿しました。シェアして読者に伝えましょう

×

Blender用PMXエクスポーター・トラブル対処法

2015-09-17 06:06
  • 76
拙作エクスポーターでPMXをうまくエクスポートできない場合の対処法をまとめました。実は大半が自分の経験談だったりします^^;ナンテコッタイ

最終更新日: 2017/1/18

サンプルデータを公開しました

  1. エラーでエクスポートできない
  2. PMXEやMMDがフリーズする
  3. エクスポートが重い
  4. 頂点が引っ張られたような位置にある
  5. スキニングの結果が違う
  6. スフィアやToonがエクスポートされない
  7. ボーンが崩れる
  8. ボーン名に日本語を使いたくない
  9. ボーンの順番を変えたい
  10. スムーズとフラットの違いがPMXの法線に出力されない

1. エラーでエクスポートできない

(トラブルの内容)
エクスポートを実行すると、エラーが発生し、PMXをエクスポートできない。



(対処法)
バージョン2.74以降のBlenderをお使いください。
マニフェストに重複したセクションヘッダーや、同じセクション内で重複するキーを作成しないようにしてください。

拙作エクスポーターは、バージョン2.74以降のBlenderに対応しています。推奨バージョンは2.77以降です。

最新版のエクスポーターをDLし、Blenderのバージョンやマニフェストの内容にも問題がないのに謎のエラーが発生する、という場合は、もはやスクリプトのバグです。システムコンソールにどのようなエラーが表示されているか、コメントでお教えいただくと大変助かります。

2. PMXEやMMDがフリーズする

(トラブルの内容)
エクスポートしたPMXをPMXEやMMDに読み込むと、プログラムがフリーズしてしまう。


(対処法)
最新版のエクスポーターをお使いください。

最新版では、面を構成しない頂点を書き出さないなど、できるだけ不正なPMXを吐き出さないように修正しています。エクスポーターを更新しても問題があるようでしたら、もはやスクリプトのバグです。お手数ですが、コメントでお教えいただくと大変助かります。

3. エクスポートが重い

(トラブルの内容)
エクスポートに時間がかかりすぎる。

(対処法)
バージョン2.77以降のBlenderをお使いください。
オブジェクトを分割し、シェイプキーを必要なオブジェクトにだけ作成すると、エクスポートの処理が速くなります。ただし、この手法には副作用があるので要注意です。

Blender 2.77ではPythonライブラリが更新されました。拙作エクスポーターが依存するcollections.OrderedDictというライブラリが高速化されています。

拙作エクスポーターの処理で特に時間がかかるのがシェイプキーの処理なので、オブジェクトの分割もエクスポート高速化に有効です。シェイプキーの処理は 「シェイプキーの数×オブジェクトの頂点数」という回数で行われます。オブジェクトをシェイプキーで変形させる部分とそうでない部分とで分割すれば、シェ イプキーのあるオブジェクトの頂点数が減るので、シェイプキーの処理の回数も減るのです。

ただし、オブジェクトの分割には別の問題があり ます。モデル全体の総頂点数が増え、二つのオブジェクトの境界が目立ち、その上、リンクなど Blender上でのモデル運用が面倒になります。そもそも、シェイプキーが作成済みの場合、オブジェクトの分割は手間がかかります。これらの問題を考慮した上で、オブジェクトを分割するかどうか判断してください。

4. 頂点が引っ張られたような位置にある

(トラブルの内容)
エクスポートしたPMXの頂点が引っ張られたような位置にある。



(対処法)
最新版のエクスポーターをお使いください。この問題の原因については、「5. スキニングの結果が違う」をお読みください。

5. スキニングの結果が違う

(トラブルの内容)
エクスポートしたPMXのボーンを動かすと、スキンの変形がBlender上と違う。

(対処法)
Blender上でウェイトの正規化を済ませてください。または、Subsurfを適用するか、SDEFにしてみてください。

BlenderとMMDとでスキニングの結果を近づけるには、Blender上でもPMXの変形方式を意識してスキニングすることが必要です。具体的には、各頂点につき、
  1. 変形グループの数を4個以下に制限する
  2. 変形グループのウェイト値の総計が1.0になるようにする
ことです。これをウェイトの正規化と呼んでいます。特に、BDEF4頂点のウェイト値総計が1.0になっていないと、「4. 頂点が引っ張られたような位置にある」に例示した図のようなことになります。

Blender上で変形グループ数を制限するには、ウェイトツールの「合計を制限」(Limit Total)を実行して、制限値オプションを4にします。ウェイト値総計を1.0にするには、ウェイトツールの「すべてを正規化」(Normalize All)を実行します。いずれも、オペレーターでSubset(使用部分)を「Deform Pose Bones(デフォームポーズボーン)」にします。



実は、最新のエクスポーターは、この正規化を行います。しかし、頂点に変形グループが5個以上ある場合、正規化の過程でグループの取捨とウェイトの振り直しをするので、Blender上のスキニングを大きく変えることになります。どの頂点でこれが行われているかは、エクスポートのオプション「BDEF4を正規化(Normalize BDEF4)」のチェックを外してエクスポートし、MMD上に読み込むと、「4. 頂点が引っ張られたような位置にある」に例示した図のような現象が出るので、これで確認できます。

変形グループ数を制限した後でも、Subsurfモディファイアを追加している場合は、その適用により制限超過が発生することがあります。下図を見てください。


赤色は元からある頂点を示しています。青色はSubsurfの適用により生成される頂点を示しています。隣接する頂点の頂点グループが異なるとき、Subsurfの適用により生成される頂点はそれらを混合したものになります。その結果、グループ数が増えています。Subsurfを適用せずにグループ数が制限を超えないようにするには、隣接する頂点のグループ数を減らすしかありません。

Subsurfについては、スキニングに関して別の問題(よい事ですが)があります。通常、Subsurfは、アーマチュアモディファイアの下に追加します。逆だと増加したメッシュを変形するので処理が重くなります。また、メッシュ変形の後に細分化するので、変形がなめらかになるという効果があります。このため、アーマチュアモディファイアの「体積を維持」(デュアル・クォータニオン・スキニング)を使用しなくても、つぶれにくい変形になります。



PMXエクスポート時にモディファイアを適用すると、MMD上では、細分化されたメッシュをボーンで変形するので、Blender上とは逆の処理になります。このため、Blender上では綺麗に変形していたのに、MMD上ではガッカリな変形になることがあります。

Blender上でSubsurfを適用してしまえば、MMDに近い変形を確認することができます(一時的にモディファイアの順番を変える方法もあります)。あるいは、PMXのSDEFにエクスポートすることでごまかすという方法もあります。



拙作エクスポーターは、頂点に「sdef」という名前の頂点グループが割り当てられていると、SDEFで出力します。そのウェイト値には意味はありません。

6. スフィアやToonがエクスポートされない

(トラブルの内容)
テクスチャがスフィアテクスチャやToonテクスチャとしてエクスポートされない。



(対処法)
マッピングをUV以外にしてください。
64px×64px以下の画像はデフォルトでToonテクスチャとしてエクスポートします。これより大きいサイズの画像をToonテクスチャとして、またはこれより小さいサイズの画像をスフィアテクスチャとしてエクスポートする場合は、マニフェストにサイズを指定してください。

マッピングがUVの場合は、拙作エクスポーターは通常テクスチャまたはサブテクスチャとしてエクスポートします。通常かサブかは、上の方にあるのが通常、その下のほうにあるのがサブ、というようにして区別します。



マッピングをUVにしたテクスチャをPMXにエクスポートしたくない場合は、テクスチャスロットにあるチェックを外してください。

マッピングをUV以外(ノーマル、反射など)にした場合は、拙作エクスポーターはスフィアかToonとしてエクスポートします(バージョン0.29.0より)。両者の区別は画像サイズのみに頼っています。デフォルトでは、64px×64px以下ならToon、それより大きければスフィアです。

64px×64pxより小さいスフィアや、それより大きいToonは、実用性がないと思いますが、もし必要であればマニフェストのtmaxキーでこのサイズを変更することができます。以下は、マニフェストの例です。
[男性モブ]
name: 男性モブ
info: MMD用男性モブモデル
# 256px x 256px 以下ならToon
tmax: 256

なお、マッピングをUV以外にした場合は、テクスチャスロットのチェックを外してもエクスポートされます。

7.ボーンが崩れる

(トラブルの内容)
エクスポートしたPMXのボーンが崩れている。



(対処法)
次のいずれかを試してみてください。
(1)エクスポートオプションの「アーマチュアレイヤーを使用」を無効にする(デフォルトでは無効になっています)。
(2)エクスポートオプションの「ボーン変形階層を自動調整」を無効にする。
(3)エクスポートオプションの「アーマチュアレイヤーを使用」を有効にしたうえで、アーマチュアレイヤーでボーンレイヤーを指定する。

上図のように極端にボーンが変形する場合は、変形階層に問題があります。拙作エクスポーターは、変形階層のエクスポートについて2つのオプションを用意しています(仕様の詳細についてはREADME.txtを御覧ください)。

(1)ボーン変形階層を自動調整
ボーンの順番が原因で変形に問題がありそうな箇所を発見して自動的に調整します。

(2)アーマチュアレイヤーを使用
アーマチュアレイヤーの一部を変形階層の指定とみなします。

(1)が問題となることはほとんどないと思いますので、(2)で問題が起きてないか確認してください。もしRigifyアドオンのMeta-rigをベースとしてボーンを組むと、アーマチュアレイヤーは下図のようになっています。



(2)によりこれを変形階層の指定とみなしてしまうと、当然PMXのボーン変形はめちゃくちゃになってしまいます。そこで拙作エクスポーターの最新版では、デフォルトではアーマチュアレイヤーを参照しなくなりました。アーマチュアレイヤーを変形階層の指定に使用するなら、問題がないようにレイヤー配置を見なおしてください。

PMXボーンの変形階層については、下の動画の解説が大変参考になります。


8.ボーン名に日本語を使いたくない

(トラブルの内容)
Blender上でボーン名に日本語を使いたくないが、PMXは日本語のボーン名が標準になっているので、変換作業が面倒だ。

(対処法)
マニフェスト(設定ファイル)にボーン名を変換する辞書を用意してください。エクスポート時に自動的にボーン名が変換されます。

拙作エクスポーターは、エクスポート時にボーン名などの名称を変換する機能を用意しています。この機能を使うためには、変換用の辞書をマニフェストに設定しなければなりません。マニフェストの書き方については、ブロマガ記事「Blender用PMXエクスポーター・マニフェストに名称変換用辞書を書く方法」をご覧ください。

なお、エクスポートの結果がボーンの名称によって変化するような項目(IKリンクの角度制限の上限など)では、デフォルトでRigifyアドオンの 「Human(Meta-Rig)」や標準ミクの英語名に準拠した名称にも対応するようにしています。さらに独自の名称に対応させることも、マニフェスト の設定で可能です。詳しくは、README.txtをご覧ください。

9.ボーンの順番を変えたい

(トラブルの内容)
PMXのボーンの並び順を変えたい。

(対処法)
Blender上でボーンの作成順序を変えてください。
多段ボーンの場合は、複製元のボーンの名前と複製先のボーンの名前を入れ替えることで、ボーンの並び順を逆にすることができます(ウェイト割り当て済みの場合は、頂点グループ名の入れ替えも必要)。
またはマニフェスト(設定ファイル)にボーンの順番を指定してください。

拙作エクスポーターは、Blenderのボーン編集モード上でのボーンの並び順を取得してエクスポートします。ボーンの並び順は、アウトライナーウィンドウで確認できます。ボーンの並び順は、ボーン編集モードとポーズモードとでは異なることがあります。そして、ボーン編集モード上でのボーンの並び順は、独立ボーン間や兄弟ボーン間では作成順が反映されるようです。

例えば、「足D.L> ひざD.L > 足首D.L」というボーンの接続があって、これらを複製して「足.L > ひざ.L > 足首.L」というボーンを追加した場合、ボーン編集モード上の並び順は、「足D.L> ひざD.L > 足首D.L」のあとに「足.L > ひざ.L > 足首.L」が並びます。

並び順を逆にしたいのであれば、先に「足.L > ひざ.L > 足首.L」を作成し、これを複製して「足D.L> ひざD.L > 足首D.L」を作ってください。すでに「足D.L> ひざD.L > 足首D.L」を作成しているのであれば、複製後にボーンの名前を入れ替えてくだい(ウェイト割り当て済みなら、頂点グループ名の入れ替えも必要です)。

拙作エクスポーターのマニフェストにboneキーを追加して、ボーンの並び順を最初から指定することもできます。
[男性モブ]
name: 男性モブ
info: MMD用男性モブモデル
bone: 全ての親
センター
下半身
足.L
ひざ.L
足首.L
足D.L
ひざD.L
足首D.L
ボーンの名前は、Blender上での名前となります。ボーンの並び順の指定は、必要なところまでの途中で終わっていても構いません。

実はboneキーがなくても、拙作エクスポーターは、デフォルトで「全ての親」「master」があれば先頭、次順位に「センター」「center」がくるようにボーン順を調整します。これらのボーンがあっても他のボーンをルートにしたいときは、Blender上の順番ではなく、boneキーによる並び順で指定する必要があります。

10. スムーズとフラットの違いがPMXの法線に出力されない

(トラブルの内容)
シェーディングをスムーズとフラットとに切り替えてPMXにエクスポートしたが、PMXの法線に変化がない。





(対処法)
Blender上で「自動スムーズ」を有効にしてください。ただし、フラット面やシャープを付けた辺で頂点数が数倍に膨れ上がるので注意してください。

Ver.0.11.0以降の拙作エクスポーターは、3Dビュー上で確認できる法線を忠実にエクスポートする、という方針になりました。

Blenderのシェーディングをスムーズとフラットとで切り替えても、それだけでは3Dビュー上の頂点の法線に変化はありません。


両方ともスムーズと同じ頂点法線です。なのでエクスポートしたPMXの頂点法線もどちらともスムーズ面となる法線になります。

シェーディングの違いを法線として確認できるようにするには、データ・プロパティのノーマル・パネルにある「自動スムーズ」(Auto Smooth)をオンにします。これで面ごとの頂点の法線(分割法線)を確認できるようになり、フラット面やシャープを付けた辺においてはひとつの頂点に複数の法線が表示されます。



この状態をエクスポートしたPMXが下図です。


全面をフラット面にした手前(画面下)のCubeの法線がBlender上の分割法線と同じものになっています。影の付き方も辺でくっきりした形になります。ただし、Blenderの分割法線とは大きな違いもあります。

Blenderの分割法線はひとつの頂点で実現していますが、このような機能はPMXにはないので、拙作エクスポーターは辺を分割することで同じ法線を再現しています。その結果、頂点が大幅に増加します

上図では、全面をスムーズ面にした奥(画面上)のCubeは頂点数が8ですが、手前のCubuの頂点数は24です。実に3倍となります。

つまりこれは、Blender上で辺分離モディファイアを適用したのと同じです。ただし、分割法線の効果は常に全モディファイアの効果の後に適用されるので、辺分離モディファイアとは結果が違う場合もあります。下図を見てください。



この円筒状のオブジェクトはシェーディングをスムーズにしていますが、縁の部分だけシャープを付けています。自動スムーズが有効なら、縁の部分が分割法線の効果によりくっきりとした見た目になります。ところが、これにSubsurfを追加すると、先に細分化される結果、縁の形状が崩れてしまいます。ここは分割法線に頼らず、辺分離モディファイアをSubsurfの前に追加することで、縁の形状を維持したままメッシュを細分化することができます。

PMXにエクスポートした結果も同様になります。


(左が辺分離モディファイアありでエクスポート、右が辺分離モディファイアなしでエクスポート)

(注記)円筒に厚みを付けず、「Subsurf>厚み付け」という順番でモディファイアを追加する方法なら、縁の変形を抑えることができます。

分割法線の概要については、下のビデオの8:08以降でトーマス・ベックさんによる解説を視聴することができます。英語ですが・・・



なお、自動スムーズが有効である場合、カスタム法線を使うことができます。カスタム法線によって面ごとの頂点法線はひとつにまとめられるので、フラット面や辺シャープの設定に関係なく、エクスポートしたPMXの辺は分割されません。




(2017/1/18追記)カスタム法線について、以下の記事を追加しました。

[Blender]オブジェクト境目の法線を編集してPMXにエクスポート


広告
他66件のコメントを表示
×
おそらくアーマチュアオブジェクトを2倍に拡大しているのではないでしょうか。
エクスポーターがアーマチュアオブジェクトのトランスフォームを適切に処理していなかった不具合が問題の原因だと思います。修正バージョン1.5.3を公開しましたのでお試しください。
本体
https://ux.getuploader.com/suwatoh_mmd1/download/150
README.pdf
https://ux.getuploader.com/suwatoh_mmd1/download/151
ご報告ありがとうございました。
14ヶ月前
×
すわとう様こんばんは、お早いお返事ありがとうございます。
原因を確認したところ、おっしゃる通りにアーマチュアオブジェクトが拡大2倍になってました。
Ver1.5.3で試したところボーンモーフも正常に出力されました、ほんとうにありがとうございます!
ミラーリングや細分化などのモデファイア―を固定しなくても使えるエクスポーター便利すぎてすごいので、細かくバージョンアップされてってとてもうれしいです。作ってくださってありがとうございます。
14ヶ月前
×
はじめまして。同様のエラーに関する情報を発見できなかったので、此処で報告させていただきます。

Traceback (most recent call last):
File "C:\Users\9DHY\AppData\Roaming\Blender Foundation\Blender\2.79\scripts\addons\exp_pmx\manifest.py", line 174, in _pairs_vec
yield next(it), (float(next(it)), float(next(it)), float(next(it)))
StopIteration

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
File "C:\Users\9DHY\AppData\Roaming\Blender Foundation\Blender\2.79\scripts\addons\exp_pmx\__init__.py", line 486, in execute
export_pmx.save(context, **keywords)
File "C:\Users\9DHY\AppData\Roaming\Blender Foundation\Blender\2.79\scripts\addons\exp_pmx\export_pmx.py", line 4183, in save
context.user_preferences.system.author)
File "C:\Users\9DHY\AppData\Roaming\Blender Foundation\Blender\2.79\scripts\addons\exp_pmx\manifest.py", line 46, in __init__
self.__ambi = dict(self._pairs_vec(self.__db.get("ambi", "").split()))
RuntimeError: generator raised StopIteration

location: :-1

blenderのバージョンは2.79、エクスポーターのバージョンは1.5.3です。
8ヶ月前
×
>>85
エラーの内容は、マニュフェストに書かれた「ambi」 キーの読み取りに失敗した、となっています。これはMMDでいうところの環境色を指定するキーですが

ambi: マテリアル名 0.086 0.110 0.157

というように、キー名とコロンのあとに、マテリアル名と数値を三つ指定する必要があります。数値は半角で入力します。

複数の環境色を指定する場合は

ambi: マテリアル1 0.086 0.110 0.157 マテリアル2 0.376 0.000 0.149

のように並べるか、改行して

ambi: マテリアル1 0.086 0.110 0.157
マテリアル2 0.376 0.000 0.149

のように書きます。マニュフェストファイルを確認していただき、もし上記のようになっていてエラーが出る場合には、「ambi」 キーとその前後2,3行がどのように書かれているのかを教えていただけると助かります。
8ヶ月前
×
>>86
迅速な対応をありがとうございます。
マニフェストファイルのテキストを参照しましたが、上記のような羅列は確認されませんでした。
一応エラーの原因になったと思わしきラインの前後は載せておきます。

self.__dict = self.__db.get("dict")
self.__dict_e = self.__db.get("dict_e")
self.__ambi = dict(self._pairs_vec(self.__db.get("ambi", "").split()))
self.__afac = self._getfloat(self.__db.get("afac"))
self.__tmax = self._getint(self.__db.get("tmax"))
self.__bone = self.__db.get("bone")

ちなみにblenderで開いているファイルや状況には関係無く、先述のエラーは発生するようです。
(サンプルデータの方でも試してみましたが、やはり同様のエラーでエクスポートに失敗しました)
8ヶ月前
×
>>87
マニフェストファイル「manifest.txt」なしの状態でエクスポートは可能でしょうか?
「manifest.txt」はblendファイルの外部で同じフォルダにあるものを参照しますが、それがなくても
blendファイル内部のテキストデータブロックに保存されていると、そちらも参照します。
両方ともない状態でエクスポートできるなら、「manifest.txt」に原因をしぼれます。
8ヶ月前
×
>>88
マニフェストファイルは拡張子がpyのみで、txtのものは確認自体ができませんでした。
とりあえずmanifestとついたファイルを一通り削除したところ、今度は以下のエラーが出るようになりました。

Traceback (most recent call last):
File "C:\Users\9DHY\AppData\Roaming\Blender Foundation\Blender\2.79\scripts\addons\exp_pmx\__init__.py", line 470, in execute
from . import manifest
ImportError: cannot import name 'manifest' from 'exp_pmx' (C:\Users\9DHY\AppData\Roaming\Blender Foundation\Blender\2.79\scripts\addons\exp_pmx\__init__.py)

location: :-1

・・・この後blender自体を再インストールしてみた(バージョンは同じ)ところ、今度は無事にエクスポートできるようになりました。
先述のエラーの原因は不明(おそらく他のアドオンとの衝突?)でしたが、一先ずは解決したようです。失礼致しました。
8ヶ月前
×
バージョン2.79でこのプラグインを使ってDAEからpmxに変換しましたが、一部の頂点と面が共に欠け落ちている状態で変換されているようです。エクスポートした際、エラーは発生せず。また、一部のDAEでも同様の件が発生するようです。該当モデルは、https://3dwarehouse.sketchup.com/model/ed6bf649ad5b3d82b1bb46d2556ba67d/Mercedes-Benz-300TDです。
7ヶ月前
×
エクスポーターを導入してみました。ただ、mmd_toolが入ってるせいか。
エクスポートの項目に、このエクスポートの項目がでません。
mmd_tool外した方がよいでしょうか?
2ヶ月前
×
すわとう様のエクスポータのおかげで自作のモデルを作る事が出来ました。ありがとうございます!ところでボーンの順番や翻訳などをmanifest.txtに書いていくとファイルが見にくくなってしまうのですが、ボーン順だけ書いたtxt、翻訳だけ書いたtxt…みたいなのをmanifest.txtから参照するようなことは可能でしょうか?
7時間前
コメントを書く
コメントをするには、
ログインして下さい。