通りすがりの記憶

ただのメモかも知れない

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以上の場所にもキーは打てます。

最新の画像もっと見る

4 コメント

コメント日が  古い順  |   新しい順
Unknown (Syndroma)
2010-07-27 23:44:48
Can you tell me when does the motion start and when it ends? I understand I should interpolate between frames, but VMD_MOTION describes only the endpoint. What is the starting point?
返信する
Unknown (TT/通りすがり)
2010-07-28 13:14:18
> Syndroma

http://blogimg.goo.ne.jp/user_image/62/9d/30309d9d16cc86c24d9891c35f28017d.png

Position and rotation in VMD_MOTION are key (marker) frame data which you find in numeric input (bone position, degree).

VMD_MOTIONに記録されている位置、角度は、キーフレーム(マーカーを打ったフレーム)のデータです。

始まり/終わりではなく、フレームがキーフレームに来た時どんな状態になっているかを表していると考えるのが良いと思います。(なので、データ数が1個のVMDも作れます)
返信する
Unknown (Syndroma)
2010-07-29 03:30:11
Thank you for your answer. As I understand, a bone is constantly changing, and motion data is just a key points.

But I have another question - what is the default frame rate?
返信する
Unknown (TT/通りすがり)
2010-07-29 17:04:32
http://blogimg.goo.ne.jp/user_image/3d/bd/8d66cdc53efc44da038e14f6a6e5d73b.jpg

> Syndroma
Default frame rate of MMD is 30fps.

3000フレームで1:40(=100秒)なので、30fpsです。
フレーム数と秒数は、情報表示(information display)で確認できます。
返信する

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。