|
| 1 | +import numpy as np |
| 2 | + |
| 3 | +from moviepy.editor import * |
| 4 | +from moviepy.video.tools.segmenting import findObjects |
| 5 | + |
| 6 | +# WE CREATE THE TEXT THAT IS GOING TO MOVE, WE CENTER IT. |
| 7 | + |
| 8 | +screensize = (720,460) |
| 9 | +txtClip = TextClip('Cool effect',color='white', font="Amiri-Bold", |
| 10 | + kerning = 5, fontsize=100) |
| 11 | +cvc = CompositeVideoClip( [txtClip.set_pos('center')], |
| 12 | + size=screensize) |
| 13 | + |
| 14 | +# THE NEXT FOUR FUNCTIONS DEFINE FOUR WAYS OF MOVING THE LETTERS |
| 15 | + |
| 16 | + |
| 17 | +# helper function |
| 18 | +rotMatrix = lambda a: np.array( [[np.cos(a),np.sin(a)], |
| 19 | + [-np.sin(a),np.cos(a)]] ) |
| 20 | + |
| 21 | +def vortex(screenpos,i,nletters): |
| 22 | + d = lambda t : 1.0/(0.3+t**8) #damping |
| 23 | + a = i*np.pi/ nletters # angle of the movement |
| 24 | + v = rotMatrix(a).dot([-1,0]) |
| 25 | + if i%2 : v[1] = -v[1] |
| 26 | + return lambda t: screenpos+400*d(t)*rotMatrix(0.5*d(t)*a).dot(v) |
| 27 | + |
| 28 | +def cascade(screenpos,i,nletters): |
| 29 | + v = np.array([0,-1]) |
| 30 | + d = lambda t : 1 if t<0 else abs(np.sinc(t)/(1+t**4)) |
| 31 | + return lambda t: screenpos+v*400*d(t-0.15*i) |
| 32 | + |
| 33 | +def arrive(screenpos,i,nletters): |
| 34 | + v = np.array([-1,0]) |
| 35 | + d = lambda t : max(0, 3-3*t) |
| 36 | + return lambda t: screenpos-400*v*d(t-0.2*i) |
| 37 | + |
| 38 | +def vortexout(screenpos,i,nletters): |
| 39 | + d = lambda t : max(0,t) #damping |
| 40 | + a = i*np.pi/ nletters # angle of the movement |
| 41 | + v = rotMatrix(a).dot([-1,0]) |
| 42 | + if i%2 : v[1] = -v[1] |
| 43 | + return lambda t: screenpos+400*d(t-0.1*i)*rotMatrix(-0.2*d(t)*a).dot(v) |
| 44 | + |
| 45 | + |
| 46 | + |
| 47 | +# WE USE THE PLUGIN findObjects TO LOCATE AND SEPARATE EACH LETTER |
| 48 | + |
| 49 | +letters = findObjects(cvc) # a list of ImageClips |
| 50 | + |
| 51 | + |
| 52 | +# WE ANIMATE THE LETTERS |
| 53 | + |
| 54 | +def moveLetters(letters, funcpos): |
| 55 | + return [ letter.set_pos(funcpos(letter.screenpos,i,len(letters))) |
| 56 | + for i,letter in enumerate(letters)] |
| 57 | + |
| 58 | +clips = [ CompositeVideoClip( moveLetters(letters,funcpos), |
| 59 | + size = screensize).subclip(0,5) |
| 60 | + for funcpos in [vortex, cascade, arrive, vortexout] ] |
| 61 | + |
| 62 | +# WE CONCATENATE EVERYTHING AND WRITE TO A FILE |
| 63 | + |
| 64 | +final_clip = concatenate_videoclips(clips) |
| 65 | +final_clip.write_videofile('coolTextEffects.avi',fps=25,codec='mpeg4') |
| 66 | + |
0 commit comments