main.cpp 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. #include <igl/avg_edge_length.h>
  2. #include <igl/per_vertex_normals.h>
  3. #include <igl/readOFF.h>
  4. #include <igl/embree/ambient_occlusion.h>
  5. #include <igl/viewer/Viewer.h>
  6. #include <iostream>
  7. #include "tutorial_shared_path.h"
  8. // Mesh
  9. Eigen::MatrixXd V;
  10. Eigen::MatrixXi F;
  11. Eigen::VectorXd AO;
  12. // It allows to change the degree of the field when a number is pressed
  13. bool key_down(igl::viewer::Viewer& viewer, unsigned char key, int modifier)
  14. {
  15. using namespace Eigen;
  16. using namespace std;
  17. const RowVector3d color(0.9,0.85,0.9);
  18. switch(key)
  19. {
  20. case '1':
  21. // Show the mesh without the ambient occlusion factor
  22. viewer.data.set_colors(color);
  23. break;
  24. case '2':
  25. {
  26. // Show the mesh with the ambient occlusion factor
  27. MatrixXd C = color.replicate(V.rows(),1);
  28. for (unsigned i=0; i<C.rows();++i)
  29. C.row(i) *= AO(i);//std::min<double>(AO(i)+0.2,1);
  30. viewer.data.set_colors(C);
  31. break;
  32. }
  33. case '.':
  34. viewer.core.lighting_factor += 0.1;
  35. break;
  36. case ',':
  37. viewer.core.lighting_factor -= 0.1;
  38. break;
  39. default: break;
  40. }
  41. viewer.core.lighting_factor =
  42. std::min(std::max(viewer.core.lighting_factor,0.f),1.f);
  43. return false;
  44. }
  45. int main(int argc, char *argv[])
  46. {
  47. using namespace std;
  48. using namespace Eigen;
  49. cout<<
  50. "Press 1 to turn off Ambient Occlusion"<<endl<<
  51. "Press 2 to turn on Ambient Occlusion"<<endl<<
  52. "Press . to turn up lighting"<<endl<<
  53. "Press , to turn down lighting"<<endl;
  54. // Load a mesh in OFF format
  55. igl::readOFF(TUTORIAL_SHARED_PATH "/fertility.off", V, F);
  56. MatrixXd N;
  57. igl::per_vertex_normals(V,F,N);
  58. // Compute ambient occlusion factor using embree
  59. igl::embree::ambient_occlusion(V,F,V,N,500,AO);
  60. AO = 1.0 - AO.array();
  61. // Show mesh
  62. igl::viewer::Viewer viewer;
  63. viewer.data.set_mesh(V, F);
  64. viewer.callback_key_down = &key_down;
  65. key_down(viewer,'2',0);
  66. viewer.core.show_lines = false;
  67. viewer.core.lighting_factor = 0.0f;
  68. viewer.launch();
  69. }