PMX 2.1のモデルがthree.jsで読めない原因|バージョンの比較とQDEF・フリップモーフ

PMXEditorで2.1として保存したモデルが、three.jsを使ったビューアで「PMX version 2.0999999046325684 is not supported.」と出て開けない。原因はモデルではなく、読み込む側のバージョンの比べ方です。

最終更新: 2026-10-07 · three.js r171 同梱の mmdparser のソースを読み、実物のPMX(2.0)のヘッダと中身を2.1の書き方へ書き換えたファイルで、読み込みの失敗と、直したあとの画面の画素を確かめた

このサイトの再生は、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で保存し直すのがいちばん確実です。