通りすがりの記憶

ただのメモかも知れない

MMDのモーションデータ(VMD)形式 めも2 (表示・IK)

2013-09-10 06:13:25 | MMD
VMD形式 めも
・表示・IKデータ (MMD 7.40以降)
→セルフシャドウデータの後ろに追加されました。
 これに伴い、異常データの扱いが変わりました。
 (データ末尾が表示・IKデータまでとなったため、
 セルフシャドウデータ以降に異常データが存在する場合、
 MMD 7.40以降では読込めなくなりました。)

※暫定版です
※signed/unsignedは未確認
※int:32bit


// 表示・IKデータ
int dataCount; // データ数
VMD_VISIBLE_IK_DATA data[dataCount];


// IKデータ用構造体
typedef struct _VMD_IK_DATA
{
char ikBoneName[20]; // IKボーン名
unsigned char ikEnabled; // IK有効 // 0:off 1:on
} VMD_IK_DATA;

// 表示・IKデータ用構造体
typedef struct _VMD_VISIBLE_IK_DATA
{
int frameNo; // フレーム番号
unsigned char visible; // 表示 // 0:off 1:on
int ikCount; // IK数
VMD_IK_DATA *ikData; // ikData[ikCount]; // IKデータリスト
} VMD_VISIBLE_IK_DATA;

MMDのモーションデータ(VMD)形式 めも

2010-02-20 08:13:55 | MMD
VMD形式 めも
MMD板に貼ったものと、ほぼ同内容です。(補間部分を追記してます)
MMDのモデルデータについて語るスレの967を元に、再調査+追記

//// ファイル形式(VMD) ////
// unsigned が付くかどうかは未チェック
// バイナリエディタ用の定義ファイルをそのまま持ってきたので、データ数も構造体に入っていますが、気にしない!

// ヘッダ
struct VMD_HEADER {
char VmdHeader[30]; // "Vocaloid Motion Data 0002"
char VmdModelName[20]; // カメラの場合:"カメラ・照明" // カメラ・照明・アクセサリモードではモデル用のVMDは読めなくなりました(7.10-)
} vmd_header;

// モーションデータ数
//
// キーフレーム数の上限(MMD側で制限):300,000(32bit版), 600,000(64bit版 7.39dot-)
// 上限判定時は、フレーム0にあるキー(デフォルトではモデルのボーン数と同数)もカウントされるので注意
//
struct VMD_MOTION_COUNT {
DWORD Count;// モーションデータ数
} vmd_motion_count;

// モーションデータ
struct VMD_MOTION { // 111 Bytes // モーション
char BoneName[15]; // ボーン名
DWORD FrameNo; // フレーム番号(読込時は現在のフレーム位置を0とした相対位置)
float Location[3]; // 位置
float Rotatation[4]; // Quaternion // 回転
BYTE Interpolation[64]; // [4][4][4] // 補完
} vmd_motion;

// 表情データ数
struct VMD_SKIN_COUNT {
DWORD Count; // 表情データ数
} vmd_skin_count;

// 表情データ
struct VMD_SKIN { // 23 Bytes // 表情
char SkinName[15]; // 表情名
DWORD FlameNo; // フレーム番号
float Weight; // 表情の設定値(表情スライダーの値)
} vmd_skin;

// カメラデータ数
struct VMD_CAMERA_COUNT {
DWORD Count; // カメラデータ数
} vmd_camera_count;

// カメラデータ
struct VMD_CAMERA { // 61 Bytes // カメラ
DWORD FlameNo; // フレーム番号
float Length; // -(距離)
float Location[3]; // 位置
float Rotation[3]; // オイラー角 // X軸は符号が反転しているので注意 // 回転
BYTE Interpolation[24]; // おそらく[6][4](未検証) // 補完
DWORD ViewingAngle; // 視界角
BYTE Perspective; // 0:on 1:off // パースペクティブ
} vmd_camera;

// 照明データ数
struct VMD_LIGHT_COUNT {
DWORD Count; // 照明データ数
} vmd_light_count;

// 照明データ
struct VMD_LIGHT { // 28 Bytes // 照明
DWORD FlameNo; // フレーム番号
float RGB[3]; // RGB各値/256 // 赤、緑、青
float Location[3]; // X, Y, Z
} vmd_light;

