PMX 2.1のモデルがthree.jsで読めない原因|バージョンの比較とQDEF・フリップモーフ
PMXEditorで2.1として保存したモデルが、three.jsを使ったビューアで「PMX version 2.0999999046325684 is not supported.」と出て開けない。原因はモデルではなく、読み込む側のバージョンの比べ方です。
このサイトの再生は、2026-10-07からPMX 2.1を読めるようにしています(読み込む前に、mmdparserが読める形へ直してから渡す)。
原因はFloat32の2.1と、倍精度の2.1の比較
PMXのヘッダには、バージョンが4バイトの浮動小数点数(Float32)で書かれています。2.1はFloat32でぴったり表せないので、読むと 2.0999999046325684 になります。mmdparserはこれを、JavaScriptの倍精度の 2.1 と !== で比べているため、2.1のファイルは必ず「対応していないバージョン」として止まります。 2.0はFloat32でも2.0ちょうどなので、2.0のファイルは問題なく読めます。
バージョンを通っても、2.1の書き方で止まる・ずれる
| 2.1で増えたもの | mmdparser | このサイトの直し方 |
|---|---|---|
| QDEF(頂点ウェイトの種別4) | 「unsupport bone type」で例外。モデルが丸ごと読めない | 並びがBDEF4と同じなので、BDEF4として読ませる |
| フリップモーフ(種別9) | 要素を読み飛ばさず、後ろの解析がずれる | 並びがグループモーフと同じなので、比率0のグループとして読ませる(動かしても何も起きない) |
| インパルスモーフ(種別10) | 要素を読み飛ばさず、後ろの解析がずれる | 同じ長さの種別が無く、直せない |
| ソフトボディ(末尾のブロック) | 読まない(ジョイントの後ろで読み終わる) | そのまま |
追加UVモーフ(種別4〜7)も同じく読み飛ばされません。 これは2.0でも書ける機能です。並びがUVモーフ(種別3)と同じなのでUVモーフとして読ませ、再生では当てないようにしました(追加UVは通常のテクスチャの貼り方とは別のものなので)。
確かめ方
手元の実物のPMX 5体はどれも2.0で、2.1の機能も使っていませんでした。そこで実物(人物A、39,540頂点)を次のように書き換えて、2.1の書き方を持つファイルを作りました。
- ヘッダのバージョンを2.1にし、末尾にソフトボディ0件を足す
- BDEF4の頂点1,484個をすべてQDEFにする(並びは同じ)
- UVモーフ「表情1」を追加UVモーフに、グループモーフ「ちっぱい」をフリップモーフにする
| 確かめたこと | 結果 |
|---|---|
| mmdparserにそのまま渡す | バージョンの比較で止まる。ヘッダを2.0のままQDEFだけ入れても「unsupport bone type 4」で止まる |
| 直してから渡し、元のファイルと同じ画角で撮る | 画面の差は0画素 |
| 「表情1」を1にする | 元のファイルでは67画素変わる。書き換えたほうは0画素(追加UVとして当てない) |
| 「ちっぱい」を1にする | 元のファイルでは1,084画素変わる。書き換えたほうは0画素(フリップは当てない) |
- QDEF(デュアルクォータニオンの変形)は、BDEF4の比率として扱っています。ねじれたときの見え方は本家MMDと一致しません。
- PMX・PMD・VMDを調べるは、PMX 2.1のファイルに「three.jsのビューアで開けないことがある」と出します。2.1の機能を使っていなければ、2.0で保存し直すのがいちばん確実です。