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

通りすがりの記憶

ただのメモかも知れない

MMDのモデルデータ(PMD)形式 めも6 (IKリスト)

2009-06-07 00:09:07 | MMD
PMD形式めも
・IKリスト
WORD ik_data_count; // IKデータ数
t_ik_data ik_data[ik_data_count]; // IKデータ((11+2*ik_chain_length)/IK)

・t_ik_data
WORD ik_bone_index; // IKボーン番号
WORD ik_target_bone_index; // IKターゲットボーン番号 // IKボーンが最初に接続するボーン
BYTE ik_chain_length; // IKチェーンの長さ(子の数)
WORD iterations; // 再帰演算回数 // IK値1
float control_weight; // 演算1回あたりの制限角度 // IK値2
WORD ik_child_bone_index[ik_chain_length]; // IK影響下のボーン番号

MMDのモデルデータ(PMD)形式 めも5 (ボーンリスト)

2009-06-06 23:25:32 | MMD
PMD形式めも
・ボーンリスト
WORD bone_count; // ボーン数
t_bone bone[bone_count]; // ボーンデータ(39Bytes/bone)

・t_bone
char bone_name[20]; // ボーン名
WORD parent_bone_index; // 親ボーン番号(ない場合は0xFFFF)
WORD tail_pos_bone_index; // tail位置のボーン番号(チェーン末端の場合は0xFFFF 0 →補足2) // 親:子は1:多なので、主に位置決め用
BYTE bone_type; // ボーンの種類
WORD ik_parent_bone_index; // IKボーン番号(影響IKボーン。ない場合は0)
float bone_head_pos[3]; // x, y, z // ボーンのヘッドの位置

・ボーンの種類
0:回転 1:回転と移動 2:IK 3:不明 4:IK影響下 5:回転影響下 6:IK接続先 7:非表示

・ボーンの種類 (MMD 4.0~)
8:捻り 9:回転運動

補足:
1モデルあたりのボーン数の実質的な限界が変わったようです。(MMD6.x~)
実験結果:
MMD6.02、6.08
約500本x1(テストに使ったデータは513本)→落ちない
約2000本x1(テストに使ったデータは2599本)→落ちる
約500本x10→落ちない
MMD5.22
約500本x1→落ちない
約2000本x1→落ちない

補足2:
MMD 7.39dot前後のアップデートに伴い、
チェーン末端のtail位置のボーン番号(子ボーン番号)は0になりました。
(旧バージョンでも使用可)

非表示ボーン(「~~先」など)のtail位置のボーン番号を0xFFFFとした場合、
tail位置が画面左上端付近のボーンとして表示されます。
実験結果:
MMD 7.30までは、問題ないようです。(通常の非表示ボーンと同様、ボーンは表示されません。)
MMD 7.37~7.39では、MMD本体が落ちるようです。
MMD 7.39dot(~8.03)では、
・数回に一度、MMD本体が落ちます。
・MMD本体が落ちなかった場合は、左上に伸びるボーンとして表示されます。
 稀に、エンジン状態(数方向の繰り返し)となる場合もあります。
 (通常の非表示ボーンと同様、ボーンは表示されない場合もあります。)
・読込後しばらく経ってからMMD本体が落ちる事があります。
・2回目のモデル読込時に落ちる事が多いようです。
・画面左下の操作部(local, X, Y, Z等表示されているエリア)付近を通過してpmdファイルをドラッグした場合に落ちる事が多いようです。
・32bit版、64bit版ともに、MMD本体が落ちる場合があります。
(あくまで実験結果なので、落ちるのは0xFFFF以外の原因かもしれません。)

MMD 7.30の場合


MMD 8.03(64bit版)の場合


MMDのモデルデータ(PMD)形式 めも4 (材質リスト)

2009-06-06 22:40:22 | MMD
PMD形式めも
・材質リスト
DWORD material_count; // 材質数
t_material material[material_count]; // 材質データ(70Bytes/material)

・t_material
float diffuse_color[3]; // dr, dg, db // 減衰色
float alpha; // 減衰色の不透明度
float specularity;
float specular_color[3]; // sr, sg, sb // 光沢色
float mirror_color[3]; // mr, mg, mb // 環境色(ambient)
BYTE toon_index; // toon??.bmp // 0.bmp:0xFF, 1(01).bmp:0x00 ・・・ 10.bmp:0x09
BYTE edge_flag; // 輪郭、影
DWORD face_vert_count; // 面頂点数 // 面数ではありません。この材質で使う、面頂点リストのデータ数です。
char texture_file_name[20]; // テクスチャファイル名またはスフィアファイル名 // 20バイトぎりぎりまで使える(終端の0x00は無くても動く)


