#ifndef __APPLE__ #include #include #else #include #include #endif #include #include #include #include #include #include #include "texturepng.h" class Pattern { private: double patt_width; double patt_center[2]; int patt_id; double patt_trans_kake[3][4]; Texture* tex; public: Pattern() { patt_width = 10.0; patt_center[0] = 0.0; patt_center[1] = 0.0; patt_id = arLoadPatt("patt.head"); tex = new TexturePNG("foo.png"); } void update(ARMarkerInfo* marker_info, int marker_num) { for(int j = 0; j < marker_num; j++) { if( patt_id == marker_info[j].id ) { arGetTransMat(&marker_info[j], patt_center, patt_width, patt_trans_kake); draw(); //else if( marker_info[k].cf < marker_info[j].cf ) k = j; } } } void draw() { double gl_para[16]; argConvGlpara(patt_trans_kake, gl_para); glMatrixMode(GL_MODELVIEW); glLoadMatrixd(gl_para); glTranslatef(0.0, -8.0, 0.0); glBindTexture(GL_TEXTURE_2D, tex->tex()); glBegin(GL_QUADS); glTexCoord2f(0, 1); glVertex3f(-30, -30, 0); glTexCoord2f(0, 0); glVertex3f(-30, 30, 0); glTexCoord2f(1, 0); glVertex3f(30, 30, 0); glTexCoord2f(1, 1); glVertex3f(30, -30, 0); glEnd(); } }; Pattern* patt; static void init() { ARParam wparam; // Open video device. if(arVideoOpen(NULL) < 0) { throw(std::runtime_error("arVideoOpen() failed.")); } // Find the size of the window. int xsize, ysize; if(arVideoInqSize(&xsize, &ysize) < 0) { throw(std::runtime_error("arVideoInqSize() failed.")); } std::cout << "Image size (x, y) = (" << xsize << ", " << ysize << ")" << std::endl; // Set the initial camera parameters. ARParam cparam; if(arParamLoad("camera_para.dat", 1, &wparam) < 0) { throw(std::runtime_error("arParamLoad() failed.")); } arParamChangeSize(&wparam, xsize, ysize, &cparam); arInitCparam(&cparam); std::cout << "*** Camera Parameters ***" << std::endl; arParamDisp(&cparam); // Open the graphics window. argInit(&cparam, 1.0, 0, 0, 0, 0); // Texturing glEnable(GL_TEXTURE_2D); // Blending glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); // Smooth shading glShadeModel(GL_SMOOTH); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); } static void cleanup(void) { arVideoCapStop(); arVideoClose(); argCleanup(); } int count = 0; static void key_event(unsigned char key, int x, int y) { switch(key) { case 0x1b: printf("*** %f (frame/sec)\n", (double)count/arUtilTimer()); cleanup(); exit(0); } } static void main_loop(void) { ARUint8 *dataPtr; if((dataPtr = (ARUint8 *)arVideoGetImage()) == NULL) { arUtilSleep(10); return; } if(count == 0) arUtilTimerReset(); count++; argDrawMode2D(); argDispImage(dataPtr, 0, 0); ARMarkerInfo* marker_info; int marker_num; if(arDetectMarker(dataPtr, 100, &marker_info, &marker_num) < 0) { throw(std::runtime_error("arDetectMarker() failed.")); } argDrawMode3D(); argDraw3dCamera( 0, 0 ); glClearDepth( 1.0 ); glClear(GL_DEPTH_BUFFER_BIT); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); patt->update(marker_info, marker_num); glDisable( GL_DEPTH_TEST ); arVideoCapNext(); argSwapBuffers(); } int main(int argc, char **argv) { try { glutInit(&argc, argv); init(); patt = new Pattern(); arVideoCapStart(); argMainLoop( NULL, key_event, main_loop ); } catch(std::runtime_error e) { cleanup(); std::cerr << "Exception caught: " << e.what() << std::endl; } return 0; }