void linking(void) { switch( get_linker() ) { case OPT_VALX: valx(); break; case OPT_TLINK: tlink(); break; case OPT_LINK: link(); break; case OPT_WLINK: wlink(); break; case OPT_OLINK: olink(); break; default: fprintf( stderr, "Unknown linker, use VALX...\n"); valx(); break; } if ( !get_option(OPT_KEEPGEN) ) del_obj_tmpfiles(); }
// this function is called each frame void glutDisplay (void) { if(gScene == NULL) return; gScene->simulate(1.0f/30.0f); glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); // 射影マトリックス glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(100.0f, (float)glutGet(GLUT_WINDOW_WIDTH)/(float)glutGet(GLUT_WINDOW_HEIGHT), 1.0f, 10000.0f); // 視点の位置 glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(gEye.x, gEye.y, gEye.z, gEye.x + gDir.x, gEye.y + gDir.y, gEye.z + gDir.z, 0.0f, 1.0f, 0.0f); xn::SceneMetaData sceneMD; xn::DepthMetaData depthMD; g_DepthGenerator.GetMetaData(depthMD); if (!g_bPause) { // Read next available data g_Context.WaitAndUpdateAll(); } for(int i=0;i<2;i++){ for(int j=0;j<15;j++){ oldjpoint[i][j]=jpoint[i][j]; } } // Process the data g_DepthGenerator.GetMetaData(depthMD); g_UserGenerator.GetUserPixels(0, sceneMD); CalculateJoint(); head.x=(jpoint[0][0].X); head.y=(jpoint[0][0].Y); head.z=(jpoint[0][0].Z); neck.x=(jpoint[0][1].X); neck.y=(jpoint[0][1].Y); neck.z=(jpoint[0][1].Z); rshoulder.x=(jpoint[0][2].X); rshoulder.y=(jpoint[0][2].Y); rshoulder.z=(jpoint[0][2].Z); relbow.x=(jpoint[0][3].X*2+oldjpoint[0][3].X)/3; relbow.y=(jpoint[0][3].Y*2+oldjpoint[0][3].Y)/3; relbow.z=(jpoint[0][3].Z*2+oldjpoint[0][3].Z)/3; rhand.x=(jpoint[0][4].X*2+oldjpoint[0][4].X)/3; rhand.y=(jpoint[0][4].Y*2+oldjpoint[0][4].Y)/3; rhand.z=(jpoint[0][4].Z*2+oldjpoint[0][4].Z)/3; lshoulder.x=(jpoint[0][5].X*2+oldjpoint[0][5].X)/3; lshoulder.y=(jpoint[0][5].Y*2+oldjpoint[0][5].Y)/3; lshoulder.z=(jpoint[0][5].Z*2+oldjpoint[0][5].Z)/3; lelbow.x=(jpoint[0][6].X*2+oldjpoint[0][6].X)/3; lelbow.y=(jpoint[0][6].Y*2+oldjpoint[0][6].Y)/3; lelbow.z=(jpoint[0][6].Z*2+oldjpoint[0][6].Z)/3; lhand.x=(jpoint[0][7].X*2+oldjpoint[0][7].X)/3; lhand.y=(jpoint[0][7].Y*2+oldjpoint[0][7].Y)/3; lhand.z=(jpoint[0][7].Z*2+oldjpoint[0][7].Z)/3; torso.x=(jpoint[0][8].X*2+oldjpoint[0][8].X)/3; torso.y=(jpoint[0][8].Y*2+oldjpoint[0][8].Y)/3; torso.z=(jpoint[0][8].Z*2+oldjpoint[0][8].Z)/3; rhip.x=(jpoint[0][9].X*2+oldjpoint[0][9].X)/3; rhip.y=(jpoint[0][9].Y*2+oldjpoint[0][9].Y)/3; rhip.z=(jpoint[0][9].Z*2+oldjpoint[0][9].Z)/3; rknee.x=(jpoint[0][10].X*2+oldjpoint[0][10].X)/3; rknee.y=(jpoint[0][10].Y*2+oldjpoint[0][10].Y)/3; rknee.z=(jpoint[0][10].Z*2+oldjpoint[0][10].Z)/3; rfoot.x=(jpoint[0][11].X*2+oldjpoint[0][11].X)/3; rfoot.y=(jpoint[0][11].Y*2+oldjpoint[0][11].Y)/3; rfoot.z=(jpoint[0][11].Z*2+oldjpoint[0][11].Z)/3; lhip.x=(jpoint[0][12].X*2+oldjpoint[0][12].X)/3; lhip.y=(jpoint[0][12].Y*2+oldjpoint[0][12].Y)/3; lhip.z=(jpoint[0][12].Z*2+oldjpoint[0][12].Z)/3; lknee.x=(jpoint[0][13].X*2+oldjpoint[0][13].X)/3; lknee.y=(jpoint[0][13].Y*2+oldjpoint[0][13].Y)/3; lknee.z=(jpoint[0][13].Z*2+oldjpoint[0][13].Z)/3; lfoot.x=(jpoint[0][14].X*2+oldjpoint[0][14].X)/3; lfoot.y=(jpoint[0][14].Y*2+oldjpoint[0][14].Y)/3; lfoot.z=(jpoint[0][14].Z*2+oldjpoint[0][14].Z)/3; printf("%f, %f, %f\n",rightreduction.x, rightreduction.y, rightreduction.z); printf("%f, %f, %f\n",leftreduction.x, leftreduction.y, leftreduction.z); if(jpoint[0][8].X!=0.0&&jpoint[0][8].Y!=0.0&&jpoint[0][8].Z!=0.0){ Head->setGlobalPosition(NxVec3(-head.x+positionx, -head.y+positiony, -head.z+positionz)); Head->setLinearVelocity(NxVec3(0.0f, 0.0f, 0.0f)); Neck->setGlobalPosition(NxVec3(-neck.x+positionx, -neck.y+positiony, -neck.z+positionz)); Neck->setLinearVelocity(NxVec3(0.0f, 0.0f, 0.0f)); rightshoulder->setGlobalPosition(NxVec3(-rshoulder.x+positionx, -rshoulder.y+positiony, -rshoulder.z+positionz)); rightshoulder->setLinearVelocity(NxVec3(0.0f, 0.0f, 0.0f)); rightelbow->setGlobalPosition(NxVec3(-relbow.x+positionx, -relbow.y+positiony, -relbow.z+positionz)); rightelbow->setLinearVelocity(NxVec3(0.0f, 0.0f, 0.0f)); righthand->setGlobalPosition(NxVec3(-rhand.x+positionx, -rhand.y+positiony, -rhand.z+positionz)); righthand->setLinearVelocity(NxVec3(0.0f, 0.0f, 0.0f)); leftshoulder->setGlobalPosition(NxVec3(-lshoulder.x+positionx, -lshoulder.y+positiony, -lshoulder.z+positionz)); leftshoulder->setLinearVelocity(NxVec3(0.0f, 0.0f, 0.0f)); leftelbow->setGlobalPosition(NxVec3(-lelbow.x+positionx, -lelbow.y+positiony, -lelbow.z+positionz)); leftelbow->setLinearVelocity(NxVec3(0.0f, 0.0f, 0.0f)); lefthand->setGlobalPosition(NxVec3(-lhand.x+positionx, -lhand.y+positiony, -lhand.z+positionz)); lefthand->setLinearVelocity(NxVec3(0.0f, 0.0f, 0.0f)); Torso->setGlobalPosition(NxVec3(-torso.x+positionx, -torso.y+positiony, -torso.z+positionz)); Torso->setLinearVelocity(NxVec3(0.0f, 0.0f, 0.0f)); righthip->setGlobalPosition(NxVec3(-rhip.x+positionx, -rhip.y+positiony, -rhip.z+positionz)); righthip->setLinearVelocity(NxVec3(0.0f, 0.0f, 0.0f)); rightknee->setGlobalPosition(NxVec3(-rknee.x+positionx, -rknee.y+positiony, -rknee.z+positionz)); rightknee->setLinearVelocity(NxVec3(0.0f, 0.0f, 0.0f)); rightfoot->setGlobalPosition(NxVec3(-rfoot.x+positionx, -rfoot.y+positiony, -rfoot.z+positionz)); rightfoot->setLinearVelocity(NxVec3(0.0f, 0.0f, 0.0f)); lefthip->setGlobalPosition(NxVec3(-lhip.x+positionx, -lhip.y+positiony, -lhip.z+positionz)); lefthip->setLinearVelocity(NxVec3(0.0f, 0.0f, 0.0f)); leftknee->setGlobalPosition(NxVec3(-lknee.x+positionx, -lknee.y+positiony, -lknee.z+positionz)); leftknee->setLinearVelocity(NxVec3(0.0f, 0.0f, 0.0f)); leftfoot->setGlobalPosition(NxVec3(-lfoot.x+positionx, -lfoot.y+positiony, -lfoot.z+positionz)); leftfoot->setLinearVelocity(NxVec3(0.0f, 0.0f, 0.0f)); } glPushMatrix(); glBegin(GL_POLYGON); glColor4f(0.2f,1.2f,0.1f,1.0f); // 地面の色 glVertex3f( 10000.0f,-1.0f, 10000.0f); glVertex3f( 10000.0f,-1.0f,-10000.0f); glVertex3f(-10000.0f,-1.0f,-10000.0f); glVertex3f(-10000.0f,-1.0f, 10000.0f); glEnd(); glPopMatrix(); //地平線の描画 glPushMatrix(); glColor4f(1.0f, 1.0f, 1.0f,1.0f); glLineWidth(1); glBegin(GL_LINES); for(int i=-10000; i< 10000; i+=500) { glVertex3f( i , -0.2f,-10000 ); glVertex3f( i , -0.2f, 10000 ); glVertex3f(-10000, -0.2f, i ); glVertex3f( 10000, -0.2f, i ); } glEnd(); glPopMatrix(); switch(gameflag){ case 0: // スタート画面 glViewport( 0, 0, (float)glutGet(GLUT_WINDOW_WIDTH),(float)glutGet(GLUT_WINDOW_HEIGHT) ); glMatrixMode( GL_PROJECTION ); glLoadIdentity(); glOrtho( 0.0f, (float)glutGet(GLUT_WINDOW_WIDTH),(float)glutGet(GLUT_WINDOW_HEIGHT), 0.0f, 0.0f, 1.0f ); glMatrixMode( GL_MODELVIEW ); glLoadIdentity(); glPushMatrix(); glColor3d(1.0, 1.0, 0.0); glRasterPos3d(GL_WIN_SIZE_X/2-80, GL_WIN_SIZE_Y/2, 0.0); drawBitmapString(GLUT_BITMAP_HELVETICA_18,"Push 's' -> START"); glPopMatrix(); printf("Push 's' -> START\n"); break; case 1: // ゲーム終了時 glViewport( 0, 0, (float)glutGet(GLUT_WINDOW_WIDTH),(float)glutGet(GLUT_WINDOW_HEIGHT) ); glMatrixMode( GL_PROJECTION ); glLoadIdentity(); glOrtho( 0.0f, (float)glutGet(GLUT_WINDOW_WIDTH),(float)glutGet(GLUT_WINDOW_HEIGHT), 0.0f, 0.0f, 1.0f ); glMatrixMode( GL_MODELVIEW ); glLoadIdentity(); glPushMatrix(); glColor3d(0.0, 0.0, 1.0); glRasterPos3d(GL_WIN_SIZE_X/2-60, GL_WIN_SIZE_Y/2+20, 0.0); drawBitmapString(GLUT_BITMAP_HELVETICA_18,"GAME OVER"); glPopMatrix(); glPushMatrix(); glColor3d(1.0, 1.0, 0.0); glRasterPos3d(GL_WIN_SIZE_X/2-65, GL_WIN_SIZE_Y/2, 0.0); drawBitmapString(GLUT_BITMAP_HELVETICA_18,gametime); glPopMatrix(); glPushMatrix(); glColor3d(1.0, 0.0, 0.0); glRasterPos3d(GL_WIN_SIZE_X/2-90, GL_WIN_SIZE_Y/2-20, 0.0); drawBitmapString(GLUT_BITMAP_HELVETICA_18,"Push 'r' -> RESTART"); glPopMatrix(); printf("GAME OVER\ntime -> %f\n",(double)(t2 - t1) / CLOCKS_PER_SEC); break; case 2: // ゲーム中の画面 glEnable(GL_DEPTH_TEST); // アクターの描画 int nbActors = gScene->getNbActors(); NxActor** actors = gScene->getActors(); while(nbActors--) { NxActor* actor = *actors++; if(!actor->userData) continue; glPushMatrix(); glEnable(GL_LIGHTING); float glMat[16]; actor->getGlobalPose().getColumnMajor44(glMat); glMultMatrixf(glMat); myData* mydata = (myData*)actor->userData; int shape = mydata->shape; int color = mydata->color; switch(shape){ case 1: glColor4f(0.0f,0.0f,1.0f,1.0f); if(mydata->houkou==0){ link(pole[0], pole[4]); } else if(mydata->houkou==1){ tlink(3000.0,2000.0,6000.0,-3000.0,2000.0,6000.0); tlink(-3000.0,2000.0,4000.0,-3000.0,2000.0,6000.0); } else if(mydata->houkou==2){ ylink(3000.0,2000.0,4000.0,-3000.0,2000.0,4000.0); ylink(3000.0,2000.0,6000.0,-3000.0,2000.0,6000.0); } else if(mydata->houkou==3){ // パネル glColor4f(0.0f,1.0f,1.0f,1.0f); cuboid(mydata->width*2,mydata->length*2, mydata->height*2); } else if(mydata->houkou==4){ } break; case 2: if(mydata->ball == 1){ glColor4f(1.0f,0.0f,0.0f,1.0f); // ボールの色 glutSolidSphere(mydata->size,15,15); } else if(mydata->ball == 0){ glColor4f(1.0f,1.0f,0.0f,1.0f); glutSolidSphere(mydata->size,15,15); } break; case 4: glColor4f(1.0f,0.0f,0.0f,1.0f); cylinder(50, 100, 50); break; } glDisable(GL_LIGHTING); glPopMatrix(); } glDisable(GL_DEPTH_TEST); t2 = clock(); balltimer2 = clock(); btime=(double)(balltimer2 - balltimer1) / CLOCKS_PER_SEC; gtime=(double)(t2 - t1) / CLOCKS_PER_SEC; printf("%f\n",gtime); if(gtime<=10.0){ balldire=2.0; ballspeed=250.0; } else if(gtime<=20.0){ balldire=1.5; ballspeed=300.0; } else if(gtime<=30.0){ balldire=1.0; ballspeed=350.0; } else if(gtime<=40.0){ balldire=0.5; ballspeed=400.0; } break; } // 描画の終了 gScene->flushStream(); gScene->fetchResults(NX_RIGID_BODY_FINISHED, true); glutSwapBuffers(); }