pendulum_3d.py 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. """Double pendulum in 3D"""
  2. # Original idea and solution using sympy from:
  3. # https://www.youtube.com/watch?v=MtG9cueB548
  4. import time
  5. from vedo import *
  6. # Load the solution:
  7. x1, y1, z1, x2, y2, z2 = np.load(download(dataurl+'3Dpen.npy'))
  8. p1, p2 = np.c_[x1,y1,z1], np.c_[x2,y2,z2]
  9. ball1 = Sphere(p1[0], r=0.1).color("green5")
  10. ball2 = Sphere(p2[0], r=0.1).color("blue5")
  11. ball1.add_shadow('z', -3)
  12. ball2.add_shadow('z', -3)
  13. ball1.add_trail(n=10)
  14. ball2.add_trail(n=10)
  15. ball1.trail.add_shadow('z', -3) # make trails project a shadow too
  16. ball2.trail.add_shadow('z', -3)
  17. rod1 = Line([0,0,0], ball1, lw=4).add_shadow('z', -3)
  18. rod2 = Line(ball1, ball2, lw=4).add_shadow('z', -3)
  19. axes = Axes(xrange=(-3,3), yrange=(-3,3), zrange=(-3,3))
  20. # show the solution
  21. plt = Plotter(interactive=False)
  22. plt.show(ball1, ball2, rod1, rod2, axes, __doc__, viewup='z')
  23. i = 0
  24. for b1, b2 in zip(p1,p2):
  25. ball1.pos(b1)
  26. ball2.pos(b2)
  27. ball1.update_trail().update_shadows()
  28. ball2.update_trail().update_shadows()
  29. rod1.points = [[0,0,0], b1]
  30. rod2.points = [b1, b2]
  31. rod1.update_shadows()
  32. rod2.update_shadows()
  33. plt.render()
  34. time.sleep(0.03)
  35. i += 1
  36. if i > 100:
  37. break
  38. plt.interactive().close()