201_Normals.py 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  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
  6. dependencies = ["viewer"]
  7. check_dependencies(dependencies)
  8. V = igl.eigen.MatrixXd()
  9. F = igl.eigen.MatrixXi()
  10. N_vertices = igl.eigen.MatrixXd()
  11. N_faces = igl.eigen.MatrixXd()
  12. N_corners = igl.eigen.MatrixXd()
  13. # This function is called every time a keyboard button is pressed
  14. def key_pressed(viewer, key, modifier):
  15. if key == ord('1'):
  16. viewer.data.set_normals(N_faces)
  17. return True
  18. elif key == ord('2'):
  19. viewer.data.set_normals(N_vertices)
  20. return True
  21. elif key == ord('3'):
  22. viewer.data.set_normals(N_corners)
  23. return True
  24. return False
  25. # Load a mesh in OFF format
  26. igl.readOFF(TUTORIAL_SHARED_PATH + "fandisk.off", V, F)
  27. # Compute per-face normals
  28. N_faces = igl.eigen.MatrixXd()
  29. igl.per_face_normals(V, F, N_faces)
  30. # Compute per-vertex normals
  31. N_vertices = igl.eigen.MatrixXd()
  32. igl.per_vertex_normals(V, F, igl.PER_VERTEX_NORMALS_WEIGHTING_TYPE_AREA, N_vertices)
  33. # Compute per-corner normals, |dihedral angle| > 20 degrees --> crease
  34. N_corners = igl.eigen.MatrixXd()
  35. igl.per_corner_normals(V, F, 20, N_corners)
  36. # Plot the mesh
  37. viewer = igl.viewer.Viewer()
  38. viewer.callback_key_pressed = key_pressed
  39. viewer.core.show_lines = False
  40. viewer.data.set_mesh(V, F)
  41. viewer.data.set_normals(N_faces)
  42. print("Press '1' for per-face normals.")
  43. print("Press '2' for per-vertex normals.")
  44. print("Press '3' for per-corner normals.")
  45. viewer.launch()