You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

79 lines
2.0 KiB

#include <igl/avg_edge_length.h>
#include <igl/per_vertex_normals.h>
#include <igl/readOFF.h>
#include <igl/embree/ambient_occlusion.h>
#include <igl/opengl/glfw/Viewer.h>
#include <iostream>
// Mesh
Eigen::MatrixXd V;
Eigen::MatrixXi F;
Eigen::VectorXd AO;
// It allows to change the degree of the field when a number is pressed
bool key_down(igl::opengl::glfw::Viewer& viewer, unsigned char key, int modifier)
{
using namespace Eigen;
using namespace std;
const RowVector3d color(0.9,0.85,0.9);
switch(key)
{
case '1':
// Show the mesh without the ambient occlusion factor
viewer.data().set_colors(color);
break;
case '2':
{
// Show the mesh with the ambient occlusion factor
MatrixXd C = color.replicate(V.rows(),1);
for (unsigned i=0; i<C.rows();++i)
C.row(i) *= AO(i);//std::min<double>(AO(i)+0.2,1);
viewer.data().set_colors(C);
break;
}
case '.':
viewer.core().lighting_factor += 0.1;
break;
case ',':
viewer.core().lighting_factor -= 0.1;
break;
default: break;
}
viewer.core().lighting_factor =
std::min(std::max(viewer.core().lighting_factor,0.f),1.f);
return false;
}
int main(int argc, char *argv[])
{
using namespace std;
using namespace Eigen;
cout<<
"Press 1 to turn off Ambient Occlusion"<<endl<<
"Press 2 to turn on Ambient Occlusion"<<endl<<
"Press . to turn up lighting"<<endl<<
"Press , to turn down lighting"<<endl;
// Load a mesh in OFF format
igl::readOFF(TUTORIAL_SHARED_PATH "/fertility.off", V, F);
MatrixXd N;
igl::per_vertex_normals(V,F,N);
// Compute ambient occlusion factor using embree
igl::embree::ambient_occlusion(V,F,V,N,500,AO);
AO = 1.0 - AO.array();
// Show mesh
igl::opengl::glfw::Viewer viewer;
viewer.data().set_mesh(V, F);
viewer.callback_key_down = &key_down;
key_down(viewer,'2',0);
viewer.data().show_lines = false;
viewer.core().lighting_factor = 0.0f;
viewer.launch();
}