main.cpp 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. #include <igl/read_triangle_mesh.h>
  2. #include <igl/get_seconds.h>
  3. #include <igl/material_colors.h>
  4. #include <igl/swept_volume.h>
  5. #include <igl/opengl/glfw/Viewer.h>
  6. #include <igl/PI.h>
  7. #include <Eigen/Core>
  8. #include <iostream>
  9. int main(int argc, char * argv[])
  10. {
  11. using namespace std;
  12. using namespace igl;
  13. Eigen::MatrixXi F,SF;
  14. Eigen::MatrixXd V,SV,VT;
  15. bool show_swept_volume = false;
  16. // Define a rigid motion
  17. const auto & transform = [](const double t)->Eigen::Affine3d
  18. {
  19. Eigen::Affine3d T = Eigen::Affine3d::Identity();
  20. T.rotate(Eigen::AngleAxisd(t*2.*igl::PI,Eigen::Vector3d(0,1,0)));
  21. T.translate(Eigen::Vector3d(0,0.125*cos(2.*igl::PI*t),0));
  22. return T;
  23. };
  24. // Read in inputs as double precision floating point meshes
  25. read_triangle_mesh(
  26. TUTORIAL_SHARED_PATH "/bunny.off",V,F);
  27. cout<<R"(Usage:
  28. [space] Toggle between transforming original mesh and swept volume
  29. )";
  30. igl::opengl::glfw::Viewer viewer;
  31. viewer.data().set_mesh(V,F);
  32. viewer.data().set_face_based(true);
  33. viewer.core().is_animating = !show_swept_volume;
  34. const int grid_size = 50;
  35. const int time_steps = 200;
  36. const double isolevel = 0.1;
  37. std::cerr<<"Computing swept volume...";
  38. igl::swept_volume(
  39. V,F,transform,time_steps,grid_size,isolevel,SV,SF);
  40. std::cerr<<" finished."<<std::endl;
  41. viewer.callback_pre_draw =
  42. [&](igl::opengl::glfw::Viewer & viewer)->bool
  43. {
  44. if(!show_swept_volume)
  45. {
  46. Eigen::Affine3d T = transform(0.25*igl::get_seconds());
  47. VT = V*T.matrix().block(0,0,3,3).transpose();
  48. Eigen::RowVector3d trans = T.matrix().block(0,3,3,1).transpose();
  49. VT = ( VT.rowwise() + trans).eval();
  50. viewer.data().set_vertices(VT);
  51. viewer.data().compute_normals();
  52. }
  53. return false;
  54. };
  55. viewer.callback_key_down =
  56. [&](igl::opengl::glfw::Viewer & viewer, unsigned char key, int mod)->bool
  57. {
  58. switch(key)
  59. {
  60. default:
  61. return false;
  62. case ' ':
  63. show_swept_volume = !show_swept_volume;
  64. viewer.data().clear();
  65. if(show_swept_volume)
  66. {
  67. viewer.data().set_mesh(SV,SF);
  68. Eigen::Vector3d ambient = Eigen::Vector3d(SILVER_AMBIENT[0], SILVER_AMBIENT[1], SILVER_AMBIENT[2]);
  69. Eigen::Vector3d diffuse = Eigen::Vector3d(SILVER_DIFFUSE[0], SILVER_DIFFUSE[1], SILVER_DIFFUSE[2]);
  70. Eigen::Vector3d specular = Eigen::Vector3d(SILVER_SPECULAR[0], SILVER_SPECULAR[1], SILVER_SPECULAR[2]);
  71. viewer.data().uniform_colors(ambient,diffuse,specular);
  72. }
  73. else
  74. {
  75. viewer.data().set_mesh(V,F);
  76. }
  77. viewer.core().is_animating = !show_swept_volume;
  78. viewer.data().set_face_based(true);
  79. break;
  80. }
  81. return true;
  82. };
  83. viewer.launch();
  84. }