// セルフシャドウデータ数
struct VMD_SELF_SHADOW_COUNT {
DWORD Count; // セルフシャドウデータ数
} vmd_self_shadow_count;

// セルフシャドウデータ
struct VMD_SELF_SHADOW { // 9 Bytes // セルフシャドー
DWORD FlameNo; // フレーム番号
BYTE Mode; // 00-02 // モード
float Distance; // 0.1 - (dist * 0.00001) // 距離
} vmd_self_shadow;

//// 補間の補足 ////
// 補間用の曲線
// (0,0), A(ax,ay), B(bx,by), (127,127) の3次(4点)ベジェ
// A:左下の+, B:右上の+
VMD補間_補足

// モーションの補間パラメータの並び順(MMD板の情報)
// 回転は4軸(クオータニオン)だが、1個にまとめられているので注意
//   X軸     Y軸     Z軸     回転
// A (Xax,Xay) (Yax,Yay) (Zax,Zay) (Rax,Ray)
// B (Xbx,Xby) (Ybx,Yby) (Zbx,Zby) (Rbx,Rby)
// とすると、
// Xax,Yax,Zax,Rax, Xay,Yay,Zay,Ray, Xbx,Ybx,Zbx,Rbx, Xby,Yby,Zby,Rby,
// Yax,Zax,Rax, Xay,Yay,Zay,Ray, Xbx,Ybx,Zbx,Rbx, Xby,Yby,Zby,Rby, 01,
// Zax,Rax, Xay,Yay,Zay,Ray, Xbx,Ybx,Zbx,Rbx, Xby,Yby,Zby,Rby, 01,00,
// Rax, Xay,Yay,Zay,Ray, Xbx,Ybx,Zbx,Rbx, Xby,Yby,Zby,Rby, 01,00,00

// カメラの補間(推測)
// モーションの補間と同じ並び順だとすると
//   X軸     Y軸     Z軸     回転     距離    視覚野
// A (Xax,Xay) (Yax,Yay) (Zax,Zay) (Rax,Ray) (Lax,Lay) (VAax,VAay)
// B (Xbx,Xby) (Ybx,Yby) (Zbx,Zby) (Rbx,Rby) (Lbx,Lby) (VAbx,VAby)
// の場合、
// Xax,Yax,Zax,Rax,Lax,VAax, Xay,Yay,Zay,Ray,Lay,VAay,
// Xbx,Ybx,Zbx,Rbx,Lbx,VAbx, Xby,Yby,Zby,Rby,Lby,VAby



実験結果:
(MMD 8.03 32bit版、64bit版)
フレーム番号の(表示)最大値:999,999
・フレーム操作欄に数値を直接入力する場合は6桁で制限されます。
・「>」ボタンや右(→)キーなどで表示限界を超えると上6桁のみ表示されます。
・「<」ボタンや左(←)キーなどで(7桁以上から6桁に)戻れます。
・フレーム番号が1,000,000以上の場所にもキーは打てます。

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

2009-06-19 00:37:34 | MMD
基本部分:
MMDのモデルデータ(PMD)形式 めも (まとめ)

拡張部分:
拡張1:英名対応
11.ヘッダ(英語):        MMDのモデルデータ(PMD)形式 英名対応 めも
12.ボーンリスト(英語):     MMDのモデルデータ(PMD)形式 英名対応 めも2
13.表情リスト(英語):      MMDのモデルデータ(PMD)形式 英名対応 めも3
14.ボーン枠用枠名リスト(英語):MMDのモデルデータ(PMD)形式 英名対応 めも4

拡張2:Toon指定
15.トゥーンテクスチャリスト:MMDのモデルデータ(PMD)形式 Toon指定 めも

拡張3:物理演算(MMD 5_beta~)
16.物理演算_剛体リスト:   MMDのモデルデータ(PMD)形式 物理演算 めも
17.物理演算_ジョイントリスト:MMDのモデルデータ(PMD)形式 物理演算 めも2

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

MMDのモデルデータ(PMD)形式 物理演算 めも2

2009-06-19 00:33:48 | MMD
PMD形式めも(拡張3:物理演算)

17.物理演算_ジョイントリスト
0x0007 3111~0x0007 3E28(ファイル末尾)
DWORD joint_count; // ジョイント数 // 1B 00 00 00 == 27
t_joint[joint_count]; // ジョイントデータ(124Bytes/joint)

