main.cpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. #include <igl/colon.h>
  2. #include <igl/directed_edge_orientations.h>
  3. #include <igl/directed_edge_parents.h>
  4. #include <igl/forward_kinematics.h>
  5. #include <igl/PI.h>
  6. #include <igl/lbs_matrix.h>
  7. #include <igl/deform_skeleton.h>
  8. #include <igl/dqs.h>
  9. #include <igl/readDMAT.h>
  10. #include <igl/readOFF.h>
  11. #include <igl/arap.h>
  12. #include <igl/viewer/Viewer.h>
  13. #include <Eigen/Geometry>
  14. #include <Eigen/StdVector>
  15. #include <vector>
  16. #include <algorithm>
  17. #include <iostream>
  18. #include "tutorial_shared_path.h"
  19. typedef
  20. std::vector<Eigen::Quaterniond,Eigen::aligned_allocator<Eigen::Quaterniond> >
  21. RotationList;
  22. const Eigen::RowVector3d sea_green(70./255.,252./255.,167./255.);
  23. Eigen::MatrixXd V,U;
  24. Eigen::MatrixXi F;
  25. Eigen::VectorXi S,b;
  26. Eigen::RowVector3d mid;
  27. double anim_t = 0.0;
  28. double anim_t_dir = 0.03;
  29. igl::ARAPData arap_data;
  30. bool pre_draw(igl::viewer::Viewer & viewer)
  31. {
  32. using namespace Eigen;
  33. using namespace std;
  34. MatrixXd bc(b.size(),V.cols());
  35. for(int i = 0;i<b.size();i++)
  36. {
  37. bc.row(i) = V.row(b(i));
  38. switch(S(b(i)))
  39. {
  40. case 0:
  41. {
  42. const double r = mid(0)*0.25;
  43. bc(i,0) += r*sin(0.5*anim_t*2.*igl::PI);
  44. bc(i,1) -= r+r*cos(igl::PI+0.5*anim_t*2.*igl::PI);
  45. break;
  46. }
  47. case 1:
  48. {
  49. const double r = mid(1)*0.15;
  50. bc(i,1) += r+r*cos(igl::PI+0.15*anim_t*2.*igl::PI);
  51. bc(i,2) -= r*sin(0.15*anim_t*2.*igl::PI);
  52. break;
  53. }
  54. case 2:
  55. {
  56. const double r = mid(1)*0.15;
  57. bc(i,2) += r+r*cos(igl::PI+0.35*anim_t*2.*igl::PI);
  58. bc(i,0) += r*sin(0.35*anim_t*2.*igl::PI);
  59. break;
  60. }
  61. default:
  62. break;
  63. }
  64. }
  65. igl::arap_solve(bc,arap_data,U);
  66. viewer.data.set_vertices(U);
  67. viewer.data.compute_normals();
  68. if(viewer.core.is_animating)
  69. {
  70. anim_t += anim_t_dir;
  71. }
  72. return false;
  73. }
  74. bool key_down(igl::viewer::Viewer &viewer, unsigned char key, int mods)
  75. {
  76. switch(key)
  77. {
  78. case ' ':
  79. viewer.core.is_animating = !viewer.core.is_animating;
  80. return true;
  81. }
  82. return false;
  83. }
  84. int main(int argc, char *argv[])
  85. {
  86. using namespace Eigen;
  87. using namespace std;
  88. igl::readOFF(TUTORIAL_SHARED_PATH "/decimated-knight.off",V,F);
  89. U=V;
  90. igl::readDMAT(TUTORIAL_SHARED_PATH "/decimated-knight-selection.dmat",S);
  91. // vertices in selection
  92. igl::colon<int>(0,V.rows()-1,b);
  93. b.conservativeResize(stable_partition( b.data(), b.data()+b.size(),
  94. [](int i)->bool{return S(i)>=0;})-b.data());
  95. // Centroid
  96. mid = 0.5*(V.colwise().maxCoeff() + V.colwise().minCoeff());
  97. // Precomputation
  98. arap_data.max_iter = 100;
  99. igl::arap_precomputation(V,F,V.cols(),b,arap_data);
  100. // Set color based on selection
  101. MatrixXd C(F.rows(),3);
  102. RowVector3d purple(80.0/255.0,64.0/255.0,255.0/255.0);
  103. RowVector3d gold(255.0/255.0,228.0/255.0,58.0/255.0);
  104. for(int f = 0;f<F.rows();f++)
  105. {
  106. if( S(F(f,0))>=0 && S(F(f,1))>=0 && S(F(f,2))>=0)
  107. {
  108. C.row(f) = purple;
  109. }else
  110. {
  111. C.row(f) = gold;
  112. }
  113. }
  114. // Plot the mesh with pseudocolors
  115. igl::viewer::Viewer viewer;
  116. viewer.data.set_mesh(U, F);
  117. viewer.data.set_colors(C);
  118. viewer.callback_pre_draw = &pre_draw;
  119. viewer.callback_key_down = &key_down;
  120. viewer.core.is_animating = false;
  121. viewer.core.animation_max_fps = 30.;
  122. cout<<
  123. "Press [space] to toggle animation"<<endl;
  124. viewer.launch();
  125. }