#include "check_mesh_for_issues.h" #include "get_soft_constraint_for_circle.h" #include "get_cube_corner_constraints.h" #include "param_2d_demo_iter.h" #include #include #include #include #include #include #include #include #include #include #include #include #include void soft_const_demo_iter(igl::opengl::glfw::Viewer& viewer); void deform_3d_demo_iter(igl::opengl::glfw::Viewer& viewer); void display_3d_mesh(igl::opengl::glfw::Viewer& viewer); Eigen::MatrixXd V; Eigen::MatrixXi F; bool first_iter = true; igl::SLIMData sData; igl::Timer timer; double uv_scale_param; enum DEMO_TYPE { PARAM_2D, SOFT_CONST, DEFORM_3D }; DEMO_TYPE demo_type; bool key_down(igl::opengl::glfw::Viewer& viewer, unsigned char key, int modifier){ if (key == ' ') { switch (demo_type) { case PARAM_2D: { param_2d_demo_iter(V,F,uv_scale_param,first_iter,sData,timer,viewer); break; } case SOFT_CONST: { soft_const_demo_iter(viewer); break; } case DEFORM_3D: { deform_3d_demo_iter(viewer); break; } default: break; } } return false; } void soft_const_demo_iter(igl::opengl::glfw::Viewer& viewer) { using namespace std; if (first_iter) { igl::read_triangle_mesh(TUTORIAL_SHARED_PATH "/circle.obj", V, F); check_mesh_for_issues(V,F); cout << "\tMesh is valid!" << endl; Eigen::MatrixXd V_0 = V.block(0,0,V.rows(),2); Eigen::VectorXi b; Eigen::MatrixXd bc; get_soft_constraint_for_circle(V_0,F,b,bc); double soft_const_p = 1e5; slim_precompute(V,F,V_0,sData,igl::MappingEnergyType::SYMMETRIC_DIRICHLET,b,bc,soft_const_p); viewer.data().set_mesh(V, F); viewer.core().align_camera_center(V,F); viewer.data().compute_normals(); viewer.data().show_lines = true; first_iter = false; } else { slim_solve(sData,1); // 1 iter viewer.data().set_mesh(sData.V_o, F); } } void deform_3d_demo_iter(igl::opengl::glfw::Viewer& viewer) { using namespace std; if (first_iter) { timer.start(); igl::readOBJ(TUTORIAL_SHARED_PATH "/cube_40k.obj", V, F); Eigen::MatrixXd V_0 = V; Eigen::VectorXi b; Eigen::MatrixXd bc; get_cube_corner_constraints(V_0,F,b,bc); double soft_const_p = 1e5; sData.exp_factor = 5.0; slim_precompute(V,F,V_0,sData,igl::MappingEnergyType::EXP_CONFORMAL,b,bc,soft_const_p); //cout << "precomputed" << endl; first_iter = false; display_3d_mesh(viewer); } else { timer.start(); slim_solve(sData,1); // 1 iter display_3d_mesh(viewer); } cout << "time = " << timer.getElapsedTime() << endl; cout << "energy = " << sData.energy << endl; } void display_3d_mesh(igl::opengl::glfw::Viewer& viewer) { using namespace std; using namespace Eigen; MatrixXd V_temp; MatrixXi F_temp; Eigen::MatrixXd Barycenters; igl::barycenter(sData.V,sData.F,Barycenters); //cout << "Barycenters.rows() = " << Barycenters.rows() << endl; //double t = double((key - '1')+1) / 9.0; double view_depth = 10.; double t = view_depth/9.; VectorXd v = Barycenters.col(2).array() - Barycenters.col(2).minCoeff(); v /= v.col(0).maxCoeff(); vector s; for (unsigned i=0; i