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
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
00060 int setup_opengl(int argc,char **argv);
00061 int draw_scene();
00062 int load_model_1(),load_model_2(),load_model_3();
00063 double get_rand();
00064 int evolve();
00065
00066
00067
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
00092
00093 navigator.set_screen_size(800,800);
00094 setup_opengl(argc,argv);
00095
00096
00097
00098
00099
00100 load_model_1();
00101
00102
00103
00104
00105
00106
00107
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
00137 int draw_scene()
00138 {
00139
00140 glEnable(GL_LIGHTING);
00141
00142
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
00167 int load_model_1()
00168 {
00169
00170
00171
00172
00173 mesh.load_obj_file("data/man.obj");
00174
00175
00176
00177
00178
00179
00180 Mesh_object_loader loader;
00181 mesh.load_obj_file("data/man.obj");
00182
00183
00184
00185
00186
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
00195 for(int k=0;k<4;k++)
00196 mesh.Laplacien_smooth(0.25);
00197 }
00198
00199
00200
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
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
00231
00232
00233 skinned.set_mesh(&mesh);
00234 skinned.set_deformed_mesh(&deformed_mesh);
00235 skinned.set_skeleton(&skeleton);
00236
00237
00238
00239
00240
00241 skinned.automatic_weight_calculation();
00242
00243
00244
00245
00246
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
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
00310 int load_model_2()
00311 {
00312
00313
00314
00315
00316 char filename[]="data/collada_man.dae";
00317 mesh.load_collada_file(filename);
00318
00319
00320
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
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
00356
00357
00358 skinned.set_mesh(&mesh);
00359 skinned.set_deformed_mesh(&deformed_mesh);
00360 skinned.set_skeleton(&skeleton);
00361
00362
00363
00364
00365
00366 parser.load_collada_skining_attribute(filename,&skinned);
00367
00368
00369
00370
00371
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
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
00429
00430
00431
00432 char filename[]="data/collada_woman.dae";
00433
00434 mesh.load_collada_file(filename);
00435
00436
00437
00438
00439
00440
00441
00442
00443 Mesh_object_loader loader;
00444 loader.load_collada_texture(filename,&mesh,"WOMAN_BODYShape","WOMAN_BODYShape-TexCoord0");
00445
00446
00447
00448
00449
00450 mesh.set_texture_number(openGL_drawer.load_texture("data/WOMAN_BOD.jpg"));
00451
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
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
00483
00484
00485 skinned.set_mesh(&mesh);
00486 skinned.set_deformed_mesh(&deformed_mesh);
00487 skinned.set_skeleton(&skeleton);
00488
00489
00490
00491
00492
00493 parser.load_collada_skining_attribute(filename,&skinned);
00494
00495
00496
00497
00498
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
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
00562
00563 deformed_skeleton=skeleton;
00564 skeleton.deform_skeleton(t,&deformed_skeleton);
00565 skinned.skinning();
00566
00567
00568
00569
00570
00571 return 0;
00572 }
00573
00574
00575
00576
00577
00578
00579
00580
00581
00582
00583
00584
00585
00586
00587
00588
00589 int setup_opengl(int argc,char **argv)
00590 {
00591 openGL_drawer.init_opengl(argc,argv,navigator);
00592
00593
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
00607 static void display_callback()
00608 {
00609
00610 double Z_MIN = 1;
00611 double Z_MAX = 900;
00612
00613
00614
00615 glViewport (0, 0, navigator.get_X_screen(),navigator.get_Y_screen());
00616 glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
00617
00618
00619 glMatrixMode(GL_PROJECTION);
00620 glLoadIdentity ();
00621 gluPerspective (45, navigator.get_screen_ratio(), Z_MIN,Z_MAX);
00622
00623
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
00633
00634
00635
00636
00637
00638
00639
00640
00641
00642 draw_scene();
00643
00644
00645
00646
00647
00648
00649
00650
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
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
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':
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':
00718 glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
00719 break;
00720 case 'F':
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;
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
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
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
00794 double get_rand()
00795 {
00796 int precision=50000;
00797 return double(rand()%precision)/double(precision);
00798 }
00799
00800
00801