mkmのモーション読み込み設計

ousttrue2009-04-04

前回まででボーン読み込みを実装し終わったのでようやく本題のモーション実装に入る。

まず、mkmのパースと格納。
ボーン名とフレーム数をキーにボーンの回転情報をデータとしてフラットにベクタに突っ込むとしよう。
イナリサーチできるように名前とフレーム数でソートをかけておく。
(以下設計用のメモなので、cのちゃんとしたコードではない)

struct KeyFrame
{
std:string boneName;
int key;
float quaternion[4];
};

std::vector<KeyFrame> keyframes;

これに対して、名前とフレーム数を指定したら補完済みのボーン回転情報をとれるようなインターフェースを実装する。
最初は、線形補完でよしとする。

Quaternion getQuaternion(const char *boneName, int frame);

ここまでできたらfor文で回して回転情報をボーンに適用していけばアニメーションさせられそう。

void traverseBone(int frame, const Bone &bone, Quaternion parentQuaternion)
{
  // new quoternion
  Quaternion quaternion=parentQuaternion * getQuaternion(bone->name, frame);  

  // OpenGL Draw
  drawBone(bone, quaternion);  
  
  // each child bone
  for(Bone child; child; child=child->sibling){
    // recursive
    traverseBone(frame, child, quternion)    
  }
}

void drawFrame(int frame)
{
  traverseBone(frame, rootBone, identityQuaternion);
}

for(int frame=0; frame<=endFrame; ++frame){
  drawFrame(frame);
}

初期設計としてはこんなものか。
ここからはわりと未知の領域になるなぁ。