main.cpp

Go to the documentation of this file.
00001 
00002 
00003 
00023 #include <stdlib.h>
00024 #include <iostream>
00025 #include <GL/glut.h>
00026 #include <cmath>
00027 #include <string>
00028 #include <errno.h>
00029 #include <string>
00030 #include <GL/glext.h>
00031 #include <stdio.h>
00032 
00033 #include <vector>
00034 using namespace std;
00035 #define PI 3.14159
00036 
00037 
00038 #include <Skinned.h>
00039 #include <Skeleton.h>
00040 #include <File_parser.h>
00041 
00042 #include <Mesh_object.h>
00043 #include <Mesh_object_loader.h>
00044 #include <OpenGL_drawer.h>
00045 #include <Navigator_tool.h>
00046 
00047 
00048 
00049 
00050 //glut functions
00051 static void display_callback();
00052 static void reshape_callback (int width, int height);
00053 static void keyboard_callback(unsigned char key,int x,int y);
00054 static void idle_callback(int value);
00055 static void motion_callback (int x, int y);
00056 static void mouse_callback (int button, int action, int x, int y);
00057 
00058 
00059 //main functions
00060 int setup_opengl(int argc,char **argv);
00061 int draw_scene(); //draw the model
00062 int load_model_1(),load_model_2(),load_model_3(); //load the model
00063 double get_rand();//just a rand
00064 int evolve();
00065 
00066 
00067 //GLOBAL VARIABLES
00068 //************************************//
00069 OpenGL_drawer openGL_drawer;
00070 Navigator_tool navigator;
00071 
00072 
00073 Mesh_object mesh,mesh2;
00074 int counter=0;
00075 
00076 
00077 Skeleton skeleton,deformed_skeleton;
00078 Mesh_object deformed_mesh;
00079 Skinned skinned;
00080 
00081 int is_draw_grid=0;
00082 int is_draw_skeleton=0;
00083 
00084 
00085 int main(int argc, char *argv[])
00086 {
00087   cout<<"**hello**\n"<<endl;
00088   printf("run %s with %d parameters ... \n\n",argv[0],argc-1);
00089 
00090 
00091   //start OpenGL
00092   //*************//
00093   navigator.set_screen_size(800,800);
00094   setup_opengl(argc,argv);
00095 
00096 
00097 
00098   //load  models
00099   //*************//
00100   load_model_1();
00101   //load_model_2();
00102   //load_model_3();
00103 
00104 
00105 
00106 
00107   //run
00108   printf("**RUN**\n\n");
00109   printf("Navigation with keys:\n\n");
00110   printf("==========================\n");
00111   printf("Space Displacement\n");
00112   printf("  w    r\n");
00113   printf("a s d  f\n\n");
00114   printf("and mouse with drag & drop\n\n");
00115   printf("W: wireframe mode\n");
00116   printf("F: filled mode\n");
00117   printf("G: Grid mode\n");
00118   printf("S: Skeleton\n");
00119   printf("==========================\n");
00120   glutMainLoop ();
00121 
00122 
00123   return 0;
00124 }
00125 
00126 
00127 
00128 
00129 
00130 
00131 
00132 
00133 
00134 
00135 
00136 //Draw the scene
00137 int draw_scene()
00138 {
00139 
00140   glEnable(GL_LIGHTING);
00141 
00142   //current position in space
00143   V_3D position = -1*navigator.get_current_position();
00144 
00145   glEnable(GL_POLYGON_OFFSET_FILL);
00146   glPolygonOffset(1.0,1.0);
00147   glLineWidth(2.0);
00148   openGL_drawer.draw_mesh_slow(deformed_mesh);
00149   glDisable(GL_POLYGON_OFFSET_FILL);
00150 
00151   glColor4d(0.0,0.0,0.4,1.0);
00152   glLineWidth(1.5);
00153   if(is_draw_grid==1)
00154     openGL_drawer.draw_mesh_grid(deformed_mesh);
00155 
00156   if(is_draw_skeleton==1)
00157     openGL_drawer.draw_skeleton(deformed_skeleton);
00158   glLineWidth(1.0);
00159   return 0;
00160 }
00161 
00162 
00163 
00164 
00165 
00166 //load the model
00167 int load_model_1()
00168 {
00169 
00170   //*********************************//
00171   //LOAD MESH
00172   //*********************************//
00173   mesh.load_obj_file("data/man.obj");
00174 
00175 
00176   //*********************************//
00177   //LOAD TEXTURE
00178   //*********************************//
00179 
00180   Mesh_object_loader loader;
00181   mesh.load_obj_file("data/man.obj");
00182 
00183 
00184 
00185   //*********************************//
00186   //SUBDIVISION
00187   //*********************************//
00188 
00189   int N_subdiv=1;
00190   for(int k=0;k<N_subdiv;k++)
00191     {
00192       mesh.fast_subdivide_mixed_mid_edge();
00193 
00194       // lissage
00195       for(int k=0;k<4;k++)
00196         mesh.Laplacien_smooth(0.25);
00197     }
00198 
00199 
00200   // couleur
00201   mesh.fill_color(0.9,0.9,0.9,1.0);
00202   mesh.build_normal_per_vertex();
00203 
00204 
00205 
00206 
00207   deformed_mesh=mesh;
00208 
00209 
00210   
00211 
00212 
00213 
00214   //*********************************//
00215   //LOAD SKELETON
00216   //*********************************//
00217 
00218   File_parser parser;
00219   parser.load_collada_skeleton("data/skeleton_man_by_hand.dae","0",&skeleton);
00220   skeleton.scale(10);
00221 
00222   skeleton.fix_init_bind_pose();
00223   skeleton.read_skeleton();
00224   skeleton.precalculate_matrix();
00225 
00226   deformed_skeleton=skeleton;
00227 
00228 
00229   //*********************************//
00230   //INIT SKINNING
00231   //*********************************//
00232 
00233   skinned.set_mesh(&mesh);
00234   skinned.set_deformed_mesh(&deformed_mesh);
00235   skinned.set_skeleton(&skeleton);
00236 
00237   //*********************************//
00238   // LOAD SKINNING ATTRIBUTE
00239   //*********************************//
00240 
00241   skinned.automatic_weight_calculation();
00242 
00243 
00244 
00245   //*********************************//
00246   // SET SKELETON ANIMATION
00247   //*********************************//
00248                                                         
00249   int k_bone=0;
00250   for(k_bone=0;k_bone<skeleton.get_N_joint();k_bone++)
00251     {
00252       skeleton.set_size_time(k_bone,3);
00253       skeleton.set_time(k_bone,0,0.0);
00254       skeleton.set_time(k_bone,1,0.5);
00255       skeleton.set_time(k_bone,2,1.0);
00256       skeleton.set_angle(k_bone,0,0,0.0);
00257       skeleton.set_angle(k_bone,1,0,0.0);
00258       skeleton.set_angle(k_bone,2,0,0.0);
00259     }
00260 
00261 
00262   k_bone=3;
00263   skeleton.set_angle(k_bone,0,0,-40.0);
00264   skeleton.set_angle(k_bone,1,0,+10.0);
00265   skeleton.set_angle(k_bone,2,0,-40.0);
00266 
00267   k_bone=1;
00268   skeleton.set_angle(k_bone,0,0,-60.0);
00269   skeleton.set_angle(k_bone,1,0,15.0);
00270   skeleton.set_angle(k_bone,2,0,-60.0);
00271 
00272   k_bone=8;
00273   skeleton.set_angle(k_bone,0,1,-35.0);
00274   skeleton.set_angle(k_bone,1,1,40.0);
00275   skeleton.set_angle(k_bone,2,1,-35.0);
00276 
00277   k_bone=13;
00278   skeleton.set_angle(k_bone,0,0,-25.0);
00279   skeleton.set_angle(k_bone,1,0,15.0);
00280   skeleton.set_angle(k_bone,2,0,-25.0);
00281 
00282   k_bone=14;
00283   skeleton.set_angle(k_bone,0,0,-15.0);
00284   skeleton.set_angle(k_bone,1,0,19.0);
00285   skeleton.set_angle(k_bone,2,0,-15.0);
00286 
00287 
00288 
00289 
00290 
00291   //*********************************//
00292   // DEFORM IT
00293   //*********************************//
00294 
00295   skeleton.deform_skeleton(0.0,&deformed_skeleton);
00296   skinned.set_deformed_skeleton(&deformed_skeleton);
00297 
00298 
00299   skinned.skinning();
00300 
00301 
00302 
00303   return 0;
00304 }
00305 
00306 
00307 
00308 
00309 //load the model
00310 int load_model_2()
00311 {
00312 
00313   //*********************************//
00314   //LOAD MESH
00315   //*********************************//
00316   char filename[]="data/collada_man.dae";
00317   mesh.load_collada_file(filename);
00318 
00319   //*********************************//
00320   //LOAD TEXTURE
00321   //*********************************//
00322 
00323   Mesh_object_loader loader;
00324   loader.load_collada_texture(filename,&mesh,"MAN_BODYShape","MAN_BODYShape-TexCoord0");
00325   mesh.set_texture_number(openGL_drawer.load_texture("data/MAN_BOD.jpg"));
00326 
00327   mesh.fill_color(0.9,0.9,0.9,1.0);
00328   mesh.build_normal_per_vertex();
00329 
00330 
00331 
00332 
00333   deformed_mesh=mesh;
00334 
00335 
00336   
00337 
00338 
00339 
00340   //*********************************//
00341   //LOAD SKELETON
00342   //*********************************//
00343 
00344   File_parser parser;
00345   parser.load_collada_skeleton(filename,"AVATAR",&skeleton);
00346 
00347   skeleton.fix_init_bind_pose();
00348   skeleton.read_skeleton();
00349   skeleton.precalculate_matrix();
00350 
00351   deformed_skeleton=skeleton;
00352 
00353 
00354   //*********************************//
00355   //INIT SKINNING
00356   //*********************************//
00357 
00358   skinned.set_mesh(&mesh);
00359   skinned.set_deformed_mesh(&deformed_mesh);
00360   skinned.set_skeleton(&skeleton);
00361 
00362   //*********************************//
00363   // LOAD SKINNING ATTRIBUTE
00364   //*********************************//
00365 
00366   parser.load_collada_skining_attribute(filename,&skinned);
00367 
00368 
00369 
00370   //*********************************//
00371   // SET SKELETON ANIMATION
00372   //*********************************//
00373                                                         
00374   int k_bone=0;
00375   for(k_bone=0;k_bone<skeleton.get_N_joint();k_bone++)
00376     {
00377       skeleton.set_size_time(k_bone,3);
00378       skeleton.set_time(k_bone,0,0.0);
00379       skeleton.set_time(k_bone,1,0.5);
00380       skeleton.set_time(k_bone,2,1.0);
00381       skeleton.set_angle(k_bone,0,0,0.0);
00382       skeleton.set_angle(k_bone,1,0,0.0);
00383       skeleton.set_angle(k_bone,2,0,0.0);
00384     }
00385 
00386 
00387   k_bone=4;
00388   skeleton.set_angle(k_bone,0,0,-65.0);
00389   skeleton.set_angle(k_bone,1,0,69.0);
00390   skeleton.set_angle(k_bone,2,0,-65.0);
00391 
00392   k_bone=62;
00393   skeleton.set_angle(k_bone,0,0,-25.0);
00394   skeleton.set_angle(k_bone,1,0,0.0);
00395   skeleton.set_angle(k_bone,2,0,-25.0);
00396 
00397   k_bone=63;
00398   skeleton.set_angle(k_bone,0,0,35.0);
00399   skeleton.set_angle(k_bone,1,0,0.0);
00400   skeleton.set_angle(k_bone,2,0,35.0);
00401 
00402   k_bone=35;
00403   skeleton.set_angle(k_bone,0,1,-35.0);
00404   skeleton.set_angle(k_bone,1,1,0.0);
00405   skeleton.set_angle(k_bone,2,1,-35.0);
00406 
00407 
00408 
00409   //*********************************//
00410   // DEFORM IT
00411   //*********************************//
00412 
00413   skeleton.deform_skeleton(0.0,&deformed_skeleton);
00414   skinned.set_deformed_skeleton(&deformed_skeleton);
00415 
00416 
00417   skinned.skinning();
00418 
00419 
00420 
00421   return 0;
00422 }
00423 
00424 int load_model_3()
00425 {
00426 
00427   //*********************************//
00428   //LOAD MESH
00429   //*********************************//
00430 
00431 
00432   char filename[]="data/collada_woman.dae";
00433   //char filename[]="data/collada_man.dae";
00434   mesh.load_collada_file(filename);
00435 
00436 
00437 
00438 
00439   //*********************************//
00440   //LOAD TEXTURE
00441   //*********************************//
00442 
00443   Mesh_object_loader loader;
00444   loader.load_collada_texture(filename,&mesh,"WOMAN_BODYShape","WOMAN_BODYShape-TexCoord0");  
00445   //loader.load_collada_texture(filename,&mesh,"MAN_BODYShape","MAN_BODYShape-TexCoord0");
00446 
00447 
00448 
00449   
00450   mesh.set_texture_number(openGL_drawer.load_texture("data/WOMAN_BOD.jpg"));
00451   //mesh.set_texture_number(openGL_drawer.load_texture("data/MAN_BOD.jpg"));
00452 
00453 
00454   mesh.fill_color(0.9,0.9,0.9,1.0);
00455   mesh.build_normal_per_vertex();
00456 
00457 
00458 
00459 
00460   deformed_mesh=mesh;
00461 
00462 
00463   
00464 
00465 
00466 
00467   //*********************************//
00468   //LOAD SKELETON
00469   //*********************************//
00470 
00471   File_parser parser;
00472   parser.load_collada_skeleton(filename,"AVATAR",&skeleton);
00473 
00474   skeleton.fix_init_bind_pose();
00475   skeleton.read_skeleton();
00476   skeleton.precalculate_matrix();
00477 
00478   deformed_skeleton=skeleton;
00479 
00480 
00481   //*********************************//
00482   //INIT SKINNING
00483   //*********************************//
00484 
00485   skinned.set_mesh(&mesh);
00486   skinned.set_deformed_mesh(&deformed_mesh);
00487   skinned.set_skeleton(&skeleton);
00488 
00489   //*********************************//
00490   // LOAD SKINNING ATTRIBUTE
00491   //*********************************//
00492 
00493   parser.load_collada_skining_attribute(filename,&skinned);
00494 
00495 
00496 
00497   //*********************************//
00498   // SET SKELETON ANIMATION
00499   //*********************************//
00500                                                         
00501   int k_bone=0;
00502   for(k_bone=0;k_bone<skeleton.get_N_joint();k_bone++)
00503     {
00504       skeleton.set_size_time(k_bone,3);
00505       skeleton.set_time(k_bone,0,0.0);
00506       skeleton.set_time(k_bone,1,0.5);
00507       skeleton.set_time(k_bone,2,1.0);
00508       skeleton.set_angle(k_bone,0,0,0.0);
00509       skeleton.set_angle(k_bone,1,0,0.0);
00510       skeleton.set_angle(k_bone,2,0,0.0);
00511     }
00512 
00513 
00514 
00515 
00516   k_bone=4;
00517   skeleton.set_angle(k_bone,0,0,-65.0);
00518   skeleton.set_angle(k_bone,1,0,69.0);
00519   skeleton.set_angle(k_bone,2,0,-65.0);
00520 
00521   k_bone=62;
00522   skeleton.set_angle(k_bone,0,0,-25.0);
00523   skeleton.set_angle(k_bone,1,0,0.0);
00524   skeleton.set_angle(k_bone,2,0,-25.0);
00525 
00526   k_bone=63;
00527   skeleton.set_angle(k_bone,0,0,35.0);
00528   skeleton.set_angle(k_bone,1,0,0.0);
00529   skeleton.set_angle(k_bone,2,0,35.0);
00530 
00531   k_bone=35;
00532   skeleton.set_angle(k_bone,0,1,-35.0);
00533   skeleton.set_angle(k_bone,1,1,0.0);
00534   skeleton.set_angle(k_bone,2,1,-35.0);
00535 
00536 
00537 
00538   //*********************************//
00539   // DEFORM IT
00540   //*********************************//
00541 
00542   skeleton.deform_skeleton(0.0,&deformed_skeleton);
00543   skinned.set_deformed_skeleton(&deformed_skeleton);
00544 
00545 
00546   skinned.skinning();
00547 
00548 
00549 
00550   return 0;
00551 }
00552 
00553 
00554 
00555 
00556 
00557 int evolve()
00558 {
00559   double t=(double(counter%150)/150.0);
00560 
00561   //deformed_mesh.build_normal_per_vertex();
00562 
00563   deformed_skeleton=skeleton;
00564   skeleton.deform_skeleton(t,&deformed_skeleton);
00565   skinned.skinning();
00566   
00567   //deformed_mesh.build_normal_per_polygon();
00568 
00569 
00570 
00571   return 0;
00572 }
00573 
00574 
00575 
00576 
00577 //*******************//
00578 //GLUT STUFF
00579 //*******************//
00580 
00581 
00582 
00583 
00584 
00585 
00586 
00587 
00588 //glut functions
00589 int setup_opengl(int argc,char **argv)
00590 {
00591   openGL_drawer.init_opengl(argc,argv,navigator);
00592 
00593   //callback
00594   glutDisplayFunc (display_callback);
00595   glutReshapeFunc (reshape_callback);
00596   glutKeyboardFunc(keyboard_callback);
00597   glutTimerFunc(33,idle_callback,1);
00598   glutMotionFunc (motion_callback);
00599   glutMouseFunc (mouse_callback);
00600 
00601   return 0;
00602 }
00603 
00604 
00605 
00606 //display
00607 static void display_callback()
00608 {
00609   //croping
00610   double Z_MIN = 1;
00611   double Z_MAX = 900;
00612 
00613 
00614   //vieport (all screen)
00615   glViewport (0, 0, navigator.get_X_screen(),navigator.get_Y_screen());
00616   glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
00617 
00618   //Projection
00619   glMatrixMode(GL_PROJECTION);
00620   glLoadIdentity ();
00621   gluPerspective (45, navigator.get_screen_ratio(), Z_MIN,Z_MAX);
00622 
00623   //Modelview
00624   glMatrixMode(GL_MODELVIEW);
00625   glLoadIdentity();
00626 
00627   glTranslatef(0,0,navigator.get_dist_obs());
00628   glRotatef(navigator.get_theta_1(),1.0,0.0,0.0);
00629   glRotatef(navigator.get_theta_2(),0.0,1.0,0.0);
00630   glTranslatef(navigator.get_tr_x(),navigator.get_tr_y(),navigator.get_tr_z());
00631 
00632   //printf("%f,(%f,%f)-[%f,%f,%f]\n",navigator.get_dist_obs(),navigator.get_theta_1(),navigator.get_theta_2(),navigator.get_tr_x(),navigator.get_tr_y(),navigator.get_tr_z());
00633 
00634 
00635 //   glTranslatef(0,0,-1.336);
00636 //   glRotatef(11.0,1.0,0.0,0.0);
00637 //   glRotatef(-140.0,0.0,1.0,0.0);
00638 //   glTranslatef(0.0,0.0,0.0);
00639 
00640 
00641   //Draw the scene
00642   draw_scene();
00643 
00644   //draw the basis
00645   //openGL_drawer.draw_local_basis(navigator);
00646 
00647 
00648 
00649 
00650   //code d'erreur OpenGL
00651   GLenum errCode;
00652   const GLubyte *errString;
00653   if((errCode=glGetError()) != GL_NO_ERROR)
00654     {
00655       errString = gluErrorString(errCode);
00656       printf("ERROR OPENGL : %s\n",errString);
00657       exit(-2);
00658     }
00659 
00660   //redraw
00661   glFlush ();
00662   glutSwapBuffers ();
00663 
00664 }
00665 
00666 
00667 static void reshape_callback (int width, int height)
00668 {
00669   navigator.set_screen_size(width,height);
00670 }
00671 
00672 
00673 //keyboard
00674 static void keyboard_callback(unsigned char key,int x,int y)
00675 {
00676 
00677   x=0;y=0;
00678   double d_L=0.001*(1+100*abs(navigator.get_dist_obs()));
00679 
00680   #define GLUT_SPACE 32
00681 
00682 
00683   switch(key)
00684     {
00685     case 'Q'://quit
00686       printf("\n[EXIT OK]\n\n");
00687       exit(0);
00688       break;
00689 
00690 
00691     case 'w':
00692       navigator.go_forward(d_L);
00693       break;
00694     case 's':
00695       navigator.go_backward(d_L);
00696       break;
00697     case 'a':
00698       navigator.go_left(d_L);
00699       break;
00700     case 'd':
00701       navigator.go_right(d_L);
00702       break;
00703     case 'r':
00704       navigator.go_up(d_L);
00705       break;
00706     case 'f':
00707       navigator.go_down(d_L);
00708       break;
00709 
00710     case 'G':
00711       is_draw_grid==1?is_draw_grid=0:is_draw_grid=1;
00712       break;
00713     case 'S':
00714       is_draw_skeleton==1?is_draw_skeleton=0:is_draw_skeleton=1;
00715       break;
00716 
00717     case 'W'://wireframe
00718       glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
00719       break;
00720     case 'F'://Filled
00721       glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
00722       break;
00723     }
00724 
00725   glutPostRedisplay ();
00726 }
00727 
00728 
00729 static void idle_callback(int value)
00730 {
00731   value=1;//useless
00732 
00733   navigator.increase_time();
00734   glutPostRedisplay ();
00735   glutTimerFunc( 33, idle_callback, 1);
00736   counter++;
00737 
00738   evolve();
00739 }
00740 
00741 
00742 
00743 static void motion_callback (int x, int y)
00744 {
00745   /* si le bouton gauche est presse */
00746   double d_x=x-navigator.get_x_prec(),d_y=y-navigator.get_y_prec();
00747   if (navigator.get_left_b()) 
00748     {
00749       if(navigator.get_current_view()==1)
00750         {
00751           navigator.increase_theta_2(d_x);
00752           navigator.increase_theta_1(d_y);
00753         }
00754       navigator.set_x_prec(x);
00755       navigator.set_y_prec(y);
00756     }
00757 
00758   /* si le bouton droit est presse */
00759   if (navigator.get_right_b()) 
00760     {
00761       double u = double(y-navigator.get_y_prec());
00762       double fu = abs(u)/500.0;
00763       if(u<0)
00764         fu=-fu;
00765       
00766       navigator.increase_dist_obs(fu);
00767       navigator.set_y_prec(y);
00768     }
00769 
00770   glutPostRedisplay ();
00771 }
00772 static void mouse_callback (int button, int action, int x, int y)
00773 {
00774 
00775   if (button == GLUT_LEFT_BUTTON && action == GLUT_DOWN) {
00776     navigator.set_left_b(1);
00777     navigator.set_x_prec(x); 
00778     navigator.set_y_prec(y);
00779   }
00780   if (button == GLUT_LEFT_BUTTON && action == GLUT_UP) 
00781     navigator.set_left_b(0); 
00782 
00783   if (button == GLUT_RIGHT_BUTTON && action == GLUT_DOWN) {
00784     navigator.set_right_b(1);
00785     navigator.set_y_prec(y);
00786   }
00787   if (button == GLUT_RIGHT_BUTTON && action == GLUT_UP) 
00788     navigator.set_right_b(0); 
00789 
00790   glutPostRedisplay ();
00791 }
00792 
00793 //just a rand number \in [0,1]
00794 double get_rand()
00795 {
00796   int precision=50000;
00797   return double(rand()%precision)/double(precision);
00798 }
00799 
00800 
00801 

Generated on Mon Mar 30 16:55:54 2009 by  doxygen 1.5.6