main.cpp 2.6 KB

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