Skip to content

Résoudre la surface, pas le squelette ​

Par Oleg Sidorkin, CTO et cofondateur de Cinevva

La première partie comparait quatre outils d'auto-rigging à des rigs d'artistes sur douze animaux CC0 et révélait un défaut commun : chacun d'eux construit les quadrupèdes avec des pattes presque droites. Elle se terminait par un projet de réparation des rigs, car une patte dépourvue de flexion ne peut pas reproduire l'angle de genou défini par un artiste, quelle que soit la qualité du retargeting.

Puis, en débattant des résultats, une question plus simple s'est posée. Pourquoi transférons-nous l'animation entre des squelettes ?

Un squelette est une machine servant à déformer une surface. La surface est ce que voit le joueur, et le clip de l'artiste nous indique déjà exactement où cette surface doit se trouver, sommet par sommet, à chaque frame. Nous pouvons donc complètement ignorer la correspondance entre squelettes. Il suffit de lire une fois le clip de l'artiste, d'enregistrer le maillage déformé, puis de résoudre les transformations du squelette auto-riggé afin que son propre skinning reproduise cette surface aussi fidèlement que possible. On obtient ainsi un clip qui existe nativement dans l'espace du nouveau rig. Ses os pourraient s'appeler bone_0, cela n'aurait aucune importance.

Schéma du pipeline : du clip de l'artiste à la surface déformée, puis à la résolution frame par frame et à un clip dans l'espace propre du rig
Le pipeline complet. À aucun moment il ne fait correspondre un os à un autre, ce qui élimine le problème de correspondance qui occupait l'essentiel de la première partie.

L'idée n'est pas nouvelle dans la littérature. Il s'agit de la moitié consacrée aux transformations dans la décomposition du skinning, le SSDR de Le et Deng publié en 2012, et c'est ainsi que les solveurs de capture de mouvement adaptent des rigs arbitraires à des marqueurs denses. Notre cas est le plus simple : l'outil de rigging a déjà fourni le squelette et les poids, si bien que les seules inconnues sont les transformations des os à chaque frame.

La méthode, et le contrôle qui garantit sa fiabilité ​

À chaque frame, nous recherchons une transformation par os qui minimise la distance entre la surface skinnée du rig et la surface cible. Avec des poids fixes, la meilleure transformation de chaque os possède une solution analytique : un ajustement rigide pondéré obtenu par la méthode des quaternions de Horn. Le skinning linéaire par mélange couple les os par l'intermédiaire des sommets qu'ils partagent. Nous parcourons donc les os à tour de rôle, chaque résolution tenant compte de la contribution actuelle de tous les autres os, jusqu'à ce que le résidu cesse d'évoluer. Chaque frame est initialisée avec le résultat de la précédente.

Tout s'effectue dans l'espace de bind, où l'identité du skinning reste exacte quelles que soient les conventions utilisées lors de l'exportation du fichier. La correspondance entre le maillage de l'artiste et le maillage ressoudé ou subdivisé par l'outil de rigging repose sur le plus proche voisin entre les poses de repos alignées. Elle est exacte ici, car les deux maillages représentent le même animal.

La règle de conception la plus importante était la suivante : une exécution de contrôle doit obligatoirement produire zéro. Nous résolvons le rig de l'artiste par rapport à son propre clip, pour lequel une solution parfaite existe par construction. Si le solveur ne parvient pas à la trouver, aucun de ses autres résultats n'a de sens. Le contrôle atteint 0,008 % de la diagonale du modèle, le pire sommet n'étant décalé que de 0,08 %. C'est le plancher auquel tous les autres résultats sont comparés.

Il a fallu trois tentatives pour obtenir un zéro fiable ​

La première exécution de contrôle plafonnait à 3 % et refusait de descendre, même avec trente fois plus d'itérations. Les raisons méritent d'être consignées, car chacune était invisible de l'extérieur.

