ʂ肷̋L 
http://blog.goo.ne.jp/torisu_tetosuki/e/209ad341d3ece2b1b4df24abf619d6e4




---------------------------------------------------------------------------
1

Ewb_
char magic[3]; // "Pmd"
float version; // 00 00 80 3F == 1.00 // ܂BRg肪Ƃ܂
char model_name[20];
char comment[256];

"Pmd" 1.00 "Test Model" "Comments"

E: I[ 0x00A pfBO 0xFD
@R[hFVtgJIS
I[0x00͏ȗs(O)

MMD̃ff[^ɂČXQlɂĂ܂(ꕔMAC)
http://jbbs.livedoor.jp/bbs/read.cgi/music/23040/1219738115/

PMDGfB^readmeQlɂȂ܂^^



---------------------------------------------------------------------------
2


E_Xg
DWORD vert_count; // _
t_vertex vertex[vert_count]; // _f[^(38Bytes/_)

Et_vertex
float pos[3]; // x, y, z // W
float normal_vec[3]; // nx, ny, nz // @xNg
float uv[2]; // u, v // UVW // MMD͒_UV
WORD bone_num[2]; // {[ԍ1Aԍ2 // fό`(_ړ)ɉe
BYTE bone_weight; // {[1ɗ^ex // min:0 max:100 // {[2ւ̉ex́A(100 - bone_weight)
BYTE edge_flag; // 0:ʏA1:GbW // GbW(֊s)L̏ꍇ

WORDBYTE[2]͋CÂɂ̂ł

⑫F
ʒ_Xg̒_ԍWORDȂ̂ŁA_ő65535肩ƁB(ȏ͖ʂȂ̂)



---------------------------------------------------------------------------
3


Eʒ_Xg
DWORD face_vert_count; // _
WORD face_vert_index[face_vert_count]; // _ԍ(3/)





---------------------------------------------------------------------------
4


EގXg
DWORD material_count; // ގ
t_material material[material_count]; // ގf[^(70Bytes/material)

Et_material
float diffuse_color[3]; // dr, dg, db // F
float alpha;
float specularity;
float specular_color[3]; // sr, sg, sb // F
float mirror_color[3]; // mr, mg, mb // F(ambient)
BYTE toon_index; // toon??.bmp // 0.bmp:0xFF, 1(01).bmp:0x00 EEE 10.bmp:0x09
BYTE edge_flag; // ֊sAe
DWORD face_vert_count; // ʒ_ // CfbNXɕϊꍇ́Aގ0珇ɉZ
char texture_file_name[20]; // eNX`t@C܂̓XtBAt@C // 20oCg肬܂Ŏg(I[0x00͖Ă)


eNX`t@C܂̓XtBAt@C̕⑫F

eNX`t@CɃXtBAt@CZ܂͉Zꍇ
(MMD 5.12ȍ~)
"eNX`.bmp*XtBA.sph" ŏZ
"eNX`.bmp*XtBA.spa" ŉZ

(MMD 5.11)
"eNX`.bmp/XtBA.sph" ŏZ

(MMD 5.09-)
"eNX`.bmp" ܂ "XtBA.sph"





---------------------------------------------------------------------------
5



E{[Xg
WORD bone_count; // {[
t_bone bone[bone_count]; // {[f[^(39Bytes/bone)

Et_bone
char bone_name[20]; // {[
WORD parent_bone_index; // e{[ԍ(Ȃꍇ0xFFFF)
WORD tail_pos_bone_index; // tailʒũ{[ԍ(`F[[̏ꍇ0xFFFF) // eFq1FȂ̂ŁAɈʒuߗp
BYTE bone_type; // {[̎
WORD ik_parent_bone_index; // IK{[ԍ(eIK{[BȂꍇ0)
float bone_head_pos[3]; // x, y, z // {[̃wbḧʒu

E{[̎
0:] 1:]ƈړ 2:IK 3:s 4:IKe 5:]e 6:IKڑ 7:\

E{[̎ (MMD 4.0`)
8:P 9:]^

⑫F
1f̃{[̎IȌEς悤łB(MMD6.x`)
ʁF
MMD6.02A6.08
500{x1(eXgɎgf[^513{)Ȃ
2000{x1(eXgɎgf[^2599{)
500{x10Ȃ
MMD5.22
500{x1Ȃ
2000{x1Ȃ




---------------------------------------------------------------------------
6



EIKXg
WORD ik_data_count; // IKf[^
t_ik_data ik_data[ik_data_count]; // IKf[^((11+2*ik_chain_length)/IK)

Et_ik_data
WORD ik_bone_index; // IK{[ԍ
WORD ik_target_bone_index; // IK^[Qbg{[ԍ // IK{[ŏɐڑ{[
BYTE ik_chain_length; // IK`F[̒(q̐)
WORD iterations; // ċAZ // IKl1
float control_weight; // IK̉ex // IKl2
WORD ik_child_bone_index[ik_chain_length]; // IKẽ{[ԍ






---------------------------------------------------------------------------
7



E\Xg
WORD skin_count; // \
t_skin_data skin_data[skin_count]; // \f[^((25+16*skin_vert_count)/skin)

Et_skin_data
char skin_name[20]; //@\
DWORD skin_vert_count; // \p̒_
BYTE skin_type; // \̎ // 0FbaseA1F܂A2FځA3FbvA4F̑
t_skin_vert_data skin_vert_data[skin_vert_count]; // \p̒_̃f[^(16Bytes/vert)

Et_skin_vert_data(typeFbase)
DWORD skin_vert_index; // \p̒_̔ԍ(_Xgɂԍ)
float skin_vert_pos[3]; // x, y, z // \p̒_̍W(_̂̍W)

Et_skin_vert_data(typeFbaseȊO)
DWORD base_skin_vert_index; // \p̒_̔ԍ(base̔ԍBskin_vert_index)
float skin_vert_pos_offset[3]; // x, y, z // \p̒_̍WItZbgl(baseɑ΂ItZbg)




---------------------------------------------------------------------------
8


E\gp\Xg
BYTE skin_disp_count; // \gɕ\\
WORD skin_index[skin_disp_count]; // \ԍ



---------------------------------------------------------------------------
9


E{[gpgXg
BYTE bone_disp_name_count; // {[gp̘g
char disp_name[50][bone_disp_name_count]; // g(50Bytes/g)

⑫F
PMDeditorgꍇ́Ag0x0A00ŏI点Kv܂B(0x00݂̂ƕ\܂)0.0.4.2cŊmFB
MMDł͕I[0x00݂̂ł\\łB6.08ŊmFB(tf0x0A00ŏI[Ă悤ł)



---------------------------------------------------------------------------
10


E{[gp\Xg
DWORD bone_disp_count; // {[gɕ\{[ (g0(Z^[)AׂẴ{[g̍v)
t_bone_disp bone_disp[bone_disp_count]; // gp{[f[^ (3Bytes/bone)

Et_bone_disp
WORD bone_index; // gp{[ԍ
BYTE bone_disp_frame_index; // \gԍ


bone_disp_count́̕A
BYTE bone_disp_count + 0x0000({[0) + 0x00(g0)
̂悤Ɍ܂ADWORDłB
EBYTEɂƑȂ(0x000000f[^ƂăJEg1Ȃ)
E{[ԍWORDȂ̂ŁAWORDȏ̃TCYKv
Ef[^̋؂̈ʒu画fƁAWORDɂ͂ȂȂ

⑫F
1̃{[gɕ\ł{[254łB
1̃{[gɓo^{[ƕ\éAȊB
254F254{\
255A256Fg̕\
257Fg̍ŏ̃{[1{\
258`F256\




---------------------------------------------------------------------------
11



PMD`߂(gPFpΉ)
AhX́A~N v1.3 Zf̃f[^łB
f[^gṕAff[^̎gpɒӂĉ

PPDwb_(p)
0x0007 1167`
BYTE english_name_compatibility; // pΉ(01:pΉ)
char model_name_eg[20]; // f(p)
char comment_eg[256]; // Rg(p)




---------------------------------------------------------------------------
12



PMD`߂(gPFpΉ)

PQD{[Xg(p)
0x0007 127C` // bone_count == 122 (total 2440Bytes)
char bone_name_eg[20][bone_count]; // {[(p)






---------------------------------------------------------------------------
13



PMD`߂(gPFpΉ)

PRD\Xg(p)
0x0007 1C04` // skin_count == 16 // base͉po^Ȃ̂15 (total 300Bytes)
char skin_name_eg[20][skin_count - 1]; // \(p)





---------------------------------------------------------------------------
14



PMD`߂(gPFpΉ)

PSD{[gpgXg(p)
0x0007 1D30` // bone_disp_name_count == 7 // Z^[͉po^Ȃ̂7 (total 350Bytes)
char disp_name_eg[50][bone_disp_name_count]; // g(p) // MMDł́u敪v




---------------------------------------------------------------------------
15



PMD`߂(gQFToonw)

PTDgD[eNX`Xg
0x0007 1E8E` // 10Œ (total 1000Bytes)
char toon_file_name[100][10]; // gD[eNX`t@C





---------------------------------------------------------------------------
16



PMD`߂(gRFZ)
MMD test5bȍ~́AZfΉłB
AhX́A~N v1.3 Zf̃f[^łB
f[^gṕAff[^̎gpɒӂĉ

PUDZ_̃Xg
0x0007 2276`
DWORD rigidbody_count; // ̐ // 2D 00 00 00 == 45
t_rigidbody[rigidbody_count]; // ̃f[^(83Bytes/rigidbody)

Et_rigidbody
char rigidbody_name[20]; // f[^F // 
WORD rigidbody_rel_bone_index; // f[^F֘A{[ԍ // 03 00 == 3 // 
BYTE rigidbody_group_index; // f[^FO[v // 00
WORD rigidbody_group_target; // f[^FO[vFΏ // 0xFFFFƂ̍ // 38 FE
BYTE shape_type; // `F^Cv(0:A1:A2:JvZ) // 00 // 
float shape_w; // `Fa() // CD CC CC 3F // 1.6
float shape_h; // `F // CD CC CC 3D // 0.1
float shape_d; // `Fs // CD CC CC 3D // 0.1
float pos_pos[3]; // ʒuFʒu(x, y, z)
float pos_rot[3]; // ʒuF](rad(x), rad(y), rad(z))
float rigidbody_weight; // f[^F // 00 00 80 3F // 1.0
float rigidbody_pos_dim; // f[^Fړ // 00 00 00 00
float rigidbody_rot_dim; // f[^F] // 00 00 00 00
float rigidbody_recoil; // f[^F // 00 00 00 00
float rigidbody_friction; // f[^FC // 00 00 00 00
BYTE rigidbody_type; // f[^F^Cv(0:BoneǏ]A1:ZA2:Z(Boneʒu)) // 00 // BoneǏ]

⑫PF
pos_rot[3]; // ʒuF]
L^ĺAݒ{bNX̒l(x)WAɕϊl(኱̌덷)
P L^l = ݒ{bNX̒l * PI / 180
Q PI == 3.1415920
R L8
S ݒ{bNXɕ\ĂȂvZΏۂƂ悤łB(ly[XgꍇȂ)
T L^l2*PI(360x)Ő܂

⑫QF
rigidbody_group_target; // f[^FO[vFΏ
Eel(ݒl-1)VtgArbgOR
E0xFFFFƂ̍L^
F
ݒ{bNX	L^l
1		FE FF (0xFFFE == 0xFFFF - (1 << 0))

16		FF 7F (0x7FFF == 0xFFFF - (1 << 15))

1 2		FC FF (0xFFFC == 0xFFFF - (1 << 0) - (1 << 1))


⑫RF
0x0007 227A` // 
0x0007 22CD` // 㔼gE
EEE

⑫SF
float
CD CC CC 3D == 0.1
CD CC 4C 3E == 0.2
CD CC CC 3E == 0.4
CD CC 4C 3F == 0.8
00 00 80 3F == 1.0
CD CC CC 3F == 1.6





---------------------------------------------------------------------------
17



PMD`߂(gRFZ)

PVDZ_WCgXg
0x0007 3111`0x0007 3E28(t@C)
DWORD joint_count; // WCg // 1B 00 00 00 == 27
t_joint[joint_count]; // WCgf[^(124Bytes/joint)

Et_joint
char joint_name[20]; // f[^F // E1
DWORD joint_rigidbody_a; // f[^FA
DWORD joint_rigidbody_b; // f[^FB
float joint_pos[3]; // f[^Fʒu(x, y, z) // f[^Fʒułݒ
float joint_rot[3]; // f[^F](rad(x), rad(y), rad(z))
float constrain_pos_1[3]; // Fړ1(x, y, z)
float constrain_pos_2[3]; // Fړ2(x, y, z)
float constrain_rot_1[3]; // F]1(rad(x), rad(y), rad(z))
float constrain_rot_2[3]; // F]2(rad(x), rad(y), rad(z))
float spring_pos[3]; // ΂ˁFړ(x, y, z)
float spring_rot[3]; // ΂ˁF](rad(x), rad(y), rad(z))

⑫PF
constrain_pos_1[3]; // Fړ1(x, y, z)Aconstrain_pos_2[3]; // Fړ2(x, y, z)
L^鏇ԂɒӁB
ݒ{bNX̕т́Aړ1x - ړ2x ړ1y - ړ2y ړ1z - ړ2z
L^l̕т́Aړ1x ړ1y ړ1z ړ2x ړ2y ړ2z
F]lB



