00001
00002 #include <Skeleton.h>
00003 #define PI 3.14259
00004
00005
00006
00007 Skeleton::Skeleton()
00008 {
00009 N_joint = 0;
00010 N_list_bones = 0;
00011 joint_root=NULL;
00012 joint_root=new Joint;
00013
00014 if(joint_root==NULL)
00015 {
00016 cout<<"error allocation joint in Skeleton"<<endl;
00017 exit(-1);
00018 }
00019
00020 joint_access.resize(0);
00021
00022 }
00023
00024
00025
00026 Skeleton::~Skeleton()
00027 {
00028 reccursive_destroy();
00029 destroy();
00030 }
00031
00032
00033
00034 int Skeleton::destroy()
00035 {
00036 int ok=0;
00037
00038
00039 if(joint_root!=NULL)
00040 delete joint_root;
00041
00042
00043 return ok;
00044 }
00045
00046
00047
00048 int Skeleton::get_N_joint()
00049 {
00050 if(N_joint==0)
00051 read_skeleton();
00052 return N_joint;
00053 }
00054
00055 Joint *Skeleton::get_root()
00056 {
00057 if(joint_root==NULL)
00058 joint_root=new Joint;
00059 return joint_root;
00060 }
00061
00062
00063
00064
00065 int Skeleton::add_joint_number()
00066 {
00067 N_joint++;
00068 return 0;
00069 }
00070
00071
00072
00073
00074 int Skeleton::read_reccursive_joint(Joint *current,int *k_joint,Joint **T_joint)
00075 {
00076 (*k_joint)++;
00077
00078
00079 if(current->get_N_son()>0)
00080 {
00081 T_joint[*k_joint]=current;
00082 for(int k=0;k<current->get_N_son();k++)
00083 read_reccursive_joint(current->get_son(k),k_joint,T_joint);
00084 }
00085
00086 if(current->get_N_son()==0)
00087 T_joint[*k_joint]=current;
00088
00089
00090 return 0;
00091 }
00092
00093
00094
00095
00096
00097
00098 int Skeleton::set_size_time(int k_bone,int size)
00099 {
00100 int ok=0;
00101 if(anim.size()<=(unsigned int)k_bone)
00102 anim.resize(k_bone+1);
00103
00104 ok += anim[k_bone].set_size_time(size);
00105 ok += anim[k_bone].set_size_angle(size);
00106
00107 return ok;
00108 }
00109
00110 int Skeleton::get_size_time(int k_bone)
00111 {
00112
00113 return anim[k_bone].get_size();
00114 }
00115
00116 int Skeleton::set_time(int k_bone,int k_time,double val)
00117 {
00118 int ok=0;
00119 ok += anim[k_bone].set_time(k_time,val);
00120 return ok;
00121 }
00122
00123 int Skeleton::set_angle(int k_bone,int k_time,int k_axis,double val)
00124 {
00125 int ok=0;
00126 ok += anim[k_bone].set_angle(k_time,k_axis,val);
00127 return ok;
00128 }
00129
00130 int Skeleton::set_translate(int k_bone,int k_time,double tx,double ty,double tz)
00131 {
00132 int ok=0;
00133 ok += anim[k_bone].set_translation(k_time,tx,ty,tz);
00134 return ok;
00135 }
00136 int Skeleton::set_anim_matrix(int k_bone,int k_time,int k_dim,double value)
00137 {
00138 int ok=0;
00139 ok += anim[k_bone].set_anim_matrix(k_time,k_dim,value);
00140 return 0;
00141 }
00142
00143
00144
00145
00146
00147
00148
00149
00150 int Skeleton::read_anim()
00151 {
00152 int k;
00153 cout<<"Size anim :"<<anim.size()<<endl;
00154 for(k=0;(unsigned int)k<anim.size();k++)
00155 {
00156 cout<<"anim "<<k<<":"<<" size= "<<anim[k].get_size()<<endl;
00157 }
00158 return 0;
00159 }
00160
00161 Skeleton& Skeleton::operator=(const Skeleton& skeleton)
00162 {
00163
00164
00165
00166 reccursive_destroy(&joint_root);
00167 joint_root = new Joint();
00168
00169
00170 N_joint = skeleton.N_joint;
00171
00172 int k=0;
00173
00174
00175 N_list_bones = skeleton.N_list_bones;
00176
00177 Joint *to_copy=NULL;
00178 to_copy= skeleton.joint_root;
00179 copy_reccursive_joint(joint_root,to_copy);
00180
00181
00182 anim.resize(skeleton.anim.size());
00183 for(k=0;k<(int)skeleton.anim.size();k++)
00184 anim[k] = skeleton.anim[k];
00185
00186 joint_access.resize(skeleton.joint_access.size());
00187 for(k=0;k<(int)skeleton.joint_access.size();k++)
00188 joint_access[k] = skeleton.joint_access[k];
00189
00190
00191 read_skeleton();
00192
00193 return *this;
00194 }
00195
00196 int Skeleton::copy_reccursive_joint(Joint *current,Joint *to_copy)
00197 {
00198 int ok=0;
00199
00200 current->set_name(to_copy->get_name());
00201 double orientation[3];
00202 to_copy->get_orientation(orientation);
00203 current->set_orientation(orientation);
00204 current->set_bind_pose(to_copy->get_bind_pose());
00205 current->set_matrix(to_copy->get_matrix());
00206 current->set_access_number(to_copy->get_access_number());
00207
00208
00209
00210 Joint *father = current;
00211 int k_son=0;
00212
00213 int N_son = to_copy->get_N_son();
00214 if(N_son>0)
00215 {
00216 for(k_son=0;k_son<N_son;k_son++)
00217 {
00218
00219 current->add_son();
00220 current = current->get_son(0);
00221
00222
00223
00224
00225 current->set_father(father);
00226 ok += copy_reccursive_joint(current,to_copy->get_son(N_son-k_son-1));
00227
00228 current = current->get_father();
00229 }
00230 }
00231
00232 return ok;
00233 }
00234
00235
00236 int Skeleton::read_skeleton()
00237 {
00238 Joint *current=joint_root;
00239 Joint *father=joint_root;
00240 int k=0;
00241
00242 N_joint=0;
00243 int access_number=0;
00244 read_reccursive_joint_cout(current,father,&k,&access_number);
00245
00246 return 0;
00247 }
00248
00249 int Skeleton::read_reccursive_joint_cout(Joint *current,Joint *father,int *level,int *access_number)
00250 {
00251
00252
00253 current->set_access_number(*access_number);
00254 current->set_level(*level);
00255 *access_number=*access_number+1;
00256
00257 father = current;
00258 for(int k=0;k<current->get_N_son();k++)
00259 {
00260
00261 *level=*level+1;
00262 read_reccursive_joint_cout(current->get_son(current->get_N_son()-k-1),father,level,access_number);
00263 *level=*level-1;
00264 }
00265 N_joint++;
00266 return 0;
00267 }
00268
00269
00270 Matrix Skeleton::get_rotation_animation(int k_bone,double t)
00271 {
00272 return anim[k_bone].get_rotation(t);
00273 }
00274
00275
00276 int Skeleton::fill_bones_number()
00277 {
00278 int ok=0;
00279 Joint *current = joint_root;
00280
00281 int count=0;
00282 ok += reccursive_fill_bones_access_number(current,&count);
00283
00284 return ok;
00285 }
00286
00287 int Skeleton::reccursive_fill_bones_access_number(Joint *current,int *count)
00288 {
00289 int ok=0;
00290
00291
00292 *count = *count+1;
00293 int k_son=0;
00294 for(k_son=0;k_son<current->get_N_son();k_son++)
00295 reccursive_fill_bones_access_number(current->get_son(k_son),count);
00296
00297 return ok;
00298 }
00299
00300 int Skeleton::translate(double *t)
00301 {
00302 int k_dim=0;
00303 Matrix D=joint_root->get_matrix();
00304 for(k_dim=0;k_dim<3;k_dim++)
00305 D.set_value(D.value(3,k_dim)+t[k_dim],3,k_dim);
00306 joint_root->set_matrix(D);
00307
00308
00309 fix_init_bind_pose();
00310 precalculate_matrix();
00311
00312 return 0;
00313 }
00314
00315 int Skeleton::translate(double tx,double ty,double tz)
00316 {
00317 double t[3]={tx,ty,tz};
00318 return translate(t);
00319 }
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338 int Skeleton::scale(double *s)
00339 {
00340
00341
00342 reccursive_scale(joint_root,s);
00343
00344
00345 fix_init_bind_pose();
00346 read_skeleton();
00347 precalculate_matrix();
00348
00349
00350
00351
00352
00353
00354 return 0;
00355 }
00356
00357 int Skeleton::scale(double sx,double sy,double sz)
00358 {
00359 double s[3]={sx,sy,sz};
00360 return scale(s);
00361 }
00362
00363 int Skeleton::scale(double s)
00364 {
00365 double _s[3]={s,s,s};
00366 return scale(_s);
00367 }
00368
00369 int Skeleton::reccursive_scale(Joint *current,double *s)
00370 {
00371 int ok=0;
00372
00373 int k_dim=0;
00374 Matrix D=current->get_matrix();
00375 for(k_dim=0;k_dim<3;k_dim++)
00376 D.set_value(D.value(3,k_dim)*s[k_dim],3,k_dim);
00377 current->set_matrix(D);
00378
00379 int k_son=0;
00380 for(k_son=0;k_son<current->get_N_son();k_son++)
00381 reccursive_scale(current->get_son(current->get_N_son()-k_son-1),s);
00382
00383 return ok;
00384 }
00385
00386
00387
00388 double Skeleton::get_angle(int k_bone,int k_time,int k_axis)
00389 {
00390 return anim[k_bone].get_angle(k_time,k_axis);
00391 }
00392
00393 Joint* Skeleton::get_joint(int k_bone)
00394 {
00395
00396 if(k_bone<0 || k_bone>=(int)joint_access.size())
00397 {printf("Error in get_joint in Skeleton, k_bone[%d] (size=%d) is not correct\n",k_bone,joint_access.size());exit(-1);}
00398 return joint_access[k_bone];
00399
00400
00401
00402
00403
00404
00405
00406
00407
00408 }
00409
00410 int Skeleton::reccursive_bone_looking_for(Joint *current,int *counter,Joint **joint,int k_bone)
00411 {
00412 int N_son=current->get_N_son();
00413
00414 if(*counter==k_bone)
00415 *joint = current;
00416
00417
00418 *counter = *counter+1;
00419 for(int k_son=0;*counter<=k_bone && k_son<N_son;k_son++)
00420 reccursive_bone_looking_for(current->get_son(N_son-k_son-1),counter,joint,k_bone);
00421
00422
00423 return 0;
00424
00425
00426 }
00427
00428
00429
00430
00431 Matrix Skeleton::get_position(int k_bone)
00432 {
00433
00434 Matrix P;
00435
00436 Joint *current = joint_root;
00437 int counter=0;
00438 Matrix M;
00439 reccursive_bone_looking_for_position(current,M,&counter,k_bone,&P);
00440 return P;
00441 }
00442
00443 int Skeleton::reccursive_bone_looking_for_position(Joint *current,Matrix M,int *counter,int k_bone,Matrix *P)
00444 {
00445 M = M.multiply(current->get_matrix());
00446 if(*counter==k_bone)
00447 *P=M;
00448
00449 *counter = *counter+1;
00450 if(*counter<=k_bone)
00451 for(int k_son=0;*counter<=k_bone && k_son<current->get_N_son();k_son++)
00452 {
00453 reccursive_bone_looking_for_position(current->get_son(k_son),M,counter,k_bone,P);
00454 }
00455 return 0;
00456
00457 }
00458
00459
00460
00461
00462 int Skeleton::deform_skeleton(double t,Skeleton *output)
00463 {
00464 int ok=0;
00465
00466 Joint *current=joint_root;
00467 Joint *to_deform = output->get_root();
00468
00469 deform_reccursive_joint(current,t,to_deform);
00470
00471 ok += output->precalculate_matrix();
00472
00473 return ok;
00474 }
00475
00476
00477 int Skeleton::deform_reccursive_joint(Joint *current,double t,Joint *to_deform)
00478 {
00479 int index_bone = current->get_access_number();
00480 Matrix R;
00481 Matrix T;
00482 Matrix M;
00483
00484 Matrix R0 = anim[index_bone].get_rotation(0);
00485 Matrix R0m1 = R0.invert();
00486
00487
00488 R = anim[index_bone].get_rotation(t);
00489 T = anim[index_bone].get_translation(t);
00490 M = anim[index_bone].get_matrix(t);
00491
00492
00493
00494
00495 to_deform->set_matrix(current->get_matrix()*(T*R));
00496
00497
00498
00499
00500 int N_son=current->get_N_son();
00501 if(N_son>0)
00502 for(int k=0;k<N_son;k++)
00503 deform_reccursive_joint(current->get_son(N_son-k-1),t,to_deform->get_son(N_son-k-1));
00504
00505 return 0;
00506
00507 }
00508
00509 int Skeleton::init_time()
00510 {
00511 if(N_joint==0)
00512 {
00513 cout<<"Warning N_joint=0 in Seleton::init_time !!"<<endl;
00514 exit(-1);
00515 }
00516 for(int k=0;k<N_joint;k++)
00517 {
00518 set_size_time(k,2);
00519 set_time(k,0,0.0);
00520 set_time(k,1,1.0);
00521 }
00522 return 0;
00523 }
00524
00525 int Skeleton::fix_init_bind_pose()
00526 {
00527 int ok=0;
00528
00529 Joint *current = joint_root;
00530 Matrix D;
00531
00532 ok += recursive_bind_pose_fixing(D,current);
00533
00534 return ok;
00535 }
00536
00537 int Skeleton::recursive_bind_pose_fixing(Matrix D,Joint *current)
00538 {
00539
00540 D = D*current->get_matrix();
00541
00542 current->set_bind_pose(D.invert());
00543 for(int k=0;k<current->get_N_son();k++)
00544 recursive_bind_pose_fixing(D,current->get_son(current->get_N_son()-k-1));
00545
00546 return 0;
00547 }
00548
00549
00550 int Skeleton::precalculate_matrix()
00551 {
00552 Matrix D;
00553 Joint *current = joint_root;
00554
00555 reccursive_matrix_precalculation(D,current);
00556 fill_joint_vector();
00557
00558 return 0;
00559
00560 }
00561
00562 int Skeleton::reccursive_matrix_precalculation(Matrix D,Joint *current)
00563 {
00564 D = D*current->get_matrix();
00565 current->set_world_matrix(D);
00566 current->set_T(D*current->get_bind_pose());
00567
00568
00569
00570
00571 int k=0;
00572 for(k=0;k<current->get_N_son();k++)
00573 reccursive_matrix_precalculation(D,current->get_son(current->get_N_son()-k-1));
00574 return 0;
00575 }
00576
00577
00578 int Skeleton::change_father(int k_bone)
00579 {
00580
00581 int ok=0;
00582
00583 Joint *current = joint_root;
00584 Joint *new_root = NULL;
00585 Matrix D_init;
00586 Matrix temp_D;
00587
00588 int is_good=0;
00589 ok += reccursive_set_name_access_number(joint_root);
00590 ok += reccursive_look_for_new_father(k_bone,current,&new_root,temp_D,&D_init,&is_good);
00591
00592
00593
00594
00595 Joint *futur_root = new Joint();
00596 *futur_root = *new_root;
00597 ok += add_reccursive_child(futur_root,new_root,-1);
00598
00599
00600 Joint *futur_current = futur_root;
00601 current = new_root;
00602 Joint *save_current=NULL;
00603 int N_son=0;
00604 int k_son=0;
00605
00606 int son_index=0;
00607 while(current->get_father()!=current)
00608 {
00609
00610 son_index = current->get_access_number();
00611 save_current = current;
00612
00613 current = current->get_father();
00614
00615
00616
00617 futur_current->add_son();
00618 futur_current = futur_current->get_son(0);
00619 *futur_current=*current;
00620 futur_current->set_matrix(save_current->get_matrix().invert());
00621
00622
00623 N_son=current->get_N_son();
00624 if(current->get_N_son()>1)
00625
00626 for(k_son=0;k_son<N_son;k_son++)
00627 if(current->get_son(N_son-k_son-1)->get_access_number()!=son_index)
00628 {
00629 futur_current->add_son();
00630 ok += add_reccursive_child(futur_current->get_son(0),current->get_son(N_son-k_son-1),son_index);
00631 }
00632
00633 }
00634 ok += reccursive_destroy(&joint_root);
00635 joint_root = futur_root;
00636 joint_root->set_matrix(D_init);
00637
00638 read_skeleton();
00639 fix_init_bind_pose();
00640
00641 Matrix Id;
00642
00643
00644 ok += read_skeleton();
00645 ok += reccursive_set_name_access_number(joint_root);
00646 ok += precalculate_matrix();
00647
00648 return ok;
00649 }
00650
00651 int Skeleton::reccursive_set_name_access_number(Joint *current)
00652 {
00653 char value[10];
00654 sprintf(value,"%d",current->get_access_number());
00655 current->set_name(value);
00656 for(int k_son=0;k_son<current->get_N_son();k_son++)
00657 reccursive_set_name_access_number(current->get_son(current->get_N_son()-k_son-1));
00658 return 0;
00659 }
00660
00661 int Skeleton::reccursive_look_for_new_father(int k_bone,Joint *current,Joint **new_root,Matrix temp_D,Matrix *D_init,int *is_good)
00662 {
00663
00664 int k_son=0;
00665
00666
00667 if(*is_good==0)
00668 temp_D = temp_D*current->get_matrix();
00669 if(current->get_access_number()==k_bone)
00670 {
00671 *new_root = current;
00672 *is_good=1;
00673 (*D_init) = temp_D;
00674 }
00675 else
00676 for(k_son=0;*is_good==0 && k_son<current->get_N_son();k_son++)
00677 reccursive_look_for_new_father(k_bone,current->get_son(current->get_N_son()-k_son-1),new_root,temp_D,D_init,is_good);
00678
00679 return 0;
00680 }
00681
00682
00683 int Skeleton::add_reccursive_child(Joint *new_joint,Joint *old_joint,int forbidden_index)
00684 {
00685 int k_son=0;
00686 int N_son = old_joint->get_N_son();
00687
00688 *new_joint = *old_joint;
00689
00690 for(k_son=0;k_son<N_son;k_son++)
00691 {
00692 if(old_joint->get_son(N_son-k_son-1)->get_access_number()!=forbidden_index)
00693 {
00694 new_joint->add_son();
00695 add_reccursive_child(new_joint->get_son(0),old_joint->get_son(N_son-k_son-1),forbidden_index);
00696 }
00697 }
00698
00699
00700
00701 return 0;
00702
00703 }
00704
00705 int Skeleton::reccursive_destroy(Joint **current)
00706 {
00707 Joint *child;
00708 for(int k_son=0;k_son<(*current)->get_N_son();k_son++)
00709 {
00710 child = (*current)->get_son((*current)->get_N_son()-k_son-1);
00711 reccursive_destroy(&child);
00712 }
00713
00714 delete *current;
00715 *current=NULL;
00716 return 0;
00717 }
00718
00719 int Skeleton::reccursive_destroy()
00720 {
00721 if(joint_root!=NULL)
00722 reccursive_destroy(&joint_root);
00723 return 0;
00724 }
00725
00726
00727
00728 int Skeleton::cout_skeleton()
00729 {
00730 Joint *current=joint_root;
00731 Joint *father=joint_root;
00732 int k=0;
00733
00734 N_joint=0;
00735 int access_number=0;
00736 cout_reccursive_joint(current,father,&k,&access_number);
00737
00738 return 0;
00739 }
00740
00741 int Skeleton::cout_reccursive_joint(Joint *current,Joint *father,int *level,int *access_number)
00742 {
00743 cout<<"lev."<<*level<<" joint :"<<current->get_name()<<"("<<current->get_access_number()<<") father: "<<current->get_father()->get_name()<<"("<<current->get_father()->get_access_number()<<") number of son: "<<current->get_N_son();
00744 cout<<" [";
00745 for(int k=0;k<current->get_N_son()-1;k++)
00746 printf("%d,",current->get_son(current->get_N_son()-k-1)->get_access_number());
00747 if(current->get_N_son()>0)
00748 printf("%d",current->get_son(0)->get_access_number());
00749 cout<<"]"<<endl;
00750
00751
00752 *access_number=*access_number+1;
00753
00754 father = current;
00755 for(int k=0;k<current->get_N_son();k++)
00756 {
00757
00758 *level=*level+1;
00759 cout_reccursive_joint(current->get_son(current->get_N_son()-k-1),father,level,access_number);
00760 *level=*level-1;
00761 }
00762 N_joint++;
00763 return 0;
00764 }
00765
00766
00767 int Skeleton::subsample_skeleton()
00768 {
00769 int ok=0;
00770 int k_delete=0;
00771 Joint *current = joint_root;
00772
00773 ok += read_skeleton();
00774 ok += precalculate_matrix();
00775
00776 ok += reccursive_subsample_skeleton(k_delete,¤t);
00777
00778 ok += read_skeleton();
00779 ok += precalculate_matrix();
00780
00781 return ok;
00782 }
00783
00784 int Skeleton::reccursive_subsample_skeleton(int k_delete,Joint **current)
00785 {
00786 int k_son=0;
00787 int N_son = (*current)->get_N_son();
00788 int is_deleted = 0;
00789
00790 double L_max=0.15*5;
00791 double angle_max = 20;
00792
00793 if(N_son==1 && (*current)->get_father()->get_N_son()==1)
00794 {
00795
00796
00797
00798 double X0[3],X1[3],X2[3];
00799
00800 (*current)->get_father()->get_world_matrix().get_position(X0);
00801 (*current)->get_world_matrix().get_position(X1);
00802 (*current)->get_son(0)->get_world_matrix().get_position(X2);
00803
00804
00805 int k_dim=0;
00806 double L=0.0;
00807 for(k_dim=0;k_dim<3;k_dim++)
00808 L += (X2[k_dim]-X0[k_dim])*(X2[k_dim]-X0[k_dim]);
00809 L = powf(L,0.5);
00810
00811
00812
00813 double V1[3],V2[3];
00814 double proj=0.0;
00815 double n_v1=0.0,n_v2=0.0;
00816 double angle=0.0;
00817
00818 for(k_dim=0;k_dim<3;V1[k_dim]=X1[k_dim]-X0[k_dim],V2[k_dim]=X2[k_dim]-X1[k_dim],k_dim++);
00819 for(k_dim=0,proj=0.0,n_v1=0.0,n_v2=0.0;k_dim<3;k_dim++)
00820 {
00821 proj += V1[k_dim]*V2[k_dim];
00822 n_v1 += V1[k_dim]*V1[k_dim];
00823 n_v2 += V2[k_dim]*V2[k_dim];
00824 }
00825 n_v1 = powf(n_v1,0.5);
00826 n_v2 = powf(n_v2,0.5);
00827
00828
00829 angle = acos(proj/(n_v1*n_v2));
00830
00831 if( (*current)->get_access_number()!=0 && (((angle*180/PI<angle_max) && L<L_max) || L<L_max/10.0 ))
00832 {
00833
00834 is_deleted = 1;
00835 (*current)->get_father()->set_son(0,(*current)->get_son(0));
00836
00837 Joint *current_son=(*current)->get_son(0);
00838
00839 current_son->set_father((*current)->get_father());
00840 current_son->set_matrix((*current)->get_matrix()*current_son->get_matrix());
00841
00842
00843 }
00844 }
00845
00846 Joint *son=NULL;
00847 for(k_son=0;k_son<N_son;k_son++)
00848 {
00849 son = (*current)->get_son(N_son-k_son-1);
00850 reccursive_subsample_skeleton(k_delete, &son );
00851 }
00852
00853 if(is_deleted==1)
00854 delete *current;
00855
00856
00857
00858
00859
00860 return 0;
00861 }
00862
00863 int Skeleton::find_closest_joint(double x,double y,double z,double radius)
00864 {
00865 Joint *current=NULL;
00866 int k_joint=0;
00867
00868 V_3D P1;P1.set(x,y,z);
00869 V_3D P2;double p[3];
00870
00871 double distance=0.0;
00872 double distance_min=99.9;
00873 int k_closest=-1;
00874
00875 for(k_joint=0;k_joint<N_joint;k_joint++)
00876 {
00877 current = get_joint(k_joint);
00878 current->get_world_matrix().get_position(p);
00879 P2.set(p);
00880
00881 distance = (P1-P2).norm();
00882
00883 if(distance_min>distance && distance<radius)
00884 {
00885 k_closest=k_joint;
00886 distance_min = distance;
00887 }
00888 }
00889
00890 return k_closest;
00891 }
00892
00893
00894 int Skeleton::add_new_joint(double x,double y,double z,int father_number)
00895 {
00896 int ok=0;
00897
00898 Joint *father = get_joint(father_number);
00899 father->add_son();
00900 Joint *current = father->get_son(0);
00901
00902 if(current==NULL)
00903 printf("Error allocating Joint in add_new_joint\n");
00904
00905 Matrix current_world_matrix;
00906 current_world_matrix.set_translation(x,y,z);
00907 Matrix current_local;
00908
00909 current_local = (father->get_world_matrix().invert())*current_world_matrix;
00910
00911 current->set_matrix(current_local);
00912
00913
00914
00915
00916 ok += fix_init_bind_pose();
00917 ok += read_skeleton();
00918 ok += reccursive_set_name_access_number(joint_root);
00919 ok += precalculate_matrix();
00920
00921
00922
00923
00924
00925
00926
00927
00928
00929
00930
00931
00932
00933
00934
00935
00936
00937 return ok;
00938 }
00939
00940
00941
00942
00943 V_3D Skeleton::get_world_position_of_bone(int k_bone)
00944 {
00945 return get_joint(k_bone)->get_world_matrix().get_position();
00946 }
00947
00948 int Skeleton::fill_joint_vector()
00949 {
00950 joint_access.resize(0);
00951 reccursive_fill_joint_vector(joint_root);
00952
00953 return 0;
00954 }
00955
00956 int Skeleton::reccursive_fill_joint_vector(Joint *current)
00957 {
00958 int k_son=0;
00959 int N_son=current->get_N_son();
00960
00961 joint_access.push_back(current);
00962 for(k_son=0;k_son<N_son;k_son++)
00963 reccursive_fill_joint_vector(current->get_son(N_son-k_son-1));
00964
00965 return 0;
00966 }
00967
00968
00969 int Skeleton::new_father(double x,double y,double z)
00970 {
00971 destroy();
00972
00973 N_joint=1;
00974 joint_root = new Joint;
00975 joint_root->set_position(x,y,z);
00976
00977
00978 read_skeleton();
00979 reccursive_set_name_access_number(joint_root);
00980 precalculate_matrix();
00981
00982 return 0;
00983 }
00984
00985
00986
00987 int Skeleton::get_access_number_of_joint_named(std::string &name_joint)
00988 {
00989
00990
00991 int count=0;
00992 Joint *current=joint_root;
00993 if(current==NULL)
00994 {printf("Error joint_root is null in get_access_number_of_joint_named in Skeleton\n");exit(-1);}
00995
00996
00997 for(count=0;count<get_N_joint()-1 && (name_joint != current->get_name()) && (name_joint != current->get_weight_name()) ;count++)
00998 current = get_joint(count+1);
00999
01000 if(current==NULL || ((name_joint != current->get_name())&&(name_joint != current->get_weight_name())))
01001 {printf("WARNING cannot find joint [%s] in get_access_number_of_joint_named in skeleton\n",name_joint.data());return(-1);};
01002
01003 return current->get_access_number();
01004
01005 }
01006 int Skeleton::get_access_number_of_joint_named(const char* name_joint)
01007 {
01008 std::string name;
01009 name = name_joint;
01010 return get_access_number_of_joint_named(name);
01011 }
01012
01013 int Skeleton::init_time_animation()
01014 {
01015 for(int k=0;k<get_N_joint();k++)
01016 {
01017 set_size_time(k,2);
01018 set_time(k,0,0.0);
01019 set_time(k,1,2000.0);
01020 }
01021
01022 return 0;
01023 }
01024
01025 int Skeleton::is_animated_section(int k_bone)
01026 {
01027 if(k_bone >= (int)anim.size())
01028 {printf("error k_bone too large in is_animated_section\n");exit(-1);}
01029
01030 if(anim[k_bone].get_size()==2)
01031 return 0;
01032 else
01033 return 1;
01034
01035 }
01036
01037 double Skeleton::get_first_anim_time(int k_bone)
01038 {
01039 if(k_bone >= (int)anim.size())
01040 {printf("error k_bone too large in is_animated_section\n");exit(-1);}
01041
01042 return anim[k_bone].get_time(0);
01043 }
01044 double Skeleton::get_last_anim_time(int k_bone)
01045 {
01046 if(k_bone >= (int)anim.size())
01047 {printf("error k_bone too large in is_animated_section\n");exit(-1);}
01048
01049 return anim[k_bone].get_time(anim[k_bone].get_size()-1);
01050 }
01051
01052 int Skeleton::unitize_time_variation()
01053 {
01054 int k_bone=0;
01055 int k_t=0;
01056 double current_t=0.0;
01057 double t_min=0.0,t_max=0.0;
01058 for(k_bone=0;k_bone<get_N_joint();k_bone++)
01059 {
01060 t_min = anim[k_bone].get_time(0);
01061 t_max = anim[k_bone].get_time(anim[k_bone].get_size()-1);
01062
01063 for(k_t=0;k_t<anim[k_bone].get_size();k_t++)
01064 {
01065 current_t = anim[k_bone].get_time(k_t);
01066 anim[k_bone].set_time(k_t,(current_t-t_min)/(t_max-t_min));
01067 }
01068 }
01069
01070 return 0;
01071 }
01072
01073 int Skeleton::add_anim_angle(int index_bone,int axis,double offset_angle)
01074 {
01075 int k_time;
01076 for(k_time=0;k_time<anim[index_bone].get_size();k_time++)
01077 anim[index_bone].set_angle(k_time,axis,offset_angle+anim[index_bone].get_angle(k_time,axis));
01078
01079 return 0;
01080 }
01081
01082 Skeleton::Skeleton(const Skeleton& skeleton)
01083 {
01084
01085
01086
01087 joint_root = new Joint();
01088
01089 N_joint = skeleton.N_joint;
01090
01091 int k=0;
01092
01093
01094 N_list_bones = skeleton.N_list_bones;
01095
01096 Joint *to_copy;
01097 to_copy= skeleton.joint_root;
01098 copy_reccursive_joint(joint_root,to_copy);
01099
01100
01101 anim.resize(skeleton.anim.size());
01102 for(k=0;k<(int)skeleton.anim.size();k++)
01103 anim[k] = skeleton.anim[k];
01104
01105
01106
01107
01108
01109
01110 read_skeleton();
01111
01112
01113
01114
01115 }