・t_joint
char joint_name[20]; // 諸データ:名称 // 右髪1
DWORD joint_rigidbody_a; // 諸データ:剛体A
DWORD joint_rigidbody_b; // 諸データ:剛体B
float joint_pos[3]; // 諸データ:位置(x, y, z) // 諸データ:位置合せでも設定可
float joint_rot[3]; // 諸データ:回転(rad(x), rad(y), rad(z))
float constrain_pos_1[3]; // 制限:移動1(x, y, z)
float constrain_pos_2[3]; // 制限:移動2(x, y, z)
float constrain_rot_1[3]; // 制限:回転1(rad(x), rad(y), rad(z))
float constrain_rot_2[3]; // 制限:回転2(rad(x), rad(y), rad(z))
float spring_pos[3]; // ばね:移動(x, y, z)
float spring_rot[3]; // ばね:回転(rad(x), rad(y), rad(z))

補足1:
constrain_pos_1[3]; // 制限:移動1(x, y, z)、constrain_pos_2[3]; // 制限:移動2(x, y, z)
記録される順番に注意。
設定ボックスの並びは、移動1x - 移動2x 移動1y - 移動2y 移動1z - 移動2z
記録される値の並びは、移動1x 移動1y 移動1z 移動2x 移動2y 移動2z
制限:回転も同様。

MMDのモデルデータ(PMD)形式 物理演算 めも

2009-06-19 00:21:24 | MMD
PMD形式めも(拡張3:物理演算)
MMD test5b以降の、物理演算モデル対応部分です。
アドレス等は、初音ミク v1.3 物理演算モデルのデータです。
データ使用時は、モデルデータの使用条件等に注意して下さい

16.物理演算_剛体リスト
0x0007 2276~
DWORD rigidbody_count; // 剛体数 // 2D 00 00 00 == 45
t_rigidbody[rigidbody_count]; // 剛体データ(83Bytes/rigidbody)

・t_rigidbody
char rigidbody_name[20]; // 諸データ:名称 // 頭
WORD rigidbody_rel_bone_index; // 諸データ:関連ボーン番号 // 03 00 == 3 // 頭
BYTE rigidbody_group_index; // 諸データ:グループ // 00
WORD rigidbody_group_target; // 諸データ:グループ:対象 // 0xFFFFとの差 // 38 FE
BYTE shape_type; // 形状:タイプ(0:球、1:箱、2:カプセル) // 00 // 球
float shape_w; // 形状:半径(幅) // CD CC CC 3F // 1.6
float shape_h; // 形状:高さ // CD CC CC 3D // 0.1
float shape_d; // 形状:奥行 // CD CC CC 3D // 0.1
float pos_pos[3]; // 位置:位置(x, y, z)
float pos_rot[3]; // 位置:回転(rad(x), rad(y), rad(z))
float rigidbody_weight; // 諸データ:質量 // 00 00 80 3F // 1.0
float rigidbody_pos_dim; // 諸データ:移動減 // 00 00 00 00
float rigidbody_rot_dim; // 諸データ:回転減 // 00 00 00 00
float rigidbody_recoil; // 諸データ:反発力 // 00 00 00 00
float rigidbody_friction; // 諸データ:摩擦力 // 00 00 00 00
BYTE rigidbody_type; // 諸データ:タイプ(0:Bone追従、1:物理演算、2:物理演算(Bone位置合せ)) // 00 // Bone追従

補足1:
pos_rot[3]; // 位置:回転
記録される値は、設定ボックスの値(度)をラジアンに変換した値(若干の誤差あり)
※1 記録される値 = 設定ボックスの値 * PI / 180
※2 PI == 3.1415920
※3 有効桁数は8桁
※4 設定ボックスに表示されていない桁も計算対象とするようです。(値をペーストした場合など)
※5 記録される値は2*PI(360度)で制限されません

補足2:
rigidbody_group_target; // 諸データ:グループ:対象
・各値を(設定値-1)左シフトした後、ビットOR
・0xFFFFとの差を記録
例:
設定ボックス	記録される値
1		FE FF (0xFFFE == 0xFFFF - (1 << 0))
16 FF 7F (0x7FFF == 0xFFFF - (1 << 15))
1 2 FC FF (0xFFFC == 0xFFFF - (1 << 0) - (1 << 1))
補足3: 0x0007 227A~ // 頭 0x0007 22CD~ // 上半身右 ・・・ 補足4: 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