goo blog サービス終了のお知らせ 

通りすがりの記憶

ただのメモかも知れない

MMDのモデルデータ(PMD)形式 めも (まとめ)

2009-06-07 02:34:04 | MMD
PMD形式めも(MMD3.0.x~)

・ヘッダ:    MMDのモデルデータ(PMD)形式 めも
・頂点リスト: MMDのモデルデータ(PMD)形式 めも2
・面頂点リスト:   MMDのモデルデータ(PMD)形式 めも3 →インデックスバッファの中身みたいなものです。
・材質リスト:  MMDのモデルデータ(PMD)形式 めも4
・ボーンリスト:MMDのモデルデータ(PMD)形式 めも5
・IKリスト:   MMDのモデルデータ(PMD)形式 めも6
・表情リスト: MMDのモデルデータ(PMD)形式 めも7
・表情枠用表示リスト:MMDのモデルデータ(PMD)形式 めも8
・ボーン枠用枠名リスト:MMDのモデルデータ(PMD)形式 めも9
・ボーン枠用表示リスト:MMDのモデルデータ(PMD)形式 めも10


物理演算が来たら、変更があるかも
→拡張部分を追加しました。MMDのモデルデータ(PMD)形式 拡張部分 めも (まとめ)

補足:
各データは、解析結果です。

補足2:
unsignedが付くか付かないかは未検証です。
(書き直していませんが、ボーンのインデックスはsignedです)

MMDのモデルデータ(PMD)形式 めも10 (ボーン枠用表示リスト)

2009-06-07 02:02:22 | MMD
PMD形式めも
・ボーン枠用表示リスト
DWORD bone_disp_count; // ボーン枠に表示するボーン数 (枠0(センター)を除く、すべてのボーン枠の合計)
t_bone_disp bone_disp[bone_disp_count]; // 枠用ボーンデータ (3Bytes/bone)

・t_bone_disp
WORD bone_index; // 枠用ボーン番号
BYTE bone_disp_frame_index; // 表示枠番号 // センター:00 他の表示枠:01~ // センター枠にセンター(index 0)以外のボーンを指定しても表示されません。


※bone_disp_countの部分は、
BYTE bone_disp_count + 0x0000(ボーン0) + 0x00(枠0)
のように見えますが、DWORDです。
・BYTEにすると総数が合わない(0x000000をデータとしてカウントすると1足りない)
・ボーン番号がWORDなので、WORD以上のサイズが必要
・データの区切りの位置から判断すると、WORDにはならない

補足:
1つのボーン枠に表示できるボーン数は254個です。
1つのボーン枠に登録したボーン数と表示される内容は、こんな感じ。
254:254本表示される
255、256:枠内の表示が消える
257:枠内の最初のボーン1本だけ表示
258~:256を引いた数ずつ表示される


実験結果:
(MMD 8.03(64bit)で実験)
枠用ボーンデータに、
01 00 00 (ボーン1をセンター枠に表示)
→センター枠にボーン1は表示されません。

枠用ボーンデータに、
00 00 01 (ボーン0(=センター)を枠1に表示)
→枠1にセンターボーンが表示されます。

MMDのモデルデータ(PMD)形式 めも9 (ボーン枠用枠名リスト)

2009-06-07 01:54:12 | MMD
PMD形式めも
・ボーン枠用枠名リスト
BYTE bone_disp_name_count; // ボーン枠用の枠名数 // センター(1番上に表示される枠)は含まない
char disp_name[50][bone_disp_name_count]; // 枠名(50Bytes/枠)

補足:
PMDeditorを使う場合は、枠名を0x0A00で終わらせる必要があります。(0x00のみだと表示されません)→0.0.4.2cで確認。
MMDでは文字列終端は0x00のみでも表示可能です。→6.08で確認。(付属モデルは0x0A00で終端しているようです)

MMDのモデルデータ(PMD)形式 めも7

2009-06-07 01:05:47 | MMD
PMD形式めも
・表情リスト
WORD skin_count; // 表情数
t_skin_data skin_data[skin_count]; // 表情データ((25+16*skin_vert_count)/skin)

・t_skin_data
char skin_name[20]; // 表情名
DWORD skin_vert_count; // 表情用の頂点数
BYTE skin_type; // 表情の種類 // 0:base、1:まゆ、2:目、3:リップ、4:その他
t_skin_vert_data skin_vert_data[skin_vert_count]; // 表情用の頂点のデータ(16Bytes/vert)

・t_skin_vert_data(type:base)
DWORD skin_vert_index; // 表情用の頂点の番号(頂点リストにある番号)
float skin_vert_pos[3]; // x, y, z // 表情用の頂点の座標(頂点自体の座標)

・t_skin_vert_data(type:base以外)
DWORD base_skin_vert_index; // 表情用の頂点の番号(baseの番号。skin_vert_index)
float skin_vert_pos_offset[3]; // x, y, z // 表情用の頂点の座標オフセット値(baseに対するオフセット)