1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 |
- """Double pendulum in 3D"""
- # Original idea and solution using sympy from:
- # https://www.youtube.com/watch?v=MtG9cueB548
- import time
- from vedo import *
- # Load the solution:
- x1, y1, z1, x2, y2, z2 = np.load(download(dataurl+'3Dpen.npy'))
- p1, p2 = np.c_[x1,y1,z1], np.c_[x2,y2,z2]
- ball1 = Sphere(p1[0], r=0.1).color("green5")
- ball2 = Sphere(p2[0], r=0.1).color("blue5")
- ball1.add_shadow('z', -3)
- ball2.add_shadow('z', -3)
- ball1.add_trail(n=10)
- ball2.add_trail(n=10)
- ball1.trail.add_shadow('z', -3) # make trails project a shadow too
- ball2.trail.add_shadow('z', -3)
- rod1 = Line([0,0,0], ball1, lw=4).add_shadow('z', -3)
- rod2 = Line(ball1, ball2, lw=4).add_shadow('z', -3)
- axes = Axes(xrange=(-3,3), yrange=(-3,3), zrange=(-3,3))
- # show the solution
- plt = Plotter(interactive=False)
- plt.show(ball1, ball2, rod1, rod2, axes, __doc__, viewup='z')
- i = 0
- for b1, b2 in zip(p1,p2):
- ball1.pos(b1)
- ball2.pos(b2)
- ball1.update_trail().update_shadows()
- ball2.update_trail().update_shadows()
- rod1.points = [[0,0,0], b1]
- rod2.points = [b1, b2]
- rod1.update_shadows()
- rod2.update_shadows()
- plt.render()
- time.sleep(0.03)
- i += 1
- if i > 100:
- break
- plt.interactive().close()
|