main.cpp 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. // If you don't have mosek installed and don't want to install it. Then
  2. // uncomment the following six lines. Don't use static library for this
  3. // example because of Mosek complications
  4. //
  5. //#define IGL_NO_MOSEK
  6. //#ifdef IGL_NO_MOSEK
  7. //#ifdef IGL_STATIC_LIBRARY
  8. //#undef IGL_STATIC_LIBRARY
  9. //#endif
  10. //#endif
  11. #include <igl/boundary_conditions.h>
  12. #include <igl/colon.h>
  13. #include <igl/column_to_quats.h>
  14. #include <igl/directed_edge_parents.h>
  15. #include <igl/forward_kinematics.h>
  16. #include <igl/jet.h>
  17. #include <igl/lbs_matrix.h>
  18. #include <igl/deform_skeleton.h>
  19. #include <igl/normalize_row_sums.h>
  20. #include <igl/readDMAT.h>
  21. #include <igl/readMESH.h>
  22. #include <igl/readTGF.h>
  23. #include <igl/viewer/Viewer.h>
  24. #include <igl/bbw/bbw.h>
  25. //#include <igl/embree/bone_heat.h>
  26. #include <Eigen/Geometry>
  27. #include <Eigen/StdVector>
  28. #include <vector>
  29. #include <algorithm>
  30. #include <iostream>
  31. typedef
  32. std::vector<Eigen::Quaterniond,Eigen::aligned_allocator<Eigen::Quaterniond> >
  33. RotationList;
  34. const Eigen::RowVector3d sea_green(70./255.,252./255.,167./255.);
  35. int selected = 0;
  36. Eigen::MatrixXd V,W,U,C,M;
  37. Eigen::MatrixXi T,F,BE;
  38. Eigen::VectorXi P;
  39. RotationList pose;
  40. double anim_t = 1.0;
  41. double anim_t_dir = -0.03;
  42. bool pre_draw(igl::viewer::Viewer & viewer)
  43. {
  44. using namespace Eigen;
  45. using namespace std;
  46. if(viewer.core.is_animating)
  47. {
  48. // Interpolate pose and identity
  49. RotationList anim_pose(pose.size());
  50. for(int e = 0;e<pose.size();e++)
  51. {
  52. anim_pose[e] = pose[e].slerp(anim_t,Quaterniond::Identity());
  53. }
  54. // Propogate relative rotations via FK to retrieve absolute transformations
  55. RotationList vQ;
  56. vector<Vector3d> vT;
  57. igl::forward_kinematics(C,BE,P,anim_pose,vQ,vT);
  58. const int dim = C.cols();
  59. MatrixXd T(BE.rows()*(dim+1),dim);
  60. for(int e = 0;e<BE.rows();e++)
  61. {
  62. Affine3d a = Affine3d::Identity();
  63. a.translate(vT[e]);
  64. a.rotate(vQ[e]);
  65. T.block(e*(dim+1),0,dim+1,dim) =
  66. a.matrix().transpose().block(0,0,dim+1,dim);
  67. }
  68. // Compute deformation via LBS as matrix multiplication
  69. U = M*T;
  70. // Also deform skeleton edges
  71. MatrixXd CT;
  72. MatrixXi BET;
  73. igl::deform_skeleton(C,BE,T,CT,BET);
  74. viewer.data.set_vertices(U);
  75. viewer.data.set_edges(CT,BET,sea_green);
  76. viewer.data.compute_normals();
  77. anim_t += anim_t_dir;
  78. anim_t_dir *= (anim_t>=1.0 || anim_t<=0.0?-1.0:1.0);
  79. }
  80. return false;
  81. }
  82. void set_color(igl::viewer::Viewer &viewer)
  83. {
  84. Eigen::MatrixXd C;
  85. igl::jet(W.col(selected).eval(),true,C);
  86. viewer.data.set_colors(C);
  87. }
  88. bool key_down(igl::viewer::Viewer &viewer, unsigned char key, int mods)
  89. {
  90. switch(key)
  91. {
  92. case ' ':
  93. viewer.core.is_animating = !viewer.core.is_animating;
  94. break;
  95. case '.':
  96. selected++;
  97. selected = std::min(std::max(selected,0),(int)W.cols()-1);
  98. set_color(viewer);
  99. break;
  100. case ',':
  101. selected--;
  102. selected = std::min(std::max(selected,0),(int)W.cols()-1);
  103. set_color(viewer);
  104. break;
  105. }
  106. return true;
  107. }
  108. int main(int argc, char *argv[])
  109. {
  110. using namespace Eigen;
  111. using namespace std;
  112. igl::readMESH("../shared/hand.mesh",V,T,F);
  113. U=V;
  114. igl::readTGF("../shared/hand.tgf",C,BE);
  115. // retrieve parents for forward kinematics
  116. igl::directed_edge_parents(BE,P);
  117. // Read pose as matrix of quaternions per row
  118. MatrixXd Q;
  119. igl::readDMAT("../shared/hand-pose.dmat",Q);
  120. igl::column_to_quats(Q,pose);
  121. assert(pose.size() == BE.rows());
  122. // List of boundary indices (aka fixed value indices into VV)
  123. VectorXi b;
  124. // List of boundary conditions of each weight function
  125. MatrixXd bc;
  126. igl::boundary_conditions(V,T,C,VectorXi(),BE,MatrixXi(),b,bc);
  127. // compute BBW weights matrix
  128. igl::bbw::BBWData bbw_data;
  129. // only a few iterations for sake of demo
  130. bbw_data.active_set_params.max_iter = 8;
  131. bbw_data.verbosity = 2;
  132. if(!igl::bbw::bbw(V,T,b,bc,bbw_data,W))
  133. {
  134. return false;
  135. }
  136. //MatrixXd Vsurf = V.topLeftCorner(F.maxCoeff()+1,V.cols());
  137. //MatrixXd Wsurf;
  138. //if(!igl::bone_heat(Vsurf,F,C,VectorXi(),BE,MatrixXi(),Wsurf))
  139. //{
  140. // return false;
  141. //}
  142. //W.setConstant(V.rows(),Wsurf.cols(),1);
  143. //W.topLeftCorner(Wsurf.rows(),Wsurf.cols()) = Wsurf = Wsurf = Wsurf = Wsurf;
  144. // Normalize weights to sum to one
  145. igl::normalize_row_sums(W,W);
  146. // precompute linear blend skinning matrix
  147. igl::lbs_matrix(V,W,M);
  148. // Plot the mesh with pseudocolors
  149. igl::viewer::Viewer viewer;
  150. viewer.data.set_mesh(U, F);
  151. set_color(viewer);
  152. viewer.data.set_edges(C,BE,sea_green);
  153. viewer.core.show_lines = false;
  154. viewer.core.show_overlay_depth = false;
  155. viewer.core.line_width = 1;
  156. viewer.core.trackball_angle.normalize();
  157. viewer.callback_pre_draw = &pre_draw;
  158. viewer.callback_key_down = &key_down;
  159. viewer.core.is_animating = false;
  160. viewer.core.animation_max_fps = 30.;
  161. cout<<
  162. "Press '.' to show next weight function."<<endl<<
  163. "Press ',' to show previous weight function."<<endl<<
  164. "Press [space] to toggle animation."<<endl;
  165. viewer.launch();
  166. }