main.cpp 2.0 KB

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