706_FacetOrientation.py 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. import sys, os
  2. # Add the igl library to the modules search path
  3. sys.path.insert(0, os.getcwd() + "/../")
  4. import pyigl as igl
  5. from shared import TUTORIAL_SHARED_PATH, check_dependencies, print_usage
  6. dependencies = ["embree", "viewer"]
  7. check_dependencies(dependencies)
  8. def key_down(viewer, key, modifier):
  9. global facetwise, is_showing_reoriented, FF
  10. if key == ord('F') or key == ord('f'):
  11. facetwise = (facetwise + 1) % 2
  12. elif key == ord('S') or key == ord('s'):
  13. scramble_colors()
  14. elif key == ord(' '):
  15. is_showing_reoriented = ~is_showing_reoriented
  16. viewer.data.clear()
  17. viewer.data.set_mesh(V, FF[facetwise] if is_showing_reoriented else F)
  18. viewer.data.set_colors(RGBcolors[facetwise])
  19. return True
  20. def scramble_colors():
  21. global C, viewer, RGBcolors
  22. for p in range(2):
  23. R = igl.eigen.MatrixXi()
  24. igl.randperm(C[p].maxCoeff() + 1, R)
  25. C[p] = igl.slice(R, igl.eigen.MatrixXi(C[p]))
  26. HSV = igl.eigen.MatrixXd(C[p].rows(), 3)
  27. HSV.setCol(0, 360.0 * C[p].castdouble() / C[p].maxCoeff())
  28. HSVright = igl.eigen.MatrixXd(HSV.rows(), 2)
  29. HSVright.setConstant(1.0)
  30. HSV.setRightCols(2, HSVright)
  31. igl.hsv_to_rgb(HSV, RGBcolors[p])
  32. viewer.data.set_colors(RGBcolors[facetwise])
  33. if __name__ == "__main__":
  34. keys = {"space": "toggle between original and reoriented faces",
  35. "F,f": "toggle between patchwise and facetwise reorientation",
  36. "S,s": "scramble colors"}
  37. print_usage(keys)
  38. V = igl.eigen.MatrixXd()
  39. F = igl.eigen.MatrixXi()
  40. C = [igl.eigen.MatrixXi(), igl.eigen.MatrixXi()]
  41. RGBcolors = [igl.eigen.MatrixXd(), igl.eigen.MatrixXd()]
  42. FF = [igl.eigen.MatrixXi(), igl.eigen.MatrixXi()]
  43. is_showing_reoriented = False
  44. facetwise = 0
  45. igl.read_triangle_mesh(TUTORIAL_SHARED_PATH + "truck.obj", V, F)
  46. # Compute patches
  47. for p in range(2):
  48. I = igl.eigen.MatrixXi()
  49. igl.embree.reorient_facets_raycast(V, F, F.rows() * 100, 10, p == 1, False, False, I, C[p])
  50. # apply reorientation
  51. FF[p].conservativeResize(F.rows(), F.cols())
  52. for i in range(I.rows()):
  53. if I[i]:
  54. FF[p].setRow(i, F.row(i).rowwiseReverse())
  55. else:
  56. FF[p].setRow(i, F.row(i))
  57. # Plot the generated mesh
  58. viewer = igl.viewer.Viewer()
  59. viewer.data.set_mesh(V, FF[facetwise] if is_showing_reoriented else F)
  60. viewer.data.set_face_based(True)
  61. scramble_colors()
  62. viewer.callback_key_down = key_down
  63. viewer.launch()