#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)


トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS