precomputation.cpp 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. #include "precomputation.h"
  2. #include <igl/arap.h>
  3. #include <igl/arap_dof.h>
  4. #include <igl/lbs_matrix.h>
  5. #include <igl/columnize.h>
  6. #include <igl/partition.h>
  7. #include <igl/max.h>
  8. void precomputation(
  9. const Eigen::MatrixXd & V,
  10. const Eigen::MatrixXi & F,
  11. const Eigen::MatrixXd & W,
  12. Eigen::MatrixXd & M,
  13. Eigen::VectorXi & b,
  14. Eigen::MatrixXd & L,
  15. igl::ARAPData & arap_data,
  16. igl::ARAPData & arap_grouped_data,
  17. igl::ArapDOFData<Eigen::MatrixXd,double> & arap_dof_data)
  18. {
  19. using namespace Eigen;
  20. using namespace std;
  21. igl::lbs_matrix_column(V,W,M);
  22. // Cluster according to weights
  23. VectorXi G;
  24. {
  25. VectorXi S;
  26. VectorXd D;
  27. igl::partition(W,50,G,S,D);
  28. }
  29. // vertices corresponding to handles (those with maximum weight)
  30. {
  31. VectorXd maxW;
  32. igl::max(W,1,maxW,b);
  33. }
  34. // Precomputation for FAST
  35. cout<<"Initializing Fast Automatic Skinning Transformations..."<<endl;
  36. // number of weights
  37. const int m = W.cols();
  38. Eigen::SparseMatrix<double> Aeq;
  39. Aeq.resize(m*3,m*3*(3+1));
  40. vector<Triplet<double> > ijv;
  41. for(int i = 0;i<m;i++)
  42. {
  43. RowVector4d homo;
  44. homo << V.row(b(i)),1.;
  45. for(int d = 0;d<3;d++)
  46. {
  47. for(int c = 0;c<(3+1);c++)
  48. {
  49. ijv.push_back(Triplet<double>(3*i + d,i + c*m*3 + d*m, homo(c)));
  50. }
  51. }
  52. }
  53. Aeq.setFromTriplets(ijv.begin(),ijv.end());
  54. igl::arap_dof_precomputation(V,F,M,G,arap_dof_data);
  55. igl::arap_dof_recomputation(VectorXi(),Aeq,arap_dof_data);
  56. // Initialize
  57. MatrixXd Istack = MatrixXd::Identity(3,3+1).replicate(1,m);
  58. igl::columnize(Istack,m,2,L);
  59. // Precomputation for ARAP
  60. cout<<"Initializing ARAP..."<<endl;
  61. arap_data.max_iter = 1;
  62. igl::arap_precomputation(V,F,V.cols(),b,arap_data);
  63. // Grouped arap
  64. cout<<"Initializing ARAP with grouped edge-sets..."<<endl;
  65. arap_grouped_data.max_iter = 2;
  66. arap_grouped_data.G = G;
  67. igl::arap_precomputation(V,F,V.cols(),b,arap_grouped_data);
  68. }