main.cpp 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. #include <igl/read_triangle_mesh.h>
  2. #include <igl/AABB.h>
  3. #include <igl/unique.h>
  4. #include <igl/opengl/glfw/Viewer.h>
  5. #include <igl/predicates/find_intersections.h>
  6. Eigen::MatrixXd V1,V2;
  7. Eigen::MatrixXi F1,F2;
  8. int mid_1, mid_2;
  9. igl::AABB<Eigen::MatrixXd,3> tree;
  10. double min_z,max_z;
  11. double slice_z;
  12. void update_visualization(igl::opengl::glfw::Viewer & viewer)
  13. {
  14. //shifted intersection object
  15. Eigen::MatrixXd V2_(V2.rows(),V2.cols());
  16. V2_<< V2.col(0), V2.col(1), V2.col(2).array()+slice_z;
  17. viewer.data_list[mid_2].set_vertices(V2_);
  18. Eigen::MatrixXi IF,EE;
  19. Eigen::MatrixXd EV;
  20. Eigen::VectorXi EI;
  21. Eigen::Array<bool,Eigen::Dynamic,1> CP;
  22. igl::predicates::find_intersections(tree, V1,F1, V2_,F2,IF,CP,EV,EE,EI);
  23. // Plot the edges of the intersects
  24. viewer.data_list[mid_1].set_edges( EV,EE, Eigen::RowVector3d(1,1,1));
  25. // show faces which are intersected
  26. Eigen::VectorXi I;
  27. igl::unique(IF.col(0).eval(),I);
  28. Eigen::VectorXd D = Eigen::MatrixXd::Zero(F1.rows(),1);
  29. D(I).setConstant(1.0);
  30. viewer.data_list[mid_1].set_data(D,0,1,igl::COLOR_MAP_TYPE_PARULA);
  31. igl::unique(IF.col(1).eval(),I);
  32. D = Eigen::MatrixXd::Zero(F2.rows(),1);
  33. D(I).setConstant(1.0);
  34. viewer.data_list[mid_2].set_data(D,0,1,igl::COLOR_MAP_TYPE_JET);
  35. }
  36. bool key_down(igl::opengl::glfw::Viewer& viewer, unsigned char key, int mod)
  37. {
  38. switch(key)
  39. {
  40. default:
  41. return false;
  42. case '.':
  43. slice_z = std::min(slice_z+0.01,max_z);
  44. break;
  45. case ',':
  46. slice_z = std::max(slice_z-0.01,min_z);
  47. break;
  48. }
  49. update_visualization(viewer);
  50. return true;
  51. }
  52. int main(int argc, char *argv[])
  53. {
  54. // Load two meshes
  55. igl::read_triangle_mesh(
  56. argc<=1?TUTORIAL_SHARED_PATH "/cow.off" :argv[1],V1,F1);
  57. igl::read_triangle_mesh(
  58. argc<=2?TUTORIAL_SHARED_PATH "/planexy.off":argv[2],V2,F2);
  59. // initialize AABB tree with first mesh (it doesn't move)
  60. tree.init(V1,F1);
  61. std::cout<<"Usage:"<<std::endl;
  62. std::cout<<"'.'/',' push back/pull forward slicing plane."<<std::endl;
  63. std::cout<<std::endl;
  64. if(argc<=2)
  65. {
  66. min_z=V1.col(2).minCoeff();
  67. max_z=V1.col(2).maxCoeff();
  68. slice_z=(max_z+min_z)/2;
  69. }else
  70. {
  71. slice_z = 0;
  72. }
  73. //center slicing object
  74. V2.col(2).array() -= V2.col(2).array().mean();
  75. // Plot the mesh
  76. igl::opengl::glfw::Viewer viewer;
  77. viewer.data().set_mesh(V2, F2);
  78. viewer.data().set_face_based(true);
  79. mid_2 = viewer.selected_data_index;
  80. viewer.append_mesh();
  81. viewer.data().set_mesh(V1, F1);
  82. viewer.data().set_face_based(true);
  83. mid_1 = viewer.selected_data_index;
  84. update_visualization(viewer);
  85. viewer.callback_key_down = &key_down;
  86. // show the cow closer
  87. viewer.core().camera_zoom = 2.0;
  88. // Launch the viewer
  89. viewer.launch();
  90. }