Skeleton.cpp

Go to the documentation of this file.
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   //get tree
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   //get leaf
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   //  joint_root = new Joint();
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   //  cout<<current->get_matrix()<<endl;
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           //      cout<<N_son-k_son-1<<", "<<N_son<<endl;
00223 
00224           //to_copy = to_copy->get_son(k_son);
00225           current->set_father(father);
00226           ok += copy_reccursive_joint(current,to_copy->get_son(N_son-k_son-1));
00227           //ok += copy_reccursive_joint(current,to_copy->get_son(k_son));
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   //cout<<"l."<<*level<<" joint :"<<current->get_name()<<"("<<current->get_access_number()<<") father: "<<father->get_name()<<"("<<father->get_access_number()<<") number of son: "<<current->get_N_son()<<endl;
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       //      current = current->get_son(k);
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   //ok += current->set_access_number(look_for_bone_index(current->get_name()));
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 // int Skeleton::reccursive_translate(Joint *current,double *t)
00322 // {
00323 //   int ok=0;
00324 
00325 //   int k_dim=0;
00326 //   Matrix D=joint_root->get_matrix();
00327 //   for(k_dim=0;k_dim<3;k_dim++)
00328 //     D.set_value(D.value(3,k_dim)+t[k_dim],3,k_dim);
00329 //   joint_root->set_matrix(D);
00330     
00331 //   int k_son=0;
00332 //   for(k_son=0;k_son<current->get_N_son();k_son++)
00333 //     reccursive_translate(current->get_son(k_son),t);
00334 
00335 //   return ok;
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 //   Matrix D=joint_root->get_matrix();
00350 //   for(k_dim=0;k_dim<3;k_dim++)
00351 //     D.set_value(D.value(3,k_dim)*s[k_dim],3,k_dim);
00352 //   joint_root->set_matrix(D);
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 //   if(k_bone<0 || k_bone>N_joint){printf("ERROR in get_joint in Skeleton, this joint does not exists [%d]\n",k_bone);exit(-1);}
00401 
00402 //   Joint *current = joint_root;
00403 //   Joint *joint=NULL;
00404 //   int counter=0;
00405 
00406 //   reccursive_bone_looking_for(current,&counter,&joint,k_bone);
00407 //   return joint;
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   //to_deform -> set_matrix(M*current->get_matrix());
00497   //to_deform -> set_matrix(M);
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 //   cout<<current->get_access_number()<<endl;
00569 //   cout<<current->get_world_matrix()<<endl;
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   //cout<<" ns :"<<futur_root->get_N_son()<<endl;
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)//old root node
00608     {
00609 
00610       son_index = current->get_access_number();
00611       save_current = current;
00612 
00613       current = current->get_father();
00614 
00615   
00616       //old father become new son
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       //add son branch
00623       N_son=current->get_N_son();
00624       if(current->get_N_son()>1)
00625         //do not change the matrix comming from a father
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)//this index must not be added
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   //futur_root->set_matrix(Id);
00643 
00644   ok += read_skeleton();
00645   ok += reccursive_set_name_access_number(joint_root);//name = access number
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   //cout<<"b"<<new_joint->get_access_number()<<endl;
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)//this index must not be added
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   //current->set_access_number(*access_number);
00752   *access_number=*access_number+1;
00753 
00754   father = current;
00755   for(int k=0;k<current->get_N_son();k++)
00756     {
00757       //      current = current->get_son(k);
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,&current);
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;//size max between two joints
00791   double angle_max = 20;
00792 
00793   if(N_son==1 && (*current)->get_father()->get_N_son()==1)
00794     {
00795 
00796       
00797       //calculate angle
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 ))//bellow size min L_max/10 the angle does not account
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       //printf("%d : %f\n",k_joint,distance);
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   //current = new Joint();
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 //   if(father->get_N_son()>0)
00924 //     {
00925 //       int N_son = father->get_N_son();
00926 //       int k_son = 0;
00927 
00928 //       for(k_son=0;k_son<N_son;k_son++)
00929 //      {
00930 //        current->add_son();
00931 //        current->get_son(0) = father->get_son(N_son-k+1);
00932 //        current->set_father(father);
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);//name = access number
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);};//exit(-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 //   joint_access.resize(skeleton.joint_access.size());
01106 //   for(k=0;k<(int)skeleton.joint_access.size();k++)
01107 //     joint_access[k] = skeleton.joint_access[k];
01108 
01109 
01110   read_skeleton();
01111 
01112 
01113 
01114 
01115 }

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