Utiliser
un motif de courbe pour contrôler la rotation de plusieurs objets L'objectif de ce script est de déclancher
le mouvement de la chute d'un domino avec un délai de n images.
Pour cela, la courbe est évaluée à l'instant
désiré pour pouvoir modifier la valeur de rotation de l'objet
visée.
#-------------------------
# dominos
# jm soler 07-2003
#------------------------
import Blender
import math
dominos=41
# number of falling objects - 2
for o in range(dominos):
O_='Cube.%03d'%(o+1)
# order is important, ('.001','.002','.003',...)
decalage=5*(o+1)
# first contact with next object
O=Blender.Object.Get(O_)
# get this object : "Cube.0nn", nn=str(o)
C=Blender.Object.Get('Cube') # get original object
I=Blender.Ipo.Get('ObIpo.002') # get teh lone ipo cirve of the
file
Tf=Blender.Get('curframe') # get curframe
number
if Tf>=decalage:
# for this object eval ipo curve
O.RotX=I.curves[0].eval(float(Tf-decalage))/6.2832*1.1
else:
O.RotX=I.curves[0].eval(1.0)/(math.pi*2)*1.06
Le script doit être lié
à la scène courante avec l'option FrameChanging
de manière à ce qu'il s'exécute à chaque calcul
d'image dans l'animation :
Variation sur une surface sphérique:
#-------------------------
# dominos
# jm soler 07-2003
#
# il peut etre necessaire de
# faire alt-p avant de lancer
# l'animation
#------------------------
import Blender
import math
rayon=310.30
name='domino'
dom=Blender.Object.Get()
dominos=0
for d in dom:
if d.name.find(name+'.')!=-1:
dominos+=1
print dominos
#dominos-=1
C=Blender.Object.Get(name) # get
original object
P=Blender.Object.Get('planete')
# get original object
#print P.LocX,P.LocY,P.LocZ
for o in range(dominos):
O_=name+'.%03d'%(o+1)
# order is important, ('.001','.002','.003',...)
decalage=4*(o+1)
# first contact with next object
O=Blender.Object.Get(O_)
# get this object : "Cube.0nn", nn=str(o)
I=Blender.Ipo.Get('ObIpo') # get the
lone ipo cirve of the file
Tf=Blender.Get('curframe') # get curframe
number
if Tf>=decalage+10:
# for this object eval ipo curve
O.RotX=I.curves[0].eval(float(Tf-decalage))/6.2832*1.155-(o*(math.pi*2)/dominos)
else:
try:
#print O.name
O.RotX=I.curves[0].eval(1.0)/(math.pi*2)*1.06-(o*(math.pi*2)/(dominos+1))
O.LocZ=math.cos(o*(math.pi*2)/(dominos+1))*rayon+P.LocZ
O.LocY=math.sin(o*(math.pi*2)/(dominos+1))*rayon+P.LocY
except:
pass