main.cpp 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  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/opengl/glfw/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::opengl::glfw::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::opengl::glfw::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::opengl::glfw::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. Eigen::Vector3d ambient = Eigen::Vector3d(SILVER_AMBIENT[0], SILVER_AMBIENT[1], SILVER_AMBIENT[2]);
  70. Eigen::Vector3d diffuse = Eigen::Vector3d(SILVER_DIFFUSE[0], SILVER_DIFFUSE[1], SILVER_DIFFUSE[2]);
  71. Eigen::Vector3d specular = Eigen::Vector3d(SILVER_SPECULAR[0], SILVER_SPECULAR[1], SILVER_SPECULAR[2]);
  72. viewer.data().uniform_colors(ambient,diffuse,specular);
  73. }
  74. else
  75. {
  76. viewer.data().set_mesh(V,F);
  77. }
  78. viewer.core.is_animating = !show_swept_volume;
  79. viewer.data().set_face_based(true);
  80. break;
  81. }
  82. return true;
  83. };
  84. viewer.launch();
  85. }