#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include typedef std::vector > RotationList; const Eigen::RowVector3d sea_green(70./255.,252./255.,167./255.); Eigen::MatrixXd V,U,M; Eigen::MatrixXi F; Eigen::VectorXi S,b; Eigen::MatrixXd L; Eigen::RowVector3d mid; double anim_t = 0.0; double anim_t_dir = 0.03; double bbd = 1.0; bool resolve = true; igl::ARAPData arap_data,arap_grouped_data; igl::ArapDOFData arap_dof_data; Eigen::SparseMatrix Aeq; enum ModeType { MODE_TYPE_ARAP = 0, MODE_TYPE_ARAP_GROUPED = 1, MODE_TYPE_ARAP_DOF = 2, NUM_MODE_TYPES = 4 } mode = MODE_TYPE_ARAP; bool pre_draw(igl::Viewer & viewer) { using namespace Eigen; using namespace std; if(resolve) { MatrixXd bc(b.size(),V.cols()); VectorXd Beq(3*b.size()); for(int i = 0;i S = W.array().rowwise().maxCoeff()==1; //igl::colon(0,V.rows()-1,b); //b.conservativeResize(stable_partition( b.data(), b.data()+b.size(), // [&](int i)->bool{return S(i);})-b.data()); { VectorXd maxW; igl::mat_max(W,1,maxW,b); } // Precomputation for FAST // number of weights const int m = W.cols(); Aeq.resize(m*3,m*3*(3+1)); vector > ijv; for(int i = 0;i(3*i + d,i + c*m*3 + d*m, homo(c))); } } } Aeq.setFromTriplets(ijv.begin(),ijv.end()); igl::arap_dof_precomputation(V,F,M,G,arap_dof_data); igl::arap_dof_recomputation(VectorXi(),Aeq,arap_dof_data); // Initialize MatrixXd Istack = MatrixXd::Identity(3,3+1).replicate(1,m); igl::columnize(Istack,m,2,L); // Precomputation for ARAP arap_data.max_iter = 1; igl::arap_precomputation(V,F,V.cols(),b,arap_data); // Grouped arap arap_grouped_data.max_iter = 2; arap_grouped_data.G = G; igl::arap_precomputation(V,F,V.cols(),b,arap_grouped_data); // bounding box diagonal bbd = (V.colwise().maxCoeff()- V.colwise().minCoeff()).norm(); // Plot the mesh with pseudocolors igl::Viewer viewer; viewer.set_mesh(U, F); viewer.add_points(igl::slice(V,b,1),sea_green); viewer.core.show_lines = false; viewer.callback_pre_draw = &pre_draw; viewer.callback_key_down = &key_down; viewer.core.is_animating = false; viewer.core.animation_max_fps = 30.; cout<< "Press [space] to toggle animation"<