main.cpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. #include <igl/readOBJ.h>
  2. #include <igl/readDMAT.h>
  3. #include <igl/viewer/Viewer.h>
  4. #include <igl/barycenter.h>
  5. #include <igl/avg_edge_length.h>
  6. #include <igl/comiso/nrosy.h>
  7. #include <igl/comiso/miq.h>
  8. #include <igl/comiso/frame_field.h>
  9. #include <igl/frame_field_deformer.h>
  10. #include <igl/jet.h>
  11. // Input mesh
  12. Eigen::MatrixXd V;
  13. Eigen::MatrixXi F;
  14. // Face barycenters
  15. Eigen::MatrixXd B;
  16. // Scale for visualizing the fields
  17. double global_scale;
  18. // Input frame field constraints
  19. Eigen::VectorXi b;
  20. Eigen::MatrixXd bc1;
  21. Eigen::MatrixXd bc2;
  22. // Interpolated frame field
  23. Eigen::MatrixXd FF1, FF2;
  24. // Singularities od the frame field
  25. Eigen::VectorXd S;
  26. // Deformed mesh
  27. Eigen::MatrixXd V_deformed;
  28. Eigen::MatrixXd B_deformed;
  29. // Frame field on deformed
  30. Eigen::MatrixXd FF1_deformed;
  31. Eigen::MatrixXd FF2_deformed;
  32. // Cross field on deformed
  33. Eigen::MatrixXd X1_deformed;
  34. Eigen::MatrixXd X2_deformed;
  35. // Quad mesh on deformed
  36. Eigen::MatrixXd V_quad_deformed;
  37. Eigen::MatrixXi F_quad_deformed;
  38. // Quad mesh
  39. Eigen::MatrixXd V_quad;
  40. Eigen::MatrixXi F_quad;
  41. bool key_down(igl::Viewer& viewer, unsigned char key, int modifier)
  42. {
  43. using namespace std;
  44. using namespace Eigen;
  45. if (key <'1' || key >'6')
  46. return false;
  47. viewer.clear_mesh();
  48. viewer.options.show_lines = false;
  49. viewer.options.show_texture = false;
  50. if (key == '1')
  51. {
  52. // Frame field constraints
  53. viewer.set_mesh(V, F);
  54. MatrixXd F1_t = MatrixXd::Zero(FF1.rows(),FF1.cols());
  55. MatrixXd F2_t = MatrixXd::Zero(FF2.rows(),FF2.cols());
  56. // Highlight in red the constrained faces
  57. MatrixXd C = MatrixXd::Constant(F.rows(),3,1);
  58. for (unsigned i=0; i<b.size();++i)
  59. {
  60. C.row(b(i)) << 1, 0, 0;
  61. F1_t.row(b(i)) = FF1.row(b(i));
  62. F2_t.row(b(i)) = FF2.row(b(i));
  63. }
  64. viewer.set_colors(C);
  65. MatrixXd C1,C2;
  66. VectorXd K1 = F1_t.rowwise().norm();
  67. VectorXd K2 = F2_t.rowwise().norm();
  68. igl::jet(K1,true,C1);
  69. igl::jet(K2,true,C2);
  70. viewer.add_edges (B - global_scale*F1_t, B + global_scale*F1_t ,C1);
  71. viewer.add_edges (B - global_scale*F2_t, B + global_scale*F2_t ,C2);
  72. }
  73. if (key == '2')
  74. {
  75. // Frame field
  76. viewer.set_mesh(V, F);
  77. MatrixXd C1,C2;
  78. VectorXd K1 = FF1.rowwise().norm();
  79. VectorXd K2 = FF2.rowwise().norm();
  80. igl::jet(K1,true,C1);
  81. igl::jet(K2,true,C2);
  82. viewer.add_edges (B - global_scale*FF1, B + global_scale*FF1 ,C1);
  83. viewer.add_edges (B - global_scale*FF2, B + global_scale*FF2 ,C2);
  84. // Highlight in red the constrained faces
  85. MatrixXd C = MatrixXd::Constant(F.rows(),3,1);
  86. for (unsigned i=0; i<b.size();++i)
  87. C.row(b(i)) << 1, 0, 0;
  88. viewer.set_colors(C);
  89. }
  90. if (key == '3')
  91. {
  92. // Deformed with frame field
  93. viewer.set_mesh(V_deformed, F);
  94. viewer.add_edges (B_deformed, B_deformed + global_scale*FF1_deformed ,Eigen::RowVector3d(1,0,0));
  95. viewer.add_edges (B_deformed, B_deformed + global_scale*FF2_deformed ,Eigen::RowVector3d(0,0,1));
  96. viewer.set_colors(RowVector3d(1,1,1));
  97. }
  98. if (key == '4')
  99. {
  100. // Deformed with cross field
  101. viewer.set_mesh(V_deformed, F);
  102. viewer.add_edges (B, B + global_scale*X1_deformed ,Eigen::RowVector3d(1,0,0));
  103. viewer.add_edges (B, B + global_scale*X2_deformed ,Eigen::RowVector3d(0,0,1));
  104. }
  105. if (key == '5')
  106. {
  107. // Deformed with quad mesh
  108. viewer.set_mesh(V_quad_deformed, F_quad_deformed);
  109. }
  110. if (key == '6')
  111. {
  112. // Deformed with quad mesh
  113. viewer.set_mesh(V_quad, F_quad);
  114. }
  115. return false;
  116. }
  117. int main(int argc, char *argv[])
  118. {
  119. using namespace Eigen;
  120. // Load a mesh in OBJ format
  121. igl::readOBJ("../shared/cube.obj", V, F);
  122. // Compute face barycenters
  123. igl::barycenter(V, F, B);
  124. // Compute scale for visualizing fields
  125. global_scale = .5*igl::avg_edge_length(V, F);
  126. // Load constraints
  127. MatrixXd temp;
  128. igl::readDMAT("../shared/cube.dmat",temp);
  129. b = temp.block(0,0,temp.rows(),1).cast<int>();
  130. bc1 = temp.block(0,1,temp.rows(),3);
  131. bc2 = temp.block(0,4,temp.rows(),3);
  132. // Interpolate the frame field
  133. igl::frame_field(V, F, b, bc1, bc2, FF1, FF2, S);
  134. // Deform the mesh to transform the frame field in a cross field
  135. igl::frame_field_deformer(V,F,FF1,FF2,V_deformed,FF1_deformed,FF2_deformed);
  136. // Compute face barycenters deformed mesh
  137. igl::barycenter(V_deformed, F, B_deformed);
  138. igl::Viewer viewer;
  139. // Plot the original mesh with a texture parametrization
  140. key_down(viewer,'1',0);
  141. // Launch the viewer
  142. viewer.callback_key_down = &key_down;
  143. viewer.launch();
  144. }