Bonjour à tous,
Aujourd’hui, un article plus technique que artistique :)

Point de départ

Durant les derniers mois, j’ai commencé à créer un Rig de bipède, basé sur les propriétés de plusieurs rigs “habituels”. Ces propriétés ne sont pas le sujet de cet article.

Le fait est que la première version de ce rig était complètement buggé. Les fonctionnalités du rig sont bien là, mais il y avait des comportements bizarres dans certains cas.

Cetains gif sont assez lourd, soyez patient :)

A noter que le modèle utilisé pour ce rig est © 2012 Nathan Vegdahl and The Blender Foundation, sous license CC BY 3.0, et est téléchargeable sur le Blender Cloud.

Comme on peut le voir sur le premier gif, il y a quelques secousses quand on bouge certains os.

Sur le deuxième gif, on peut voir que lorsqu’on réinitialise les transformations de tous les os, on doit réaliser cette opération plusieurs fois pour que cela soir réellement fait.

Qu’est ce qui ne va pas avec ce rig ?

La façon la plus simple de trouver ce qui ne va pas est d’afficher la console :

Il y a des erreurs détectées (particulièrement quand on bascule du mode Edit au mode Pose)

Graphe de dépendance et cycles

Il est temps de comprendre ce qui se cache réellement derrière ces mots. Un graphe de dépendance est un manière de stoquer l’ensemble des relations entre les “objets” dans Blender. 2 “objets” (il peut s’agit d’objets, de matériaux, de textures, d’os, etc…) sont liés si certains paramètres du 2ème objet dépendent du premier objet (par leur position, couleur, ou autre données). L’objet 2 est donc lié à l’objet 1. Le graphe de dépendance est un graphe global qui représente tous les liens entre l’ensemble des données dans Blender.

Voici un exemple de ce qu’on peut voir sur le site wiki.blender.org, sur la page Dependency graph:

Dans cet exemple, le graphe va du tube à la scène. Un cycle de dépendance est créé quand un noeud B est dépendant d’un noeud A, mais que le noeud A est aussi dépendant du noeud B (avec potentiellement des noeuds intermédiaires). Dans l’exemple, un cycle serait créé si le tube est dépendant du plan (parce que le plan est déjà dépendant du tube).

Quelques exemples concernant le Rigging

Dans les exemples suivcant, je vais montrer quelques cycles de dépendances, au niveau des os d’un rig. Les os peuvent être liés de deux manières différentes :

  • Par contraintes
  • Par parentage

Exemple 1

Dans cet exemple, (.blend), 3 os sont liés par des contraintes Copy Location.



Resultat : Aucun des os ne peut bouger !

Exemple 2

Dans cet exemple (.blend) , non seulement les contraintes Copy Location sont utilisées, mais aussi le parentage (parentage sans être connectés).



Resultat, quand on essaie de bouger l’os Bone.001 (en haut) :

Il y a des mouvements étranges. Remettre les valeurs par défaut ne fonctionne pas, sauf si on passe en mode Edit.

Example 3

Cet exemple (.blend) est assez similaire à l’exemple 2, mais utilise une contrainte IK au lieu de Stretch To.

A noter que la contrainte IK ne s’applique pas seulement à un os (en jaune), mais c’est toute la chaine qui est contrainte.



Même résultat quant on essaie de bouger la cible de la contrainte IK. Same result when trying to move the IK target :

Exemple 4

Cet exemple (.blend) est différent des autres, puisqu’il lie des os et des objets.



Comme on peut le voir, le graphe de dépendance reste au niveau objet. Ce qui signifie que l’armature est vu comme un seul objet, et qu’un autre graphe de dépendance, à l’intérieur de l’armature, est utilisé pour évaluer les relations entre les os.

Resultat : Ca vibre.

Une refonte complète du graphe de dépendance est en cours, pendant le projet Goosberry. Avec la nouvelle version du graphe de dépendance, la granularité des noeuds du graphe de dépendance principal sera descendu jusqu’au niveau des os. Ce qui signifie que cet exemple ne sera plus un cycle de dépendance, et pourrra être représenté comme cela :

Exemple 5

Ce dernier exemple (.blend) montre les limitation de la détection des cycles de dépendance.



Manipuler ce rig ne montre pas de comportement incohérent, sauf quand on essaie de réinitialiser les valeurs.

Debugger mon rig

Après ces exemples assez simples, retournons à mon rig buggé ! J’ai développé un script capable de visualiser les graphes de dépendances de mes armature, utilisant Graphviz. Voici une première image que j’ai généré. Les liens de parenté sont en noir, les contraintes de position en rouge, de rotation en bleue, de mise à l’échelle en vert.

La première que l’on peut voir, en haut à gauche, est que les os MCH-ST et spine.def sont assez séparés des autres os. En regardant les os spine.def, on voit que ces os de déformation sont utilisés, via des contraintes, pour modifier la valeur d’autres os. C’est une grosse erreur dans mon rig.

En utilisant ce code, j’ai essayé de visualiser les cycles de dépendance dans mon rig (en rouge).

Puisque j’ai mis mon os dans des calques spécifiques, mon rig est relativement bien organisé. Chaque chaine se trouve dans un calque différent, j’ai donc modifié mon script pour regrouper les os dans les calques.

A partir de ces informations, j’ai réfléchi aux fonctionnalité de mon rig, et comment le simplifier tout en gardant les même fonctionnalités, en évitant les cycles de dépendance.

Et j’ai gagné :)

Mon nouveau rig est fonctionnel, sans cycle de dépendance, sans comportement bizarre.

Voici le nouveau graphe de l’armature :