main.cpp 2.8 KB

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