main.cpp 2.9 KB

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