【ARToolkit】第二個例項simple2
我們這次分析ARtooklit裡面的simple2這個程式,我們先上原始碼,隨後分析一些不同於simpletest的地方
#ifdef _WIN32 #include <windows.h> #endif #include <stdio.h> #include <stdlib.h> #ifndef __APPLE__ #include <GL/gl.h> #include <GL/glut.h> #else #include <OpenGL/gl.h> #include <GLUT/glut.h> #endif #include <AR/gsub.h> #include <AR/video.h> #include <AR/param.h> #include <AR/ar.h>
/* set up the video format globals */
#ifdef _WIN32 char *vconf = "Data\\WDM_camera_flipV.xml"; #else char *vconf = ""; #endif
int xsize, ysize; int thresh = 100; int count = 0;
int mode = 1;//標識位
char *cparam_name = "Data/camera_para.dat"; ARParam cparam;
char *patt_name = "Data/patt.hiro"; int patt_id; int patt_width = 80.0; double patt_center[2] = {0.0, 0.0}; double patt_trans[3][4];
static void init(void); static void cleanup(void); static void keyEvent( unsigned char key, int x, int y); static void mainLoop(void); static void draw( double trans[3][4] );
int main(int argc, char **argv) { glutInit(&argc, argv); init();
arVideoCapStart(); argMainLoop( NULL, keyEvent, mainLoop ); return (0); }
static void keyEvent( unsigned char key, int x, int y) { /* quit if the ESC key is pressed */ if( key == 0x1b ) { printf("*** %f (frame/sec)\n", (double)count/arUtilTimer()); cleanup(); exit(0); } //如果鍵盤輸入c if( key == 'c' ) { printf("*** %f (frame/sec)\n", (double)count/arUtilTimer()); count = 0;
mode = 1 - mode;//讓每次鍵盤輸入c都讓mode變化 //此處mode轉換為布林型,如果mode=0,則為假arGetTransMatCont if( mode ) printf("Continuous mode: Using arGetTransMatCont.\n"); //如果mode不為假,輸出arGetTransMat else printf("One shot mode: Using arGetTransMat.\n"); } }
/* main loop */ static void mainLoop(void) { static int contF = 0;//靜態變數 ARUint8 *dataPtr; ARMarkerInfo *marker_info; int marker_num; int j, k;
/* grab a vide frame */ if( (dataPtr = (ARUint8 *)arVideoGetImage()) == NULL ) { arUtilSleep(2); return; } if( count == 0 ) arUtilTimerReset(); count++;
argDrawMode2D(); argDispImage( dataPtr, 0,0 );
/* detect the markers in the video frame */ if( arDetectMarker(dataPtr, thresh, &marker_info, &marker_num) < 0 ) { cleanup(); exit(0); }
arVideoCapNext();
/* check for object visibility */ k = -1; for( j = 0; j < marker_num; j++ ) { if( patt_id == marker_info[j].id ) { if( k == -1 ) k = j; else if( marker_info[k].cf < marker_info[j].cf ) k = j; } } if( k == -1 ) { contF = 0; argSwapBuffers(); return; }
/*計算攝像頭的轉移矩陣,標識卡和攝像機之間的轉移資訊通過使用函式*/ //mode為0 if( mode == 0 || contF == 0 ) { arGetTransMat(&marker_info[k], patt_center, patt_width, patt_trans); } else { //mode為1 arGetTransMatCont(&marker_info[k], patt_trans, patt_center, patt_width, patt_trans); } contF = 1;
draw( patt_trans );
argSwapBuffers(); }
static void init( void ) { ARParam wparam;
/* open the video path */ if( arVideoOpen( vconf ) < 0 ) exit(0); /* find the size of the window */ if( arVideoInqSize(&xsize, &ysize) < 0 ) exit(0); printf("Image size (x,y) = (%d,%d)\n", xsize, ysize);
/* set the initial camera parameters */ if( arParamLoad(cparam_name, 1, &wparam) < 0 ) { printf("Camera parameter load error !!\n"); exit(0); } arParamChangeSize( &wparam, xsize, ysize, &cparam ); arInitCparam( &cparam ); printf("*** Camera Parameter ***\n"); arParamDisp( &cparam );
if( (patt_id=arLoadPatt(patt_name)) < 0 ) { printf("pattern load error !!\n"); exit(0); }
/* open the graphics window */ argInit( &cparam, 1.0, 0, 0, 0, 0 ); }
/* cleanup function called when program exits */ static void cleanup(void) { arVideoCapStop(); arVideoClose(); argCleanup(); }
static void draw( double trans[3][4] ) { double gl_para[16]; GLfloat mat_ambient[] = {0.0, 0.0, 1.0, 1.0}; GLfloat mat_flash[] = {0.0, 0.0, 1.0, 1.0}; GLfloat mat_flash_shiny[] = {50.0}; GLfloat light_position[] = {100.0,-200.0,200.0,0.0}; GLfloat ambi[] = {0.1, 0.1, 0.1, 0.1}; GLfloat lightZeroColor[] = {0.9, 0.9, 0.9, 0.1}; argDrawMode3D(); argDraw3dCamera( 0, 0 ); glClearDepth( 1.0 ); glClear(GL_DEPTH_BUFFER_BIT); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); /* load the camera transformation matrix */ argConvGlpara(trans, gl_para); glMatrixMode(GL_MODELVIEW); glLoadMatrixd( gl_para );
glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glLightfv(GL_LIGHT0, GL_POSITION, light_position); glLightfv(GL_LIGHT0, GL_AMBIENT, ambi); glLightfv(GL_LIGHT0, GL_DIFFUSE, lightZeroColor); glMaterialfv(GL_FRONT, GL_SPECULAR, mat_flash); glMaterialfv(GL_FRONT, GL_SHININESS, mat_flash_shiny); glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient); glMatrixMode(GL_MODELVIEW); glTranslatef( 0.0, 0.0, 25.0 ); glutSolidCube(50.0); glDisable( GL_LIGHTING );
glDisable( GL_DEPTH_TEST ); }