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();
}
};
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);
}
}
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の回転に適用
}