La principale était un piège dans l'API. Les versions récentes de three.js ont renommé boneTransform en applyBoneTransform et modifié discrètement son comportement : la nouvelle fonction prend la position d'entrée dans le vecteur qui lui est transmis et ne lit jamais la géométrie. Lorsqu'on lui fournit un vecteur temporaire réutilisé, elle calcule chaque sommet à partir du résultat du sommet précédent. Les cibles obtenues étaient des données absurdes mais plausibles et fluides. Pendant une heure assez embarrassante, elles ont même étayé une théorie détaillée sur l'échelle de l'armature, qui correspondait parfaitement aux chiffres tout en étant entièrement fictive. Le bon point d'entrée est getVertexPosition. Le contrôle a détecté le problème, ce qui justifie à lui seul son existence.

Les deux autres problèmes étaient plus modestes. L'itération de puissance appliquée à la matrice de Horn bloque à environ un millième de degré, car le décalage spectral qui la fait converger écrase aussi l'écart selon lequel elle converge. Nous sommes donc passés aux rotations de Jacobi, exactes pour une matrice 4x4. Par ailleurs, un test d'arrêt anticipé fondé sur la progression relative interrompait les passes alors que le résidu continuait encore à diminuer. Le critère d'arrêt mesure désormais la progression absolue par rapport à l'échelle du modèle.

Ce que chaque outil de rigging peut réellement transmettre ​

Une fois le solveur validé, nous avons résolu deux clips d'artiste, Walk et Gallop, dans chaque rig pour les six animaux pris en charge par tous les outils. Le score représente la part du déplacement de surface de l'animation que le rig est capable de reproduire. Nous lui avons désormais donné un nom : la qualité de transfert.

Nuage de points de la qualité de transfert par outil de rigging pour Walk et Gallop, avec le contrôle de l'artiste proche de 100 % et RigNet proche de 50 %
Qualité = 1 − résidu résolu / amplitude du mouvement, moyennée sur six animaux. La ligne de contrôle correspond au rig de l'artiste résolu par rapport à son propre clip.
rigWalkGallop
artiste (contrôle)99,8 %99,9 %
Anything World94,4 %91,9 %
Tripo92,3 %89,1 %
SkinTokens, avec le squelette de l'artiste82,5 %89,4 %
SkinTokens80,9 %88,0 %
RigNet48,5 %58,3 %

Comparons maintenant ces résultats à ceux de la première partie, car le classement s'inverse.

RigNet présentait la meilleure flexion des pattes parmi les quatre outils et était le seul dont les squelettes réussissaient notre test d'aptitude au pilotage sur les douze animaux. Ici, il perd la moitié de la marche. Ses pires sommets se trouvent à une distance équivalente à 20 à 31 % du modèle par rapport à leur position cible, et l'échec est constant sur les six animaux : la qualité varie de 38 à 59 % pour chacun d'eux. À l'inverse, Tripo et Anything World, qui produisaient les rigs aux pattes les plus droites parmi ceux que nous avons mesurés, transmettent le mieux l'animation.

L'explication est simple une fois formulée. Un clip résolu peut translater les articulations, et pas seulement les faire pivoter, tandis que les pistes de translation par articulation sont des données d'animation parfaitement ordinaires et valides. Lorsque la translation est disponible, une chaîne droite peut tout de même suivre une surface qui se replie. La flexion cesse donc d'être la contrainte déterminante. Le facteur limitant devient alors la capacité des poids de skinning à découper le maillage en parties qui suivent proprement les os. Les poids des outils commerciaux sont bons. Les poids de RigNet, répartis sur ses chaînes irrégulières, ne peuvent pas suivre la surface, quelle que soit la position dans laquelle le solveur déplace les os.

Ces deux mesures répondent donc à deux questions différentes. Le ratio de flexion détermine les poses accessibles à un rig d'exécution piloté par rotations, ce qui correspond au cadre de la première partie. La qualité de transfert détermine ce qu'un clip précalculé et résolu peut exprimer, ce qui correspond au sujet de cet article. Avec ce pipeline de clips résolus, l'outil de rigging que nous utilisons déjà en production atteint 92 %, au lieu de terminer dernier.

