bool key_down(igl::opengl::glfw::Viewer &viewer, unsigned char key, int mods) { switch(key) { case ' ': viewer.core().is_animating = !viewer.core().is_animating; return true; case 'D': case 'd': deformation_field = !deformation_field; return true; } return false; }
bool pre_draw(igl::opengl::glfw::Viewer & viewer) { using namespace Eigen; // Determine boundary conditions if(viewer.core().is_animating) { bc_frac += bc_dir; bc_dir *= (bc_frac>=1.0 || bc_frac<=0.0?-1.0:1.0); } const MatrixXd U_bc_anim = V_bc+bc_frac*(U_bc-V_bc); if(deformation_field) { MatrixXd D; MatrixXd D_bc = U_bc_anim - V_bc; igl::harmonic(V,F,b,D_bc,2,D); U = V+D; }else { igl::harmonic(V,F,b,U_bc_anim,2.,U); } viewer.data().set_vertices(U); viewer.data().compute_normals(); return false; }