707_SweptVolume.py 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. import sys, os
  2. # Add the igl library to the modules search path
  3. from math import pi, cos
  4. sys.path.insert(0, os.getcwd() + "/../")
  5. import pyigl as igl
  6. from shared import TUTORIAL_SHARED_PATH, check_dependencies, print_usage
  7. dependencies = ["copyleft", "viewer"]
  8. check_dependencies(dependencies)
  9. def key_down(viewer, key, modifier):
  10. global show_swept_volume, SV, SF, V, F
  11. if key == ord(' '):
  12. show_swept_volume = not show_swept_volume
  13. viewer.data.clear()
  14. if show_swept_volume:
  15. viewer.data.set_mesh(SV, SF)
  16. viewer.data.uniform_colors(igl.eigen.MatrixXd([0.2, 0.2, 0.2]), igl.eigen.MatrixXd([1.0, 1.0, 1.0]), igl.eigen.MatrixXd([1.0, 1.0, 1.0])) # TODO replace with constants from cpp
  17. else:
  18. viewer.data.set_mesh(V, F)
  19. viewer.core.is_animating = not show_swept_volume
  20. viewer.data.set_face_based(True)
  21. return True
  22. def pre_draw(viewer):
  23. global show_swept_volume, V
  24. if not show_swept_volume:
  25. T = transform(0.25 * igl.get_seconds())
  26. VT = V * T.matrix().block(0, 0, 3, 3).transpose()
  27. trans = T.matrix().block(0, 3, 3, 1).transpose()
  28. Vtrans = igl.eigen.MatrixXd(VT.rows(), VT.cols())
  29. Vtrans.rowwiseSet(trans)
  30. VT += Vtrans
  31. viewer.data.set_vertices(VT)
  32. viewer.data.compute_normals()
  33. return False
  34. # Define a rigid motion
  35. def transform(t):
  36. T = igl.eigen.Affine3d()
  37. T.setIdentity()
  38. T.rotate(t * 2 * pi, igl.eigen.MatrixXd([0, 1, 0]))
  39. T.translate(igl.eigen.MatrixXd([0, 0.125 * cos(2 * pi * t), 0]))
  40. return T
  41. if __name__ == "__main__":
  42. keys = {"space": "toggle between transforming original mesh and swept volume"}
  43. print_usage(keys)
  44. V = igl.eigen.MatrixXd()
  45. SV = igl.eigen.MatrixXd()
  46. VT = igl.eigen.MatrixXd()
  47. F = igl.eigen.MatrixXi()
  48. SF = igl.eigen.MatrixXi()
  49. show_swept_volume = False
  50. grid_size = 50
  51. time_steps = 200
  52. isolevel = 1
  53. igl.read_triangle_mesh(TUTORIAL_SHARED_PATH + "bunny.off", V, F)
  54. print("Computing swept volume...")
  55. igl.copyleft.swept_volume(V, F, transform, time_steps, grid_size, isolevel, SV, SF)
  56. print("...finished.")
  57. # Plot the generated mesh
  58. viewer = igl.viewer.Viewer()
  59. viewer.data.set_mesh(V, F)
  60. viewer.data.set_face_based(True)
  61. viewer.core.is_animating = not show_swept_volume
  62. viewer.callback_pre_draw = pre_draw
  63. viewer.callback_key_down = key_down
  64. viewer.launch()