テクスチャファイル名またはスフィアファイル名の補足:

テクスチャファイルにスフィアファイルを乗算または加算する場合
(MMD 5.12以降)
"テクスチャ名.bmp*スフィア名.sph" で乗算
"テクスチャ名.bmp*スフィア名.spa" で加算

(MMD 5.11)
"テクスチャ名.bmp/スフィア名.sph" で乗算

(MMD 5.09あたり-)
"テクスチャ名.bmp" または "スフィア名.sph"




不透明度の補足:
(MMD 6.10以降)
0.98に設定した場合、その材質のセルフシャドウは無効になります。
(他の材質・モデルの影の影響は受けます)
セルフシャドウ無効化の設定値が0.99でないのは、0.99が擬似両面化(不透明度1だと片面しか見えないので)によく使われるためと思われます。

セルフシャドウとToon色の関係:
(MMD 6.10以降)
モデルの場合は、Toonの左下1ドットの色
アクセサリの場合は、emissiveColor(MMDの地面影色設定で調整可能)が
セルフシャドウの色として利用されます。

アクセサリのemissiveColor(自己発光色):MMDで照明のr,g,bを全て0にした時の色です。

参照:
【MMD】セルフシャドウ説明 (樋口Mによるセルフシャドウの説明です)

めも:
セルフシャドウのモード1:近距離から遠距離まで均等に綺麗な影
セルフシャドウのモード2:近距離ほど綺麗な影

モード1で、画面内の最も遠距離まで影が映るように距離を調整→
 近距離側の影が表示されなくなった場合→ モード2を使用します。

モード2でも、照明の向きとカメラの方向が同じ方向を向いてしまうと、
モード1相当の動作になってしまいます。



面頂点数の補足:
材質0から順番に、材質の面頂点数に設定した数ずつ、面頂点リストのデータを使うイメージです。


MMDのモデルデータ(PMD)形式 めも3 (面頂点リスト)

2009-06-06 22:34:08 | MMD
PMD形式めも
・面頂点リスト
DWORD face_vert_count; // 頂点数 // 面数ではありません
WORD face_vert_index[face_vert_count]; // 頂点番号(3個/面)

// 例:
// 00:位置(-1, 0, 0), 01:(0, 2, 0), 02:(1, 0, 0)の3頂点で構成される3角形を手前(z+)向きに表示する場合 // 材質の透過率が1の場合
//
// 0x0000 0003 // face_vert_count
// 0x0000 0x0001 0x0002 // face_vert_idx[]


MMD 8.03(64bit版)での実験結果:
実験1:
頂点の位置が00:(-1, 0, 0), 01:(0, 2, 0), 02:(1, 0, 0)、
法線ベクトルが00:(0, 0, 1), 01:(0, 0, 1), 02:(0, 0, 1) の場合

頂点番号を00 01 02とすると手前向きになります。


実験2:
頂点の位置が00:(-1, 0, 0), 01:(0, 2, 0), 02:(1, 0, 0)、
法線ベクトルが00:(0, 0, -1), 01:(0, 0, -1), 02:(0, 0, -1) の場合

頂点番号を00 01 02とすると手前向きになります。


実験3:
頂点の位置が00:(-1, 0, 0), 01:(0, 2, 0), 02:(1, 0, 0)、
法線ベクトルが00:(0, 0, 0), 01:(0, 0, 0), 02:(0, 0, 0) の場合(設定しわすれた場合)

頂点番号を00 01 02とすると手前向きになります。


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

2009-06-01 23:09:46 | MMD
PMD形式めも
・頂点リスト
DWORD vert_count; // 頂点数
t_vertex vertex[vert_count]; // 頂点データ(38Bytes/頂点)

・t_vertex
float pos[3]; // x, y, z // 座標
float normal_vec[3]; // nx, ny, nz // 法線ベクトル
float uv[2]; // u, v // UV座標 // MMDは頂点UV
WORD bone_num[2]; // ボーン番号1、番号2 // モデル変形(頂点移動)時に影響
BYTE bone_weight; // ボーン1に与える影響度 // min:0 max:100 // ボーン2への影響度は、(100 - bone_weight)
BYTE edge_flag; // 0:通常、1:エッジ無効 // エッジ(輪郭)が有効の場合

WORDとBYTE[2]は気づきにくいのです

補足:
面頂点リストの頂点番号がWORDなので、頂点数も最大65535あたりかと。(それ以上は面が張れないので)