Un autre résultat se cache dans ce tableau : fournir à SkinTokens le squelette de l'artiste ne change presque pas son score. Son plafond vient de ses poids, pas du placement de ses articulations.

Le voir plutôt que lui faire aveuglément confiance ​

D'abord les chiffres, puis l'observation. Le même solveur pilote une visionneuse en direct dans laquelle le maillage complet de chaque rig est skinné avec les transformations résolues, superposé sous forme de silhouette sombre à la surface de référence de l'artiste, tandis que chaque sommet est coloré selon son erreur instantanée. Le bleu représente une erreur nulle. Le rouge représente 3 % de la diagonale du modèle ou davantage.

Walk, résolu dans chaque rig. De gauche à droite : référence de l'artiste, Tripo, Anything World, SkinTokens, RigNet. Les pattes de RigNet rougissent et se détachent de la silhouette à chaque pas. Voilà à quoi ressemblent 48 %.
Gallop met tous les rigs davantage à l'épreuve. Observez les pattes arrière en extension complète : Tripo et Anything World tiennent bon, tandis que RigNet se désarticule.

L'image et le tableau ne peuvent pas diverger, car la visionneuse effectue son rendu avec exactement la fonction mesurée par la métrique. Une vue nécessite toutefois une précision : le cerf de SkinTokens n'affiche aucune carte de chaleur. Son maillage compte 181 000 sommets et nous ignorons la correspondance du maillage complet au-delà de 60 000 sommets. Cette vue ne permet donc de juger que la silhouette.

Ce que cela change pour nous ​

Une résolution prend d'une demi-seconde à quelques secondes par clip et par rig, dans du JavaScript exécuté par le navigateur, sans GPU. C'est suffisamment peu coûteux pour précalculer l'ensemble des clips d'un quadrupède au moment de la création du rig. Les clips précalculés simplifient également l'exécution : aucun retargeting de squelette pour les animaux, seulement la lecture des clips dans l'espace propre du rig, complétée par notre verrouillage des pieds existant pour assurer le contact avec le sol.

Cela nous fournit également un deuxième critère d'acceptation. Les contrôles géométriques de la première partie déterminent si un rig est pilotable. La qualité de transfert indique quelle part d'une animation réelle il conservera. Un outil de rigging peut réussir le premier test et échouer au second, ce que fait précisément RigNet.

Les limites, clairement énoncées ​

Le score représente le plafond de chaque rig, pas une promesse. Le solveur peut translater les articulations : la longueur des os n'est donc pas préservée pendant le mouvement, et un rig reposant fortement sur les translations pourrait paraître caoutchouteux dans les poses extrêmes. Les pires sommets du galop, momentanément décalés de 9 à 20 % même sur les bons rigs, apparaissent précisément à ces moments-là. Une variante de la résolution limitée aux rotations permettrait de mesurer honnêtement ce coût, et c'est le chiffre qu'il nous reste à obtenir : elle montrerait quelle part de la pénalité liée aux pattes droites observée dans la première partie subsiste lorsque la translation est exclue.

L'écart avec la production concerne la correspondance. Dans ce benchmark, l'outil de rigging a riggé le même maillage que celui animé par l'artiste, si bien que la mise en correspondance des sommets est triviale. L'animal importé par un utilisateur possède un maillage différent, et lui transférer d'abord le mouvement de surface de l'artiste constitue un problème à part entière, avec des solutions connues que nous n'avons pas encore évaluées.

Enfin, l'échantillon : six animaux, deux clips, 24 frames par clip et des contraintes sous-échantillonnées à cinq mille sommets sur le maillage le plus dense. C'est suffisant pour classer les outils de rigging avec confiance, mais pas pour citer une deuxième décimale.

Les animaux sont des modèles CC0 de Quaternius, la méthode associe un ajustement analytique vieux de quarante ans à beaucoup de patience, et l'exécution de contrôle est la première chose que nous conseillons de construire à quiconque souhaite reproduire ces résultats. Si vous avez déjà résolu des animations dans des rigs et rencontré les mêmes pièges que nous, ou d'autres, nous aimerions comparer nos expériences sur notre Discord.