static void draw2( void ) { static int before_visible[2] = {0, 0}; static int Wire_count = -1; // 出力する Wire の選択(0〜4) static int flag_first1 = 0; // 一度でも hiro が見つかったら立つ static double begin[3]; /* 3Dオブジェクトを描画するための準備 */ argDrawMode3D(); argDraw3dCamera(0, 0); /* Zバッファなどの設定 */ glClear( GL_DEPTH_BUFFER_BIT ); // 陰面処理の設定 glEnable( GL_DEPTH_TEST ); // 陰面処理の適用 mySetLight(); // 光源の設定 glEnable( GL_LIGHTING ); // 光源の適用 test2(); myMarkSquare(PTT1_MARK_ID); // 動作確認用コード /***************************/ /* */ /* draw関数をかけ */ /* */ /* */ /***************************/ glDisable( GL_LIGHTING ); // 光源の無効化 glDisable( GL_DEPTH_TEST ); // 陰面処理の無効化 }
// 描画関数 void Draw(void) { // 画像バッファ作成 IplImage *copyImage = cvCreateImage( cvSize(frameImage->width, frameImage->height), 8, 4 ); // RGBA の4バイト frameImage = cvQueryFrame( capture ); cvFlip( frameImage, frameImage, 1); //if(!mode)frameImage = cvLoadImage( "view000.bmp" ); if(0){ // detect marker // detect action Mat frame(frameImage); pDetector->init(frame); // スティック検出 vector<iVec2> act; pDetector->detectAction( act ); {// 検出結果描画 for( int i = 0; i < act.size(); i++ ){ int x = act[i].x, y = act[i].y; line( frame, Point(x-15, y) , Point(x+15, y), Scalar(255, 255, 0), 4, CV_AA ); line( frame, Point(x, y-15) , Point(x, y+15), Scalar(255, 255, 0), 4, CV_AA ); circle( frame, Point(x, y), 20, Scalar(255, 255, 255), 2 ); } } *frameImage = frame; // out sound if(act.size() > 0){ pDrum->tataku(LOW_TOM_1); } } cvCvtColor(frameImage, copyImage, CV_BGR2RGBA ); // OpenGL用に画素の並びを変換 cvFlip( copyImage, copyImage, 0 ); // OpenGLの原点に合わせて上下反転 glMatrixMode(GL_MODELVIEW); glEnable( GL_DEPTH_TEST ); // 隠面処理の適用 mySetLight(); // 光源の設定 glEnable( GL_LIGHTING ); // 光源ON // OpenCV の画像データを描画(キャプチャした画像を背景として描画) glDrawPixels( copyImage->width, copyImage->height, GL_RGBA, GL_UNSIGNED_BYTE, copyImage->imageData ); glClear( GL_DEPTH_BUFFER_BIT ); // デプスバッファのみをクリア {// renderModel // モデルの表示位置{ x, y, z, a } // 決め打ちで書いてるが実際はこの座標と角度をマーカーで取得したものにする! float sym_l[] = {-200, 0, -500, 10}; float drum_l2[] = {-150, -100, -450, 10}; float drum_l1[] = { -50, -100, -400, 10}; float drum_r1[] = { 50, -100, -400, 10}; float drum_r2[] = { 150, -100, -450, 10}; float sym_r[] = { 200, 0, -500, 10}; float *pDrumSet[100]; { pDrumSet[0] = sym_l; pDrumSet[1] = drum_l2; pDrumSet[2] = drum_l1; pDrumSet[3] = drum_r1; pDrumSet[4] = drum_r2; pDrumSet[5] = sym_r; } Mat frame(frameImage); if(mode==0) { // マーカー検出モード pDetector->init(frame); pDetector->getMarkerPos(); mrkPos = &pDetector->m_marker; for(int i = 0; i < mrkPos->size(); i++ ){ pDrumSet[i][0] = (*mrkPos)[i].pos.x; pDrumSet[i][1] = (*mrkPos)[i].pos.y; pDrumSet[i][2] = -(*mrkPos)[i].pos.z; pDrumSet[i][3] = (*mrkPos)[i].angle * 180/3.14; } if( mrkPos->size() != 6 ){ for(int i = 0; i < mrkPos->size(); i++ ){ renderModel( drumL2Model, drumActModel, pDrumSet[i][0], pDrumSet[i][1], pDrumSet[i][2], pDrumSet[i][3], 0 ); } } else{ renderModel( cymbalLModel, cymbalActModel, sym_l[0], sym_l[1], sym_l[2], sym_l[3], actFlg[0] ); renderModel( drumL2Model, drumActModel, drum_l2[0], drum_l2[1], drum_l2[2], drum_l2[3], actFlg[1] ); renderModel( drumL1Model, drumActModel, drum_l1[0], drum_l1[1], drum_l1[2], drum_l1[3], actFlg[2] ); renderModel( drumR1Model, drumActModel, drum_r1[0], drum_r1[1], drum_r1[2], drum_r1[3], actFlg[3] ); renderModel( drumR2Model, drumActModel, drum_r2[0], drum_r2[1], drum_r2[2], drum_r2[3], actFlg[4] ); renderModel( cymbalRModel, cymbalActModel, sym_r[0], sym_r[1], sym_r[2], sym_r[3], actFlg[5] ); } }else{ pDetector->init(frame); vector<iVec2> dAction; pDetector->detectAction(dAction); for(int i = 0; i < dAction.size(); i++ ){ int xPos = dAction[i].x; int yPos = dAction[i].y; int id; int maxDiff = 640; for( int j=0; j < 6;j++){ int dX = ((*mrkPos)[j].center.x - xPos ); int dY = ((*mrkPos)[j].center.y - yPos ); double diff = sqrt((double)dX*dX+dY*dY); if( diff < maxDiff ){ maxDiff = diff; id = j; } } if(maxDiff < 150) act.push_back(id); } for(int i = 0; i < act.size(); i++){ int n = act[i]; actFlg[n] = 1; switch(n){ case 5: pDrum->tataku(OPEN_HIHAT); break; case 1: pDrum->tataku(HIGH_TOM_1); break; case 2: pDrum->tataku(LOW_TOM_1); break; case 3: pDrum->tataku(LOW_TOM_2); break; case 4: pDrum->tataku(MID_TOM_1); break; case 0: pDrum->tataku(CLOSED_HIHAT); break; default: break; } } for(int i = 0; i < 6; i++ ){ pDrumSet[i][0] = (*mrkPos)[i].pos.x; pDrumSet[i][1] = (*mrkPos)[i].pos.y; pDrumSet[i][2] = -(*mrkPos)[i].pos.z; pDrumSet[i][3] = (*mrkPos)[i].angle * 180/3.14; } // 叩かれたモデルのactFlgを1にして渡す(複数指定可) renderModel( cymbalLModel, cymbalActModel, sym_l[0], sym_l[1], sym_l[2], sym_l[3], actFlg[0] ); renderModel( drumL2Model, drumActModel, drum_l2[0], drum_l2[1], drum_l2[2], drum_l2[3], actFlg[1] ); renderModel( drumL1Model, drumActModel, drum_l1[0], drum_l1[1], drum_l1[2], drum_l1[3], actFlg[2] ); renderModel( drumR1Model, drumActModel, drum_r1[0], drum_r1[1], drum_r1[2], drum_r1[3], actFlg[3] ); renderModel( drumR2Model, drumActModel, drum_r2[0], drum_r2[1], drum_r2[2], drum_r2[3], actFlg[4] ); renderModel( cymbalRModel, cymbalActModel, sym_r[0], sym_r[1], sym_r[2], sym_r[3], actFlg[5] ); for(int i=0;i<6; i++) actFlg[i] = 0; act.clear(); } } glutSwapBuffers(); cvReleaseImage( ©Image ); }
static void draw(void) { int i,j,k; float size = CUBE_SIZE; float normals[6][3] = { { 0.0, 0.0, -1.0}, { 1.0, 0.0, 0.0}, { 0.0, 0.0, 1.0}, {-1.0, 0.0, 0.0}, { 0.0, 1.0, 0.0}, { 0.0, -1.0, 0.0} }; float cube_points[8][3] ={ { -size, -size, -size }, { size, -size, -size }, { size, -size, size }, { -size, -size, size }, { -size, size, -size }, { size, size, -size }, { size, size, size }, { -size, size, size } }; /* 3Dオブジェクトを描画するための準備 */ argDrawMode3D(); argDraw3dCamera(0, 0); glClear(GL_DEPTH_BUFFER_BIT); //バッファの消去 glEnable( GL_DEPTH_TEST ); // 陰面処理の適用 mySetLight(); glEnable( GL_LIGHTING ); myMatrix(object[PTT1_MARK_ID].patt_trans); renew(); // フレーム毎の更新内容 // 立方体 glPushMatrix(); glTranslated( c_trans[0], c_trans[1], c_trans[2]);//平行移動値の設定 glRotatef(c_angle[0], 1.0, 0.0, 0.0 ); glRotatef(c_angle[1], 0.0, 1.0, 0.0 ); glRotatef(c_angle[2], 0.0, 0.0, 1.0 ); /* 前 */ glEnable( GL_TEXTURE_2D ); glBegin( GL_QUADS ); mySetMaterial( 1.0, 1.0, 1.0 ); glBindTexture(GL_TEXTURE_2D, texture); glNormal3fv(normals[0]); glTexCoord2f(0.0, 1.0); glVertex3fv(cube_points[0]); glTexCoord2f(1.0, 1.0); glVertex3fv(cube_points[1]); glTexCoord2f(1.0, 0.0); glVertex3fv(cube_points[5]); glTexCoord2f(0.0, 0.0); glVertex3fv(cube_points[4]); glEnd(); glDisable( GL_TEXTURE_2D ); /* 右 */ glBegin( GL_QUADS ); mySetMaterial( 0.0, 1.0, 0.0); glNormal3fv(normals[1]); glVertex3fv(cube_points[1]); glVertex3fv(cube_points[2]); glVertex3fv(cube_points[6]); glVertex3fv(cube_points[5]); glEnd(); /* 後ろ */ glBegin( GL_QUADS ); mySetMaterial( 0.0, 1.0, 1.0); glNormal3fv(normals[2]); glVertex3fv(cube_points[2]); glVertex3fv(cube_points[3]); glVertex3fv(cube_points[7]); glVertex3fv(cube_points[6]); glEnd(); /* 左 */ glBegin( GL_QUADS ); mySetMaterial( 1.0, 0.0, 1.0); glNormal3fv(normals[3]); glVertex3fv(cube_points[3]); glVertex3fv(cube_points[0]); glVertex3fv(cube_points[4]); glVertex3fv(cube_points[7]); glEnd(); /* 上 */ glBegin( GL_QUADS ); mySetMaterial( 0.0, 0.0, 1.0); glNormal3fv(normals[4]); glVertex3fv(cube_points[4]); glVertex3fv(cube_points[5]); glVertex3fv(cube_points[6]); glVertex3fv(cube_points[7]); glEnd(); /* 下 */ glBegin( GL_QUADS ); mySetMaterial( 1.0, 1.0, 0.0); glNormal3fv(normals[5]); glVertex3fv(cube_points[0]); glVertex3fv(cube_points[1]); glVertex3fv(cube_points[2]); glVertex3fv(cube_points[3]); glEnd(); glPopMatrix(); glDisable( GL_LIGHTING ); glDisable( GL_DEPTH_TEST ); // 陰面処理の適用 }
static void draw( void ) { static int before_visible[2] = {0, 0}; static int Wire_count = -1; // 出力する Wire の選択(0〜4) static int flag_first1 = 0; // 一度でも hiro が見つかったら立つ int i; static double begin[3]; double wtrans[3][4]; double gl_para[16]; /* 3Dオブジェクトを描画するための準備 */ argDrawMode3D(); argDraw3dCamera(0, 0); /* Zバッファなどの設定 */ glClear( GL_DEPTH_BUFFER_BIT ); // 陰面処理の設定 glEnable( GL_DEPTH_TEST ); // 陰面処理の適用 mySetLight(); // 光源の設定 glEnable( GL_LIGHTING ); // 光源の適用 /* マーカの出現と消失の処理 */ /* マーカ1の処理 */ if( myCheck_appear(before_visible[PTT1_MARK_ID], object[PTT1_MARK_ID].visible) ){ begin[0] = object[PTT1_MARK_ID].patt_trans[0][3]; begin[1] = object[PTT1_MARK_ID].patt_trans[1][3]; begin[2] = object[PTT1_MARK_ID].patt_trans[2][3]; points[L_P_count].flag_after_change = 0; } if( myCheck_disappear(before_visible[PTT1_MARK_ID], object[PTT1_MARK_ID].visible) ){ myCopyTrans( object[PTT1_MARK_ID].patt_trans, points[L_P_count].trans); points[L_P_count].start_point[0] = begin[0] - object[PTT1_MARK_ID].patt_trans[0][3]; points[L_P_count].start_point[1] = -( begin[1] - object[PTT1_MARK_ID].patt_trans[1][3] ); // Y軸はカメラに対して反転しているので points[L_P_count].start_point[2] = -( begin[2] - object[PTT1_MARK_ID].patt_trans[2][3] ); // Z軸はカメラに対して反転しているので for(i=0; i<3; i++){ points[L_P_count].end_point[i] = 0.0; } myMoveBallInit( &points[L_P_count] ); L_P_count++; if(MAX_LINES <= L_P_count){ L_P_count = 0; } } /* マーカ2の出現と消失 */ if( myCheck_appear(before_visible[PTT2_MARK_ID], object[PTT2_MARK_ID].visible) ){ for(i=0; i < L_P_count; i++){ arUtilMatMul( itrans2, points[i].trans, wtrans); myCopyTrans( wtrans, points[i].trans); points[i].flag_after_change = 1; } } if( myCheck_disappear(before_visible[PTT2_MARK_ID], object[PTT2_MARK_ID].visible) ){ for(i=0; i < L_P_count; i++){ arUtilMatMul( object[PTT2_MARK_ID].patt_trans, points[i].trans, wtrans); myCopyTrans( wtrans, points[i].trans ); } } /* 3Dオブジェクトの描画 */ /* 過去に描いた線分の描画 */ if(flag_first1 && L_P_count >= 1 && !(object[PTT2_MARK_ID].visible) ){ mySelectColor( 1.0, 0.0, 0.0); // 材質特性の設定 glLineWidth( 5.0); for(i=0; i < L_P_count; i++){ glPushMatrix(); // 念のため myMatrix( points[i].trans); myLineLoop(i, i+1); glPopMatrix(); // 念のため } } /* マーカ1(Hiro) が映ったときの処理 */ if(object[PTT1_MARK_ID].visible){ flag_first1 = 1; /* 現在書いている線分の描画 */ myMatrix(object[PTT1_MARK_ID].patt_trans); mySelectColor( 1.0, 0.8, 0.0); // 材質特性の設定 glLineWidth( 5.0); glBegin( GL_LINES ); glVertex3f( begin[0] - object[PTT1_MARK_ID].patt_trans[0][3], -( begin[1] - object[PTT1_MARK_ID].patt_trans[1][3] ), -( begin[2] - object[PTT1_MARK_ID].patt_trans[2][3] ) ); glVertex3f( 0.0, 0.0, 0.0 ); glEnd(); /* hiro のマーカを縁取り */ myMatrix(object[PTT1_MARK_ID].patt_trans); mySelectColor( 0.0, 0.0, 1.0); // 材質特性の設定 glLineWidth( 3.0); myMarkSquare (PTT1_MARK_ID); } /* マーカ2(kanji) が表示されているとき */ if(object[PTT2_MARK_ID].visible){ /* マーカ2の縁取り */ myMatrix(object[PTT2_MARK_ID].patt_trans); mySelectColor( 0.0, 1.0, 0.0); // 材質特性の設定 glLineWidth( 3.0); myMarkSquare (PTT2_MARK_ID); /* 座標変換 */ glLineWidth( 5.0); for(i=0; i < L_P_count; i++){ glPushMatrix(); mySelectColor( 0.0, 0.0, 1.0); // 材質特性の設定 argConvGlpara( points[i].trans, gl_para ); glMultMatrixd( gl_para ); myLineLoop(i, i+1); if( flag_animation){ myMoveBall( &points[i] ); } else{ myMoveBall2( &points[i], i ); } glPopMatrix(); } } visible_log(PTT_NUM, before_visible); // 各マーカの visible 状態の記録 glDisable( GL_LIGHTING ); // 光源の無効化 glDisable( GL_DEPTH_TEST ); // 陰面処理の無効化 }