#author("2026-10-05T18:03:12+09:00","","") * PMD格式详解 [#bde3b132] &size(13){''旧世代 PMD 形式の構造と PMX との差分''}; #contents ** PMD とは [#k37f7bca] ''PMD'' は、MMD の''初期から使われていたモデルフォーマット''です。 PMX の登場以降は''下位互換のために残されている''形式であり、 新規制作で使う理由はありません。 |~項目|~内容| |拡張子|.pmd| |マジック|`Pmd`(3 バイト)| |バージョン|1.0(float)| |文字エンコード|''Shift-JIS 固定''| |エンディアン|リトルエンディアン| |インデックス幅|''固定 2 バイト''| |現状|読み込みのみ。新規制作は非推奨| ** 全体構造 [#y17a1720] #code(){{ ┌──────────────────────┐ │ Header(マジック + バージョン)│ ├──────────────────────┤ │ モデル名 / コメント(固定長) │ ├──────────────────────┤ │ Vertex Data │ ├──────────────────────┤ │ Face Data │ ├──────────────────────┤ │ Material Data │ ├──────────────────────┤ │ Bone Data │ ├──────────────────────┤ │ IK Data │ ├──────────────────────┤ │ Morph Data │ ├──────────────────────┤ │ Display Frame Data │ ├──────────────────────┤ │ 英語名(本体・コメント) │ ├──────────────────────┤ │ ボーン英語名 / モーフ英語名 │ └──────────────────────┘ }} ** Header と固定長文字列 [#w961d679] |~フィールド|~型|~内容| |magic|char[3]|`Pmd`| |version|float|1.0| |modelName|char[20]|Shift-JIS| |comment|char[256]|Shift-JIS| > '''注意''':''固定長''の char 配列です。 > Shift-JIS でエンコードし、'\0' で終端します。 > ''20 バイト = 日本語 10 文字''が上限です。 > UTF-8 の現代的な感覚で扱うと、''文字化け''の原因になります。 ** Vertex Data [#ea679f74] |~フィールド|~型|~内容| |vertexCount|uint32|頂点数| |position|float3|座標| |normal|float3|法線| |uv|float2|UV| |boneIndex|uint16 × 2|''2 本固定''| |weight|byte|0〜100 の''整数パーセント''| |edgeFlag|byte|0:エッジなし 1:エッジあり| *** PMX との決定的な違い [#je78486f] |~項目|~PMD|~PMX| |ボーン数|''2 本固定''|1 / 2 / 4 / SDEF / QDEF| |ウェイト表現|''0〜100 の整数''|0.0〜1.0 の浮動小数点| |追加 UV|なし|最大 4| |エッジ|面単位のフラグ|頂点単位の倍率| > '''最大の制約''':PMD は''頂点あたり 2 本のボーンしか持てません''。 > そのため肩や股関節のような''複数ボーンが関与する部位''では、 > 表現に限界があります。これが PMX が作られた最大の理由です。 ** Face Data [#y1c9e103] |~フィールド|~型|~内容| |faceVertexCount|uint32|''インデックスの個数''| |(以下 faceVertexCount 回)|uint16|頂点インデックス| 面数は `faceVertexCount / 3` です(PMX と同じ考え方)。 > '''制約''':インデックスが ''uint16 固定''のため、 > ''頂点数は 65535 が上限''です。 > 高精細モデルを作れない理由がここにあります。 ** Material Data [#x341e674] |~フィールド|~型|~内容| |diffuse|float4|拡散色| |specular|float3|反射色| |shininess|float|反射強度| |ambient|float3|環境色| |toonIndex|byte|共有 toon 番号| |edgeFlag|byte|エッジの有無| |faceVertexCount|uint32|''この材質が使う面索引数''| |textureFileName|char[20]|テクスチャ''ファイル名のみ''| *** PMX との違い [#kae9f142] |~項目|~PMD|~PMX| |材質名|''なし''|あり| |スフィアマップ|''なし''|あり(sph / spa)| |両面描画|''なし''|drawFlag で制御| |エッジ色|''なし''(黒固定)|指定可能| |テクスチャパス|''ファイル名のみ''|相対パス| > '''重要な制約''': > - PMD は''スフィアマップを持てません''。金属表現ができません > - PMD は''材質名を持ちません''。MME で材質を指定できません > - テクスチャは''ファイル名のみ''なので、''モデルと同一フォルダ''に置く必要があります ** Bone Data [#jc677fc6] |~フィールド|~型|~内容| |name|char[20]|ボーン名(Shift-JIS)| |parentIndex|uint16|親ボーン| |tailIndex|uint16|末尾ボーン| |type|byte|0:回転 1:回転+移動 2:IK| |ikParentIndex|uint16|IK 親| |position|float3|座標| *** PMD に''存在しない''ボーン機能 [#obabca8f] - ''付与親'' — 存在しない - ''ローカル軸'' — 存在しない - ''軸固定'' — 存在しない - ''変形階層'' — 存在しない - ''物理後変形'' — 存在しない > '''帰結''':PMD モデルには''捩りボーンや D ボーンを使った自然な腕の変形''ができません。 > また、''変形階層が無い''ため物理の安定性も劣ります。 ** IK Data [#i48166dd] |~フィールド|~型|~内容| |ikCount|uint16|IK の数| |ikBoneIndex|uint16|IK ボーン| |ikTargetBoneIndex|uint16|対象ボーン| |ikChainLength|byte|チェーン長| |ikIteration|uint16|ループ回数| |ikControl|float|単位角| |(link)|—|下記参照| #code(){{ for (i = 0; i < ikChainLength; i++) { ikLinkBoneIndex : uint16 hasLimit : byte if (hasLimit) { limitMin : float3 // 弧度 limitMax : float3 // 弧度 } } }} 考え方は PMX とほぼ同じですが、 ''制限角度の指定方法''に細かな差異があります。 ** Morph Data [#z40457a1] |~フィールド|~型|~内容| |name|char[20]|モーフ名(Shift-JIS)| |type|byte|0:グループ 1:頂点 2:ボーン| |vertexCount|uint32|オフセット数| |(オフセット)|可変|種別ごとに異なる| *** PMD のモーフ種別 [#fd3b814f] |~値|~名称| |0|グループモーフ| |1|頂点モーフ| |2|ボーンモーフ| > '''決定的な制約''':PMD には''UV モーフ・材質モーフが存在しません''。 > そのため''目のハイライト消灯''のような表現ができません。 *** オフセット構造 [#w60316ff] #code(){{ // グループ morphIndex : uint32 weight : float // 頂点 vertexIndex : uint32 offset : float3 // ボーン boneIndex : uint16 translation : float3 rotation : float3 // オイラー角(PMX はクォータニオン) }} ** Display Frame Data [#he55abe6] |~フィールド|~型|~内容| |displayFrameCount|byte|枠数| |name|char[50]|枠名| |elementCount|uint32|要素数| |(要素)|可変|type + index| #code(){{ for (i = 0; i < elementCount; i++) { type : byte // 0:ボーン 1:モーフ index : uint16 または uint32 } }} ** 英語名チャンク [#e24a94ef] PMD の末尾には''英語名''がまとめて格納されます。 |~フィールド|~内容| |modelNameEnglish|char[256]| |commentEnglish|char[512]| |(各ボーン)|char[20] × ボーン数| |(各モーフ)|char[20] × モーフ数| > '''落とし穴''':英語名チャンクは''オプション扱い''です。 > ファイル末尾に達したら''読み飛ばしてよい''設計になっています。 > 逆に言うと、''英語名が無い PMD ファイルも存在します''。 ** PMX への変換 [#hb56e913] PMD を PMX に変換することは''強く推奨されます''。 *** 変換で得られるもの [#q1752313] - スフィアマップ(金属表現) - 材質名(MME の材質指定) - 4 本ウェイト / SDEF(自然な関節変形) - 付与親・捩りボーン(腕の自然な回転) - 変形階層(物理の安定) - UV モーフ・材質モーフ(表情表現の拡張) - 相対パス(移植性の向上) *** 変換で''失われない''もの [#w581cdc3] - 頂点位置・法線・UV - 材質の色 - ボーンの位置と階層 - モーフの形状 - 物理剛体(PMD は物理を持たないため、''そもそも無い'') > '''注意''':PMD は''剛体・ジョイントを持ちません''。 > つまり PMD モデルには''物理が設定されていません''。 > 髪やスカートを揺らしたい場合は、 > PMX 化したうえで''物理を新規に設定''する必要があります。 ** 変換手順(PMXEditor の場合) [#kcce7477] + PMXEditor で PMD を開く + 「''ファイル''」→「''PMX 保存''」で別名保存する + 必要に応じてスフィア・材質名・ウェイトを設定する + 物理を新規に設定する + MMD で動作確認する 詳細は [[格式转换工具链]] を参照。 ** PMD を扱うべき状況 [#g6dba7ad] |~状況|~判断| |過去の資産を動かしたいだけ|そのまま PMD で使える| |MME を使いたい|''PMX 化が必須''| |金属表現をしたい|''PMX 化が必須''| |髪やスカートを揺らしたい|''PMX 化が必須''| |新規にモデルを作る|''PMX を使う''| ** 関連ページ [#eaebea04] - [[PMX格式详解]] — 現行形式の詳細 - [[格式转换工具链]] — 変換の実際 - [[顶点权重详解]] — ウェイトの理論 - [[数据格式速查表]] — 一覧表 #comment(num=5,noname,below)