1. Kinect + openframeworks でモーションキャプチャ、Flash(Away3D)で再生する (3)

     

    1) kinect + openframeworks でキャプチャ、csv で保存・サーバに送信
    2) flashでcsvをダウンロード、再生

    3) openframeworks で再生

    3回目です。今回はAway3Dと同じようにopenframeworks上でも動かしてみます。
    やってることはほとんど同じです。



    まずはそれぞれの部位のクラスを作成。部位ごとにインスタンス化します。
    openframeworksでは回転にはクオータニオンを使いました。クオータニオンってなにって方はこちら。正直なところ完全には理解していませんが(汗)、回転の処理を書くのが楽になるということで。

    class Limb : public ofNode {

    public:

    ofQuaternion orientation;

    void customDraw() {

    ofSetColor(255, 255, 255);

    glPushMatrix();
    glTranslatef(0, -40/2, 0);
    glScalef(3, 30, 3);
    glColor3ub(255, 255, 255);
    ofBox(0, 0, 0, 1);
    glPopMatrix();
    }
    };

    そしてLimbの向きの設定。flashではupdateのたびにLimbの向きをそろえてあげてましたが、クオータニオン使う場合は初期化のときにやっておけば大丈夫です。あとはそこからの回転になるので。
    for(int i=0; i<11; i++) {

    // 左腕
    if(i==2||i==4){
    limbs[i].orientation.makeRotate(-90.0, ofVec3f(0.0f, 0.0f, 1.0f));
    // 右腕
    } else if(i==3||i==5){
    limbs[i].orientation.makeRotate(90.0, ofVec3f(0.0f, 0.0f, 1.0f));
    // 首
    } else if(i==10){
    limbs[i].orientation.makeRotate(180.0, ofVec3f(0.0f, 0.0f, 1.0f));
    } else {
    limbs[i].orientation.set(0, 0, 0, 1);
    }
    }

    そしてupdateするときに↓をよんであげます。flashとだいたい一緒ですね。
    void testApp::transformLimb(int limb, Joint joint){

    //flashのときとおなじように、csvを保存したときと取り出すときで順番をあわせる
    int firstFrame = frame * 22 + limb * 2;

    limbs[limb].setPosition(csv.getFloat(firstFrame, 0), csv.getFloat(firstFrame, 1), csv.getFloat(firstFrame, 2));

    ofMatrix4x4 rotMatrix;
    rotMatrix.set(csv.getFloat(firstFrame + 1, 0), csv.getFloat(firstFrame + 1, 3), csv.getFloat(firstFrame + 1, 6), 0.0f,
    csv.getFloat(firstFrame + 1, 1), csv.getFloat(firstFrame + 1, 4), csv.getFloat(firstFrame + 1, 7), 0.0f,
    csv.getFloat(firstFrame + 1, 2), csv.getFloat(firstFrame + 1, 5), csv.getFloat(firstFrame + 1, 8), 0.0f,
    0.0f, 0.0f, 0.0f, 1.0f);

    ofQuaternion q = rotMatrix.getRotate();//回転行列からクオータニオンを作成。oFさんがやってくれます。

    limbs[limb].setOrientation(limbs[limb].orientation*q);//Limbの回転に適用
    }

    で、あとはdrawしてあげればOKですね。

     

    というかんじです。
    いろいろやってみた感想としては、

    ・AIRKinnectというのがあるらしいのですが、動かせなかった...
    ・WindowsのSDKがいいかんじになってるらしいので触りたい
    ・フレームレートの調整が必要
    ・csvじゃなくてなんかいいかんじのフォーマットのがよさそう。たいしたことしてないのに変に分かりづらくなってしまいました...失敗。
    ・flash→PCブラウザ、Androidアプリ。openframewoks→iOS。なのでなんかできるかもね。あ、flashはiOSもいけるか。
    ・3Dモデルを使うのであれば位置は不要で、各jointの回転だけを使えばいい
    ・.daeとかはAway3Dとopenframeworks共通でつかえる
    ・ゆるきゃらダンスバトル作りたいので誰かくまモンとひこにゃんの3Dモデルください

     

     

    Posted by Takeya Hikage on 2013年04月05日
    Categories flash kinect openframeworks