main.cpp 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. #include <igl/opengl/glfw/Viewer.h>
  2. #include <igl/readOBJ.h>
  3. #include <igl/read_triangle_mesh.h>
  4. #include <igl/voxel_grid.h>
  5. #include <igl/tetrahedralized_grid.h>
  6. #include <igl/marching_tets.h>
  7. #include <igl/signed_distance.h>
  8. #include <igl/writeOBJ.h>
  9. #include <igl/get_seconds.h>
  10. #include <igl/marching_cubes.h>
  11. #include <Eigen/Core>
  12. int main(int argc, char * argv[])
  13. {
  14. const auto & tictoc = []()
  15. {
  16. static double t_start = igl::get_seconds();
  17. double diff = igl::get_seconds()-t_start;
  18. t_start += diff;
  19. return diff;
  20. };
  21. // Load a surface mesh which is a cube
  22. Eigen::MatrixXd V;
  23. Eigen::MatrixXi F;
  24. igl::read_triangle_mesh(
  25. argc>1?argv[1]: TUTORIAL_SHARED_PATH "/armadillo.obj",V,F);
  26. Eigen::RowVector3i side;
  27. Eigen::MatrixXd TV;
  28. tictoc();
  29. igl::voxel_grid(V,0,100,1,TV,side);
  30. printf("igl::voxel_grid %g secs\n",tictoc());
  31. Eigen::MatrixXi TT5,TT6;
  32. tictoc();
  33. igl::tetrahedralized_grid(TV,side,igl::TETRAHEDRALIZED_GRID_TYPE_5,TT5);
  34. printf("igl::tetrahedralized_grid %g secs\n",tictoc());
  35. igl::tetrahedralized_grid(TV,side,igl::TETRAHEDRALIZED_GRID_TYPE_6_ROTATIONAL,TT6);
  36. printf("igl::tetrahedralized_grid %g secs\n",tictoc());
  37. tictoc();
  38. Eigen::VectorXd S;
  39. {
  40. Eigen::VectorXi I;
  41. Eigen::MatrixXd C,N;
  42. igl::signed_distance(
  43. TV,V,F,
  44. igl::SIGNED_DISTANCE_TYPE_FAST_WINDING_NUMBER,
  45. std::numeric_limits<double>::min(),
  46. std::numeric_limits<double>::max(),
  47. S,I,C,N);
  48. }
  49. printf("igl::signed_distance %g secs\n",tictoc());
  50. std::vector<Eigen::MatrixXd> SV(3);
  51. std::vector<Eigen::MatrixXi> SF(3);
  52. igl::marching_tets(TV,TT5,S,0,SV[0],SF[0]);
  53. printf("igl::marching_tets5 %g secs\n",tictoc());
  54. igl::marching_tets(TV,TT6,S,0,SV[1],SF[1]);
  55. printf("igl::marching_tets6 %g secs\n",tictoc());
  56. tictoc();
  57. igl::marching_cubes(S,TV,side(0),side(1),side(2),0,SV[2],SF[2]);
  58. printf("igl::marching_cubes %g secs\n",tictoc());
  59. //igl::writeOBJ("tmc.obj",SV,SF);
  60. // Draw the mesh stored in (SV, SF)
  61. igl::opengl::glfw::Viewer vr;
  62. vr.data().set_mesh(V,F);
  63. vr.data().is_visible = false;
  64. vr.append_mesh();
  65. int sel = 0;
  66. const auto update = [&]()
  67. {
  68. vr.data().clear();
  69. vr.data().set_mesh(SV[sel],SF[sel]);
  70. };
  71. vr.callback_key_pressed = [&](decltype(vr) &,unsigned int key, int mod)
  72. {
  73. switch(key)
  74. {
  75. case ',':
  76. case '.':
  77. sel = (sel+SV.size()+(key=='.'?1:-1))%SV.size();
  78. update();
  79. return true;
  80. case ' ':
  81. vr.data_list[0].is_visible = !vr.data_list[0].is_visible;
  82. vr.data_list[1].is_visible = !vr.data_list[1].is_visible;
  83. vr.selected_data_index = (vr.selected_data_index+1)%2;
  84. return true;
  85. }
  86. return false;
  87. };
  88. update();
  89. vr.launch();
  90. }