main.cpp 5.0 KB

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