[WEB App] PMX Checker - PMXファイルのチェック&修復ツール
概要
PMX(MikuMikuDance モデルフォーマット)ファイルのバイナリを直接パースし、ボーン構造やインデックス参照の整合性を網羅的に検証するWebツール。 アップロード不要で、ファイルはローカル環境(ブラウザ内)で処理され、外部サーバーには送信されません。
特定のPMXモデルをThree.jsのMMDAnimationHelperで使用した際、GrantSolverがundefined.quaternionでクラッシュする問題の原因調査から生まれたツールです。
🔗 ツールを開く: PMX Checker
[WEB App] PMX Checker
PROTOCOL.LAIN // PMXファイルのチェック&修復ツール
lain-lab.com開発の経緯
Lain Clock にYYB式初音ミク(748ボーン)を読み込んだ際、以下のエラーが発生しました。
Uncaught TypeError: Cannot read properties of undefined (reading 'quaternion')
at GrantSolver.updateOne (MMDAnimationHelper.js:1185:45)
「PMXファイルが壊れている」という仮説のもとチェックツールを開発しましたが、結果はclean。真の原因はThree.jsのMMDLoaderがランタイムで構築するskeleton.bones配列とPMXのボーンインデックスのズレでした。
詳細は以下の記事で解説しています。
[JavaScript] Lain Clock MMDモデルの GrantSolver クラッシュ修正
PMXボーンインデックスと Three.js ランタイムの不整合によるクラッシュの原因調査と修正
lain-lab.comPMXファイル自体の検証ツールとしては汎用的に使えるため、独立したツールとして公開しています。
使い方
1. PMXファイルを読み込む
画面左の「INPUT」エリアからファイルを読み込む。
- ドラッグ&ドロップ — PMXファイルまたはPMXを含むZIPファイルを破線エリアにドロップ
- クリックで選択 — エリアをクリックしてファイル選択ダイアログから選ぶ
ZIP形式の場合、ZIP内のPMXファイルを自動的に検出・展開します(Shift_JISファイル名にも対応)。
2. 診断結果の確認
読み込みが完了すると、即座にバイナリパースと全項目のチェックが実行されます。
左パネルの FILE INFO セクションにファイル情報が表示されます。
| 項目 | 内容 |
|---|---|
| File | ファイル名 |
| Version | PMXバージョン(2.0 / 2.1) |
| Encoding | 文字エンコーディング(UTF-16LE / UTF-8) |
| Model | モデル名 |
| Vertices | 頂点数 |
| Faces | 面(三角形)数 |
| Textures | テクスチャ数 |
| Materials | マテリアル数 |
| Bones | ボーン数 |
| Morphs | モーフ数 |
| Rigid Bodies | 剛体数 |
| Joints | ジョイント数 |
右パネルの DIAGNOSTICS に検証ログがリアルタイムで出力されます。
- 🟢 緑 — チェックパス
- 🟡 黄 — 警告(動作に影響する可能性)
- 🔴 赤 — エラー(クラッシュの原因になる)
- 🔵 青 — 自動修復可能な項目
3. 修復とダウンロード
付与親(Grant Parent)の不正参照が検出された場合、⚡ REPAIR & DOWNLOAD ボタンが有効になります。
修復処理の内容は以下の通りです。
- 不正な付与親インデックスを
-1(無効)に書き換え - 対応する付与率を
0.0にリセット - 修復後に再検証を実行し、修復の成功を確認
ZIP入力の場合はZIPに再パッケージ、PMX単体の場合はPMXファイルとしてダウンロードされます。
チェック項目一覧
ヘッダー
| チェック | 内容 |
|---|---|
| マジック | PMX シグネチャの検証 |
| バージョン | PMX 2.0 / 2.1 の範囲チェック |
| グローバル設定 | インデックスサイズ・エンコーディングの妥当性 |
ボーン構造(最重要)
| チェック | 内容 |
|---|---|
| 親ボーンインデックス | 範囲外参照・自己参照の検出 |
| 付与親(Grant Parent) | 範囲外参照・自己参照・循環ループの検出(GrantSolverクラッシュの直接原因) |
| 表示先ボーン | 範囲外参照の検出 |
| IKターゲット | 範囲外参照の検出 |
| IKリンク | 範囲外参照の検出 |
頂点
| チェック | 内容 |
|---|---|
| ボーンインデックス | BDEF1/2/4・SDEF・QDEFの参照先が有効範囲内か |
| ウェイトタイプ | 不明なウェイトタイプの検出 |
マテリアル
| チェック | 内容 |
|---|---|
| テクスチャインデックス | 範囲外参照の検出 |
| スフィアテクスチャ | 範囲外参照の検出 |
| 面数合計 | 全マテリアルの面数合計と面インデックス数の整合性 |
面インデックス
| チェック | 内容 |
|---|---|
| 頂点インデックス | 範囲外参照の検出 |
剛体・ジョイント
| チェック | 内容 |
|---|---|
| 剛体のボーン参照 | 範囲外参照の検出 |
| ジョイントの剛体参照 | 範囲外参照の検出 |
修復のしくみ
修復対象は 付与親(Grant Parent)の不正参照 に限定しています。
PMXバイナリのボーンセクション内で、付与フラグ(0x0100 回転付与 / 0x0200 移動付与)が立っているボーンの付与親インデックスを直接バイナリパッチします。
修復前: [付与親インデックス = 9999] [付与率 = 0.85]
修復後: [付与親インデックス = -1 ] [付与率 = 0.0 ]
ファイル全体の構造(オフセット・サイズ)は変更しないため、他のセクションへの影響はありません。
修復後は自動的に再検証が実行され、修復の成功を確認した上でダウンロードが開始されます。
関連ツール
| ツール | 用途 |
|---|---|
| VRM to MMD | VRMモデルをPMX形式に変換 |
| MMD to GLB | PMX + VMDからアニメーション付きGLBを生成 |
| VRM Validator | VRMファイルのバリデーション |
| VRM Optimizer | VRMモデルのWebP + Draco圧縮 |
| VRM Texture Replacer | VRMテクスチャの確認・差し替え |
技術仕様
| 項目 | 内容 |
|---|---|
| PMXパース | 独自実装バイナリリーダー(DataView) |
| 対応バージョン | PMX 2.0 / 2.1 |
| 対応エンコーディング | UTF-16LE / UTF-8 |
| 修復方式 | バイナリパッチ(構造非破壊) |
| ZIP処理 | JSZip(Shift_JISファイル名対応) |
| フレームワーク | Astro |
| データ処理 | 全てブラウザ内、サーバー通信なし |
対応ブラウザ
WebGL対応のモダンブラウザ(Chrome / Edge / Firefox / Safari)。 バイナリパースを伴うため、大規模モデル(ボーン数500以上)の処理にはPC環境での利用を推奨。
利用上の注意
- 修復機能は付与親(Grant Parent)の不正参照のみを対象としています。ボーン親の循環参照やIKの構造的な問題は手動修正(PMXエディタ等)が必要です
- MMDモデルの利用にあたっては、各データの利用規約を遵守してください