Animer plusieurs objets avec les drivers dans Blender
Imaginons que je veux animer ces deux cylindres de cette manière :
Quand l'un rapetisse de 1 unité sur l'axe des z, l'autre grandit de 2 unités sur le même axe, et inversement.
Note : le cercle orange indique que j'ai positionné l'origine de ces cylindres sur un point en bas
Je peux mettre des keyframes sur les propriétés Scale
des deux cylindres. Mais si, finalement, je veux que mon premier cylindre grandisse de 1 unité puis rapetisse de 3 unités, je suis obligé de reprendre les keyframes de l'autre cylindre. Si on multiplie les cylindres et les keyframes, ça peut devenir rapidement fastidieux. Heureusement, on peut piloter l'animation de plusieurs objets par celle d'un seul, grâce aux drivers. Voici comment :
-
Je veux que le cylindre de gauche pilote le cylindre de droite donc je clique sur le cylindre de droite pour le sélectionner, puis dans ses propriétés de transformation (touche N), je fais un clic droit sur
Scale: Z
et je choisisAdd Driver
, ou bien je mets simplement le pointeur de souris sur Scale Z et je fais Ctrl D, ce qui fait apparaître cette fenêtre flottante :
Note : cette fenêtre flottante disparaît dès que le pointeur de la sourir en sort, mais on peut l'afficher de nouveau en faisant un clic droit sur la propriétéScale: Z
et en choisissantEdit Driver
. -
Dans cette fenêtre, je ne m'inquiète pas du message "ERROR: Invalid Python expression" parce que je n'ai pas encore choisi l'objet qui va piloter, et c'est pourquoi le champ
Object:
est en rouge. -
Je clique donc sur ce champ
Object:
pour choisir l'objet "Cylinder", mon cylindre de gauche. (Mon cylindre de droite s'appelle "Cylinder.001" comme on peut le voir en haut de la fenêtre) -
Dans le champ
Type:
, je choisisZ Scale
, c'est-à-dire que je choisis de prendre l'échelle sur l'axe z de mon objet "Cylinder" pour la mettre dans la variable nommée "var". -
Maintenant, j'entre dans le champ
Expression:
la formule que je veux, à savoir : 2 + (3 - var) * 2 - le premier 2, c'est la hauteur de départ de mon cylindre de droite
- le 3, c'est la hauteur de départ de mon cylindre de gauche
- 3 - var, c'est donc la différence entre la hauteur de départ de celui de gauche et sa hauteur actuelle à un moment donné, selon les keyframes qu'on lui applique
- et comme je veux que pour 1 de différence à gauche ça donne -2 à droite, je multiplie par 2
-
Je mets les keyframes que je veux sur mon cylindre de gauche, et voilà le résultat :
Remarque : quand on ouvre un vieux fichier, il me semble qu'on ne peut pas voir en un coup d'œil si on a mis des drivers quelque part. Pour les retrouver, il faut cliquer sur les différentes propriétés ou contraintes de chaque objet pour voir s'il y a une couleur violette. Pour éviter de tâtonner, on peut taper ce code Python dans l'onglet/workspace Scripting :
for obj in bpy.data.objects: if obj.animation_data is not None: for drv in obj.animation_data.drivers: print ('%s.%s → %s' % (obj.name, drv.data_path, drv.driver.expression))
Un exemple plus complexe
Si on veut contraindre un objet à suivre la "croissance" d'une courbe de Bézier, c'est-à-dire la variation des paramètres Start & End Mapping dans l'onglet Data de la courbe (section Geometry), il faut ajouter une contrainte Follow Path dans l'onglet Constraints de l'objet avec les paramètres suivants :
- Cible : la courbe de Bézier à suivre
- Offset : clic droit, Add Driver
Puis entrer ces paramètres dans le driver :
-
Choisir Single Property sous Add Input Variable, à la place de Transform Channel
-
Cliquer sur le picto du champ Prop pour choisir Curve à la place de Object
- Sélectionner la courbe de Bézier qu'on veut suivre
-
Dans le champ Path, saisir la bonne variable (il n'y a pas d'autocomplétion), ici
bevel_factor_start
oubevel_factor_end
-
Remonter sur le champ Expression et entrer la valeur qu'on veut, par exemple
var * -100
pour suivre collé au bout de la courbe ouvar * -50
pour aller deux fois moins vite.
Le "facteur de bevel" de la courbe (qui est libellé Start & End Mapping dans l'interface graphique, tant pis pour la cohérence…) varie de 0 à 1, donc var * -100 donne un offset de 0 % à -100 %, en négatif parce que c'est un décalage par rapport à la position initiale de la courbe donc si on mettait en positif, ça reviendrait à dire que le point serait en quelque sorte hors de la courbe, quelque part dans son prolongement, sans moyen de le visualiser. Le chiffre 100 (keyframes) est une valeur par défaut, modifiable dans l'onglet Data de la courbe, section Path Animation. - Et enfin, pour éviter un décalage au début et à la fin de la courbe, il faut modifier dans l'onglet Data de la courbe, section Geometry, sous-section Start & End Mapping, le champ Mapping Start (et/ou End) sur Spline au lieu de Resolution. Ce n'est pas une question d'interpolation de la courbe d'animation.