mkmのモーション読み込み設計
前回まででボーン読み込みを実装し終わったのでようやく本題のモーション実装に入る。
まず、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); }
初期設計としてはこんなものか。
ここからはわりと未知の領域になるなぁ。