Skip to content

Animer les queues auxquelles le rigueur n’a jamais donné d’os ​

Par Oleg Sidorkin, CTO et cofondateur de Cinevva

Mis à jour le 11 septembre 2026 : ce que la souris nous a appris ajoute des flexions élastiques, le contact avec le sol et un second type de soulèvement du corps provoqué par la queue.

Un utilisateur a riggé un renard anthropomorphe avec notre rigueur, puis lancé le clip Walk. Le corps était correct. La queue se repliait contre la patte gauche comme une serviette mouillée et se déchirait à la jonction entre les pondérations des pattes gauche et droite. Ce renard sert d’exemple tout au long de cet article, et la correction est maintenant déployée dans le rigueur ainsi que dans la bibliothèque d’exécution qui lit ses clips.

Le renard et la souris présentés dans cet article ont tous deux été générés avec notre générateur de modèles 3D, puis riggés et animés dans Cinevva.

Trois exemplaires d’un renard en train de marcher, vus de dos : le rig d’origine avec sa queue repliée autour de la patte gauche, une queue rigide pendant verticalement et une queue portée vers le haut et l’arrière par une chaîne d’os

De gauche à droite, au milieu d’une foulée et à la même image : le rig tel qu’il est sorti du rigueur, le même rig avec la queue rattachée d’un seul bloc au bassin, puis la queue sur sa propre chaîne d’os, animée par le moteur d’exécution. Vous pouvez tourner autour des trois modèles plus bas.

Pourquoi un rigueur humanoïde produit ce résultat ​

Notre moteur Fast repose sur Make-It-Animatable, qui prédit un squelette fixe de type Mixamo : 22 os pour le corps, ou 65 avec les doigts. Chaque sommet du maillage doit être attribué à l’un de ces os. La queue ne figure pas dans la liste ; le modèle choisit donc la meilleure solution de repli qu’il connaît et attribue les sommets de la queue à la partie du corps la plus proche dans son espace de caractéristiques appris. Pour ce renard, il s’agissait du tibia gauche, le reste étant réparti entre les deux cuisses.

Ce n’est pas un bug de pondération. C’est le gabarit. Aucun prompt ni réglage ne peut faire produire un os de queue au modèle, car il n’existe aucun os de queue qu’il puisse produire. Le même problème touche les ailes, les capes, les cheveux longs et tout ce qui pend depuis le torse.

Avant toute modification, nous avons mesuré le coût de cette erreur sur les 1 582 sommets de la queue du renard. La distance entre chaque sommet et les os qui le déplacent réellement, pondérée par les poids, atteignait en moyenne 47 cm sur un modèle de 191 cm. La queue était pilotée depuis près d’un demi-mètre de distance.

Repérer la queue ​

À ce stade, nous ne disposons que du GLB riggé, et cela suffit. Cette passe fonctionne sur la sortie de n’importe quel rigueur, pas seulement le nôtre.

Un champ de distance autour du squelette. Pour chaque sommet p et chaque segment osseux allant de l’articulation a à l’articulation b dans l’espace de bind, la distance au segment est

d(p,ab)=‖p−(a+t(b−a))‖,t=clamp((p−a)⋅(b−a)∥b−a∥2,0,1)

et la distance d’un sommet au squelette est le minimum obtenu sur tous les segments. Les articulations terminales reçoivent un petit prolongement au-delà de l’articulation afin qu’un museau ou une main ne soit pas considéré comme éloigné de son propre os. Un sommet est éloigné lorsque cette distance dépasse 7 % de la hauteur du modèle. Pour le renard, cela représente 13 cm.

Composantes connexes de peau éloignée. Les sommets éloignés sont regroupés en composantes connexes en suivant les faces du maillage. Un détail nous a coûté une heure : les exportateurs séparent les sommets au niveau des coutures d’UV et des ruptures de normales. Ce maillage compte donc 23 129 sommets, mais seulement 29 081 triangles, et le seul graphe des faces découpe une queue en dizaines d’îlots. Nous fusionnons d’abord les sommets selon leur position, calculons la connexité sur le graphe fusionné, puis réécrivons les poids sur chaque sommet d’origine.

Où la composante est-elle attachée ? Le col d’une composante est l’anneau de sommets non éloignés qui la borde. Son centre indique le point d’attache de la composante, déterminé par l’articulation la plus proche, avec un biais : une articulation du torse ou de la cuisse située à moins de 1,5 fois la distance minimale l’emporte, car autour du bassin les têtes des cuisses sont exactement aussi proches que les hanches, alors qu’une racine de queue placée entre elles appartient au corps. Nous choisissons délibérément de ne pas nous fier aux poids du col. Sur une queue modélisée comme une coque séparée, ce qui est le cas de la plupart des modèles de jeu, le col correspond à l’anneau racine de la queue et porte les mêmes mauvais poids que nous cherchons à corriger.

S’agit-il d’un appendice ou du corps ? Nous appliquons deux tests. La peau éloignée d’un torse épais enveloppe un os, de sorte que son centre de masse retombe sur l’os. Une queue dépasse d’un côté : son centre de masse reste donc éloigné de tous les os. Nous exigeons que la distance entre le centroïde et le squelette atteigne au moins 40 % de la portée de la composante. Vient ensuite un test de forme : avec λ1≥λ2, les deux plus grandes valeurs propres de la covariance de la composante, l’allongement vaut λ1/λ2. Une queue obtient ici un score d’environ 2,6 ; une cape ou une jupe se situe près de 1. Seules les composantes longues attachées au bassin deviennent des chaînes. Les composantes longues attachées à la colonne vertébrale — un fourreau, un carquois ou une sangle — sont portées, et non issues du corps, et restent donc rigidement fixées à leur os d’attache. Les oreilles attachées à la tête ne sont pas modifiées : leur rigidité par rapport à la tête est précisément le comportement souhaité.

La queue du renard était constituée de deux coques superposées — la fourrure au-dessus de la peau, jamais soudées. Les composantes partageant le même point d’attache et dont les boîtes englobantes se chevauchent de plus de moitié sont donc fusionnées. Une queue, une chaîne.

Première étape : la rendre rigide ​

La première correction réaliste prend un après-midi. Chaque sommet de la composante reçoit un poids de 1.0 sur Hips. La queue cesse de se déchirer et se déplace d’un seul bloc avec le bassin. Elle ressemble à une planche : c’est le renard du milieu sur l’image. Nous avons livré cette version comme étape intermédiaire, car son étirement est exactement nul par construction, ce qui en fait une référence utile pour les mesures ci-dessous.

Deuxième étape : créer une chaîne le long de la queue ​

Une coordonnée le long de la queue. Nous exécutons Dijkstra depuis le col vers l’intérieur de la composante, sur les arêtes du maillage pondérées par leur longueur. Chaque sommet de la queue reçoit une distance géodésique g depuis la racine, et le 99e centile de g définit la longueur de la queue L : 81 cm pour le renard, soit 42 % de sa hauteur.

Articulations. Le nombre de segments est K=clamp(round(L/0.1H),3,8), soit quatre pour le renard. L’articulation J0 est le centroïde du col, et l’articulation Ji est le centroïde de la peau dont la distance géodésique se situe à moins d’un demi-segment de iL/K. Deux passes de Ji←12Ji+14(Ji−1+Ji+1) empêchent la chaîne de zigzaguer lorsque la section transversale est asymétrique, ce qui est toujours le cas à l’extrémité d’une queue touffue. Les os vont de Tail_1 à Tail_K, avec en plus un Tail_End sans poids. Ils sont enfants de Hips et partagent la rotation de bind de Hips, de sorte que chacun corresponde à une translation pure dans le repère de son parent. Leurs matrices de bind inverses en découlent directement, et comme les clips existants ne les référencent jamais, rien ne casse en aval.

Poids. Avec s=Kg/L, k=⌊s⌋ et f=s−k, un sommet du segment k appartient à l’os k+1 et partage ses extrémités avec ses voisins :

wprev=clamp(0.5−2f, 0, 0.5),wnext=clamp(2f−1.5, 0, 0.5),wself=1−wprev−wnext

Au niveau d’une articulation, les deux os se partagent les poids à 50/50 ; au milieu d’un segment, un seul os contrôle entièrement la peau. Pour le segment racine, « prev » correspond à Hips, afin que la queue se fonde dans le corps au lieu de former un pli au niveau du col.

Après cette passe, la distance pondérée aux os sur la queue est passée de 47 cm à 17 cm, soit environ le rayon de la queue elle-même. La peau ne peut guère être plus proche de l’os qui la pilote.

Vue latérale du renard en train de marcher, avec son squelette dessiné par-dessus le maillage ; quatre os de queue partent du bassin et suivent la queue, portée vers le haut et l’arrière

Troisième étape : il faut bien animer les os ​

Aucun clip de notre bibliothèque ne contient de pistes pour la queue. Sans travail supplémentaire, la chaîne conserve donc sa pose de bind et le renard se promène avec une planche. Les jeux résolvent ce problème avec un mouvement secondaire procédural, et nous faisons de même dans la bibliothèque d’exécution que charge déjà chaque modèle riggé.

Chaque extrémité d’articulation est une particule p dotée d’une vitesse v. Sa cible de repos T correspond à l’endroit où la pose de bind place cette extrémité, recalculé à chaque image à partir de la transformation courante de l’os parent dans l’espace monde. La particule suit un ressort amorti :

p¨=ω2(T−p)−2ζωp˙+g

avec ω=2πf. Le segment racine oscille à f=0.9 Hz et l’extrémité à la moitié de cette fréquence, car une queue est musclée à la base et couverte de fourrure à son extrémité. Le coefficient d’amortissement d’origine était ζ=0.45 ; la mise à jour liée à la souris ci-dessous le porte à 0.65 afin de réduire le dépassement. La gravité est de 1 m/s², et non de 9,8 : une queue contient des muscles. Nous intégrons avec la méthode d’Euler semi-implicite, puis imposons la contrainte de corde en reprojetant p sur la sphère centrée sur la tête de l’os et dont le rayon est égal à la longueur de l’os. Une corde ne peut pas s’étirer ; sa vitesse longitudinale non plus. La composante radiale (p˙⋅n^)n^ est donc supprimée, tandis que l’oscillation est conservée. Enfin, nous en déduisons la rotation de l’os : le quaternion qui fait passer sa direction de bind à la direction pointant vers la particule.

Comme les particules évoluent dans l’espace monde, toute rotation ou accélération des hanches provoque un retard de la queue, qui se met à osciller d’elle-même. Rien n’est scripté.

Trois erreurs méritent d’être reconnues ici, car chacune semblait acceptable jusqu’à ce que nous la mesurions.

La première version rapprochait chaque particule de sa cible selon une fraction fixe à chaque image : 12 % à 60 i/s. Exprimé comme un ressort, cela donne ω≈0.12/Δt≈21 rad/s, soit une vibration à 3,4 Hz. Et comme cette rigidité permettait à peine aux segments racines de bouger, tout le mouvement s’accumulait à l’extrémité. Exprimer le ressort en unités physiques a corrigé les deux problèmes à la fois.

La deuxième version réinjectait la correction de corde sous forme de vitesse, en divisant la correction par Δt. Cela ressemble à la mise à jour standard de la dynamique basée sur les positions, et reste stable tant que les hanches se déplacent lentement, comme dans un cycle de marche. Plus le parent se déplace rapidement, plus la correction augmente, et plus elle injecte de vitesse. Un déplacement des hanches d’un demi-mètre sur deux tiers de seconde suffisait : un os tournait de 95°, tandis que ses voisins ne bougeaient que de 3°. Un test sans affichage faisant osciller les hanches plus vigoureusement que n’importe lequel de nos clips a détecté le problème ; le cycle de marche n’aurait jamais pu le révéler.

La troisième erreur concernait l’angle de port ci-dessous. Il était appliqué dans le repère propre à chaque articulation, si bien qu’une queue à quatre os était soulevée quatre fois, se recroquevillait en boule contre le dos du renard et déchirait sa propre peau à chaque courbure. C’est la mesure ci-dessous qui a révélé le problème : l’étirement des arêtes de la queue atteignait un p99 de 2,3, contre une référence de 1,3 pour le corps, soit pire que le tibia auquel elle était initialement rattachée. carry représente désormais le relèvement de l’ensemble de la queue, réparti entre ses articulations.

Intersections. La queue avait été modélisée pendant verticalement entre les pattes, et le cycle de marche faisait passer les pieds au travers. La pose de repos visée par le ressort n’est donc pas celle du maillage : un carry de 50° relève les cibles de repos vers l’arrière et le haut autour de l’axe latéral des hanches, comme un renard porte sa queue lorsqu’il se déplace. Ces 50° correspondent au relèvement de toute la queue et sont répartis entre ses articulations, afin que l’arc reste doux, que la chaîne comporte quatre ou huit os. Enfin, aucune particule ne peut traverser le plan orienté vers l’avant passant par la racine de la queue, ce qui empêche celle-ci d’osciller entre les pattes.

Mesurer le résultat ​

Voici les mesures d’origine du renard, réalisées le 6 septembre avant les modifications liées à la souris décrites ci-dessous. Elles documentent le premier solveur de chaîne, et non un nouveau benchmark des paramètres révisés par défaut.

Des images fixes ne prouvent rien au sujet des déchirures ; nous mesurons donc l’étirement des arêtes pendant la lecture du clip. Pour chaque arête du maillage dont les deux sommets appartiennent à la queue, nous calculons le rapport entre sa longueur après skinning et sa longueur dans la pose de bind, à 24 instants régulièrement répartis sur le clip Walk. Un rapport de 1 correspond à une peau non déformée. Une arête étirée au-delà de 1,5 ou comprimée en dessous de 0,67 est considérée comme déchirée. Les arêtes du corps sont mesurées de la même façon afin d’établir une référence pour les déformations normales du skinning.

Clip Walk, 96 864 échantillons d’arêtes de la queuep95p99maxdéchirées
Rig d’origine1.602.424.0311.4%
Rigide sur Hips1.001.001.000%
Chaîne de queue1.091.181.300%
Corps, pour référence1.131.291.78—

Dans le rig d’origine, une arête de la queue sur neuf dépassait le seuil de déchirure, et la pire atteignait quatre fois sa longueur de bind. Avec la chaîne, la pire arête ne dépasse sa longueur que de 30 %, ce qui reste sous la référence de 1,78 du corps, et aucune déchirure ne se produit. La queue rigide reste exactement à 1.00 puisqu’elle se déplace d’un seul bloc ; c’est ce résultat qui nous a confirmé que le banc de mesure était correct avant de lui faire confiance pour la chaîne.

Une queue qui oscille réellement doit nécessairement déformer légèrement sa propre peau. L’objectif de la chaîne n’est donc pas d’atteindre 1.00, mais de rester sous le niveau de déformation déjà observé sur le corps. Une version antérieure de ce tableau indiquait un p99 de 1.03 pour la chaîne, résultat apparemment meilleur, mais en réalité pire : la queue bougeait à peine, car le bug de vitesse décrit plus haut l’avait suramortie jusqu’à la rendre presque aussi rigide que la version rigide.

Comparaison interactive ​

Trois exemplaires du renard, avec le même clip et à la même image. Faites glisser pour tourner autour, utilisez la molette pour zoomer. Changez de clip, désactivez la physique de la queue pour voir la chaîne dans sa pose de repos relevée, puis affichez les os pour observer sa position.

La même chaîne vue de côté, isolée, avec le squelette affiché. Sprint est le clip qui montre le mieux l’effet de ressort.

Ce que la souris nous a appris ​

Le renard avait démontré qu’une chaîne pouvait empêcher les déchirures. Une souris dotée d’une longue queue fine a rendu les erreurs de mouvement restantes beaucoup plus faciles à repérer. Une cassure nette qui disparaît dans la fourrure d’un renard ressemble à une articulation brisée chez la souris. Sa queue atteint également le sol et sa forme modélisée s’enroule d’un côté. Ce sont trois problèmes distincts ; augmenter la rigidité du ressort ne les résout pas tous.

Essayez les différentes animations sur la souris ci-dessous. Faites glisser le personnage pour tourner autour de lui, faites défiler horizontalement la bande de vignettes, ou utilisez la recherche et le filtre par catégorie pour trouver un mouvement. Cliquez sur une vignette pour le lire dans le grand aperçu. Walk, Crouch Backward, Crawl Idle et Back Flip constituent de bons points de départ pour examiner la queue. La bande utilise les mêmes aperçus animés en direct que notre présentation principale des animations et donne accès à l’intégralité du catalogue, en chargeant les mouvements au fil de votre navigation.

Ouvrez la bibliothèque complète d’animations → pour essayer ces mouvements sur votre propre personnage riggé et exporter les clips de votre choix.

Une chaîne de ressorts a malgré tout besoin de résister à la flexion ​

Les particules étaient contraintes de préserver la longueur de chaque os, mais chaque articulation pouvait encore pivoter presque indépendamment. Les contraintes de longueur empêchent l’étirement ; elles n’empêchent pas une charnière de se replier. La souris a précisément mis cette distinction en évidence.

Avant les corrections apportées à la souris : le squelette de la queue change brusquement de direction près de l’extrémité et le maillage se termine par une cassure vers le bas

Avant les corrections : préserver la longueur des segments ne suffisait pas à conserver une courbe fluide.

Nous couplons désormais les flexions supplémentaires des articulations voisines, mesurées par rapport à la courbe de repos. Les flexions sont comparées dans un référentiel commun afin que des axes d’os différents ne transforment pas une flexion vers la gauche en une torsion sans rapport sur l’articulation suivante. À chaque étape, les valeurs des articulations voisines sont lues depuis un instantané plutôt que depuis des valeurs partiellement mises à jour. Le facteur de mélange du couplage est 1−e−kΔt, avec un taux par défaut de k=12 par seconde, plutôt qu’une fraction fixe par image affichée.

La flexion élastique d’une articulation est limitée à 30° au-delà de sa direction de repos. Nous avons également augmenté l’amortissement à 0,65 et supprimons la vitesse qui continue à pousser contre la limite de flexion, afin qu’elle ne puisse pas s’accumuler puis se libérer sous forme de claquement. La base reste soutenue par les hanches et l’extrémité reste plus souple. Le contact peut prendre le pas sur la limite de flexion lorsque la queue doit reposer au sol.

Coupler les rotations, et non les positions des particules. Numérotons les N maillons à partir de i=0 au niveau des hanches. Soit hi la tête d’un maillon, pi son extrémité prédite et ℓi sa longueur. Sa direction candidate est di=(pi−hi)/∥pi−hi∥. Dans le référentiel actuel du parent, soit ri la direction unitaire de repos et d~i la direction candidate. Notons swing(a,b) le quaternion unitaire représentant la rotation la plus courte qui amène le vecteur unitaire a sur b. Si Ai fait passer le référentiel de repos de ce parent dans le référentiel commun des hanches, la flexion que nous comparons à celles des articulations voisines est

qi=Aiswing(ri,d~i)Ai−1.

Cette conjugaison change le référentiel de la flexion ; elle n’ajoute pas une rotation supplémentaire au personnage. À partir des instantanés qjold de l’étape précédente, la cible issue des articulations voisines et la flexion couplée d’une articulation intérieure sont

q¯i=slerp(qi−1old,qi+1old,12),α=1−exp⁡(−kΔt),qi∗=slerp(qi,q¯i,α).

À la base, la cible issue du voisinage se situe à mi-chemin entre la flexion de l’articulation suivante et le quaternion identité I, qui représente le soutien des hanches. L’extrémité libre utilise son unique articulation voisine ; une queue constituée d’un seul maillon ignore le couplage avec les voisins. Avec k=12s−1, α vaut environ 0,181 à 60 images/s et 0,330 à 30 images/s. Le couplage bénéficie ainsi d’un taux fondé sur le temps, même si le solveur complet conserve des erreurs d’intégration et de contact qui dépendent du pas de temps.

Pour un quaternion unitaire qi∗ dont la composante scalaire est wi, l’angle de sa rotation la plus courte est θi=2arccos⁡(clamp(|wi|,0,1)). La limite élastique est

qilimited={qi∗,θi≤θmax,slerp(I,qi∗,θmax/θi),θi>θmax,θmax=π/6.

Nous reconvertissons cette flexion dans le référentiel du parent et l’appliquons à ri avant les projections de contact. Il s’agit d’une règle locale de lissage de la flexion, et non d’une simulation complète de tige élastique : elle répartit la courbure supplémentaire et la limite, sans prétendre résoudre une énergie de flexion globale.

La pose chargée n’est pas nécessairement la pose de référence ​

Le fichier enregistré de la souris comportait déjà environ 28° de rotation sur la dernière articulation de la queue. Nous interprétions cette rotation chargée comme la position neutre, puis y ajoutions le mouvement du ressort. Une pose précédemment animée ou exportée était ainsi devenue une composante permanente de la cible du ressort.

Le solveur récupère désormais les transformations locales neutres à partir des matrices de bind inverses du squelette lorsqu’elles sont disponibles. Si un rig ne possède pas d’auxiliaire Tail_End, son dernier segment prolonge la tangente entrante exprimée dans le référentiel local propre de ce dernier os. Copier un vecteur depuis le référentiel du parent devient incorrect dès que l’os terminal possède une orientation différente.

L’enroulement d’un seul côté avait une autre origine : il était présent dans la géométrie de bind elle-même. Récupérer correctement la pose de bind conservait donc ce biais. Par défaut, la simulation utilise désormais un arc de repos centré, construit dans l’espace des hanches puis converti dans le référentiel de chaque parent corrigé. restCurve permet de réintroduire progressivement la courbure modélisée : 0 correspond à l’arc centré, tandis que 1 conserve la courbe créée par l’artiste. Cela modifie la cible des ressorts ; ni le maillage ni ses poids de skinning ne sont réécrits.

Récupération des transformations de référence. Soit Bi la matrice de bind inverse d’un os. Sa transformation de bind dans l’espace monde est Wi0=Bi−1 ; lorsque l’os et son parent possèdent tous deux des matrices de bind, la transformation locale neutre est donc

Li0=(Wparent(i)0)−1Wi0.

La décomposition de Li0 fournit la translation et la rotation locales nécessaires. Lire le quaternion chargé reviendrait à substituer à cette référence une image d’animation arbitraire enregistrée dans le fichier.

Construction de l’arc centré. Soit ai la direction unitaire créée pour le segment i dans l’espace des hanches. Nous retirons la composante latérale de la direction racine pour obtenir c=normalize(0,a0y,a0z), en utilisant une direction vers le bas si cette projection s’annule. Soit β∈[0,1] la valeur de restCurve, et C l’angle total d’inclinaison en radians. En notant rot(q,v) la rotation du vecteur v par le quaternion q, la direction souhaitée dans l’espace des hanches est

Qi(β)=slerp(I,swing(c,ai),β),ui=Rx(Ci+1N)rot(Qi(β),c),ri=rot(Ai−1,ui).

Ici, Rx désigne la rotation autour de l’axe latéral des hanches. Point crucial, Ai inclut les corrections de repos déjà appliquées aux articulations en amont. Ainsi, ui représente la direction absolue visée pour ce segment, au lieu d’ajouter à nouveau la correction de redressement à chaque articulation. Lorsque β=0, l’enroulement latéral modélisé est supprimé ; lorsque β=1, ses directions sont conservées avant l’application de l’inclinaison.

La queue peut toucher le sol ; elle ne doit pas soulever la souris ​

Lors d’un contact avec le sol, un segment pivote jusqu’à l’intersection de sa sphère de longueur avec le plan du sol. Se contenter de borner la hauteur d’une particule raccourcirait l’os ; la borner puis rétablir sa longueur peut la replacer sous le sol. Nous réservons 0,025 unité du monde sous l’axe central pour tenir compte de l’épaisseur, éliminons la vitesse de contact dirigée vers le bas et amortissons le glissement. Le sol plan se situe par défaut à Y = 0 dans l’espace monde et peut être déplacé ou désactivé. Il s’agit d’une contrainte de plan, pas d’une collision avec le terrain ou avec un maillage complet.

Intersection entre la sphère et le sol. Écrivons F=g0+ρ pour la hauteur du sol augmentée du dégagement de l’axe central, avec g0=0 et ρ=0.025 par défaut. Le segment doit satisfaire

∥pi−hi∥=ℓi,(pi)y≥F.

Si l’extrémité prédite se trouve sous le sol, définissons u=(F−hiy)/ℓi. Lorsque |u|≤1, le contact se situe sur un cercle horizontal. Si t est une direction horizontale unitaire, l’extrémité corrigée est

pi′=hi+ℓi(1−u2t+uey),ey=(0,1,0).

Sa hauteur vaut exactement $F, et sa distance à la tête vaut exactement $\ell_i$, car $(1-u^2)+u^2=1$. Nous choisissons $t$ à partir de la projection horizontale de la direction candidate, avec un repli sur la direction de repos si cette projection s’annule. Le plan des hanches qui maintient la queue à l’arrière peut restreindre la portion autorisée du cercle. Le contact est prioritaire sur la limite de flexion élastique. Si la tête se trouve si loin sous le sol que $u>1$, aucune rotation de ce segment de longueur fixe ne peut l’atteindre ; l’implémentation borne $u au lieu d’étirer l’os ou de soulever le corps.

Après les autres projections de vitesse, la composante descendante restante de la vitesse d’une particule en contact est supprimée, puis sa vitesse est amortie :

vi′=e−γΔt[vixmax(0,viy)viz],γ=8s−1.

Il s’agit d’un contact inélastique avec un amortissement simple, et non d’un modèle de frottement de Coulomb. Cela empêche la gravité d’accumuler une vitesse descendante lorsque la queue repose au sol.

Ce changement a résolu la pénétration du sol par la queue, mais il restait deux autres mécanismes par lesquels celle-ci pouvait faire flotter les pieds.

Premièrement, la visionneuse posait sur le sol le point le plus bas de l’ensemble du maillage chargé. Si la queue enregistrée descendait sous les plantes des pieds, tout le personnage était soulevé pour laisser la place à la queue. Lors du placement, la visionneuse ignore désormais la peau principalement influencée par la queue lorsqu’elle détermine le niveau du corps, tandis que le cadrage de la caméra continue d’inclure l’intégralité du personnage.

Deuxièmement, la passe d’ancrage au sol du retargeteur prenait elle aussi la queue en compte. Pendant Back Flip, elle relevait le bassin pour maintenir cette peau au-dessus du sol, alors même que le solveur de queue indépendant allait la déplacer ensuite.

Quelles parties de la peau peuvent relever le bassin ? Soit S l’ensemble des points d’appui échantillonnés sur la peau du corps, T ceux principalement influencés par les os de la queue, et E ceux pris en charge par les solveurs de contact des membres. Le niveau de référence du sol est mesuré lors de l’étalonnage à partir de S∖T. Le dégagement du reste du corps à l’image t est

fbody=minv∈S∖Tyv0,c(t)=minv∈S∖(T∪E)yv(t)−fbody,Lraw(t)=max(0,a(t)−c(t)).

Ici, a(t)≤0 est la tolérance issue de la source autorisant un passage sous le niveau de référence du sol. Lraw est le relèvement demandé avant le lissage temporel et la réconciliation des membres effectués par le retargeteur. La même exclusion de la queue doit figurer dans les deux minimums : la retirer uniquement de la sonde de la pose actuelle laisserait malgré tout un niveau de référence incorrect. L’implémentation échantillonne la peau par groupes définis selon l’os dominant, au lieu d’évaluer chaque sommet à chaque image.

Pour la comparaison ci-dessous, le relèvement supplémentaire indiqué correspond à la différence entre les trajectoires finales du bassin, et pas seulement à la correction brute :

Δyhips(t)=yhipstail counted(t)−yhipstail excluded(t).

Relèvement mesuré du bassin vers la fin de Back Flip

Nous avons échantillonné la même souris aux mêmes instants de l’animation, en modifiant uniquement la prise en compte de la queue dans l’ancrage du corps au sol. Les deux colonnes utilisent les mêmes coordonnées du modèle dans l’espace monde ; la différence isole la hauteur supplémentaire introduite par la prise en compte de la queue.

Temps dans le clip de 1,93 sHauteur du bassin : queue incluseHauteur du bassin : queue exclueRelèvement supplémentaire dû à la queue
1,16 s50,5 cm35,0 cm15,4 cm
1,55 s81,3 cm70,3 cm11,0 cm
1,84 s92,2 cm77,2 cm15,0 cm
1,93 s90,6 cm77,2 cm13,4 cm

Le personnage doit se relever lorsqu’il se remet debout après l’atterrissage. L’erreur correspond au relèvement supplémentaire indiqué dans la dernière colonne, et non à ce mouvement de redressement volontaire. Les valeurs sont arrondies indépendamment à partir des positions échantillonnées dans l’espace monde.

Sur cette souris, exclure la queue a supprimé environ 15 cm de relèvement supplémentaire du bassin vers la fin de Back Flip. À l’approche de la fin, la sonde du corps est restée à environ un millimètre de son niveau de référence au lieu de flotter plusieurs centimètres au-dessus. La peau de la queue ne définit désormais ni le niveau du sol du corps ni la correction qui relève son bassin. Le solveur de queue ne fait lui-même que tourner les os de la queue ; il ne translate jamais le modèle, les hanches ou les pieds.

Une animation peut hériter d’une pose avant même sa première lecture ​

L’accroupissement surélevé a révélé un problème distinct. Nous générons progressivement les clips de la bibliothèque afin que la visionneuse puisse commencer la lecture avant que tous les clips soient prêts. Le retargeting utilisait le même squelette que la lecture. Entre deux résolutions, l’aperçu pouvait déplacer le bassin, et le clip suivant lisait alors cette pose animée comme référence d’étalonnage. Réinitialiser le personnage lors du changement de clip ne pouvait pas réparer une mauvaise référence déjà intégrée aux pistes générées.

Le retargeting fonctionne désormais sur des copies privées du squelette, créées à partir d’un étalonnage stable capturé avant le début de la lecture. Les demandes de clips ultérieures réutilisent cette référence, et les demandes simultanées disposent d’os distincts. Un test de non-régression déplace et fait délibérément pivoter les hanches actives entre les clips livrés ; les pistes générées doivent rester identiques à celles d’une exécution propre, et la résolution ne doit pas modifier la pose active. Tous les mouvements visibles n’étaient pas des bugs. L’animation source de Climb Idle comporte un léger balancement vertical du bassin, tandis que la racine reste immobile. Et lors d’un nouveau calcul de Crawl Idle, les mains de la souris sont restées sous sa tête pendant toute la boucle ; la capture d’écran montrant les mains levées correspondait à un ancien clip contaminé, et ne prouvait pas que l’animation source imposait cette pose. Comparer la source, un nouveau calcul et le résultat en lecture nous a évité d’aplatir un mouvement intentionnel pour masquer une erreur de calibrage.

Ce que nous vérifions désormais ​

Les vérifications couvrent les balayages rapides des hanches sur des chaînes de différentes longueurs, des flexions plus fluides entre os voisins, des réponses gauche/droite identiques, le rétablissement de la pose de liaison, un os terminal orienté sans os auxiliaire et la fermeture de la boucle après la phase de préchauffage. Les tests au sol couvrent l’accroupissement, les plans de sol surélevés, la stabilisation et le relâchement lorsque les hanches remontent. Des tests de régression distincts vérifient que le contact de la queue ne déplace jamais le corps et que le skinning de la queue ne peut pas demander un relèvement du bassin.

Ces vérifications établissent des invariants précis. Elles ne remplacent pas l’observation de la souris au fil de ses mouvements et ne définissent pas non plus de nouvelles valeurs d’étirement pour le renard. Les exemples en direct utilisent le solveur révisé ; le tableau précédent consacré au renard reste une trace des mesures d’origine.

Ce que cela change pour vous ​

Si vous riggez un personnage doté d’une queue sur cinevva.com/tools/rigger, celle-ci est générée sur sa propre chaîne d’os, le statut de la tâche contient une entrée appendages décrivant ce qui a été détecté, et l’aperçu l’anime. Les modèles riggés via l’API de la plateforme reçoivent le même fichier. L’intégration initiale dans rt/1.1.12 permettait à createAnimator de trouver les os Tail_* et de les animer sans code supplémentaire ; la fréquence, l’amortissement, la gravité et l’angle de port de l’effet ressort sont configurables si vous souhaitez une queue plus lourde ou plus nonchalante. Les anciens fichiers dépourvus de chaîne pour la queue peuvent être traités à nouveau en relançant le rigging. Les modifications du 11 septembre décrites ci-dessus sont désormais déployées dans les aperçus web de Cinevva. Les jeux épinglés à une ancienne version du runtime et les clips exportés précédemment ne sont pas mis à jour automatiquement. Les clips précalculés existants doivent être régénérés pour bénéficier des corrections.

Dans Blender. L’extension exécute la même passe sur la table de rig, avant de construire l’armature, afin qu’une queue riggée sur votre propre machine reçoive la même chaîne avec les mêmes noms. Une case Tail figure à côté de Fingers, et la fiche de résultat indique ce qui a été détecté.

En dehors de notre runtime. Un effet ressort dans un jeu n’est d’aucune utilité pour quelqu’un qui ouvre le fichier dans Blender, Unity ou Unreal, où la queue resterait immobile. L’export la précalcule donc désormais : chaque clip sélectionné est simulé et les rotations de la queue sont échantillonnées sous forme de véritables images clés. L’exportateur exécute silencieusement le clip jusqu’à ce que la queue revienne à sa position initiale, puis lance l’enregistrement, car une boucle précalculée à partir d’un démarrage à froid ne se referme pas et la queue saute lors de la répétition. L’extrémité est volontairement le maillon le plus souple ; son régime transitoire est donc le plus lent à se stabiliser, et une seule passe de préchauffage ne suffit pas toujours.

Cette passe est volontairement prudente. Elle ne crée une chaîne que pour un élément long suspendu au bassin. Les oreilles, les cheveux et les manches restent intacts, tout comme les éléments larges situés sur le torse : une version antérieure attribuait rigidement une cape ou une jupe à l’os du torse, mais la voir fonctionner sur de véritables modèles importés nous a fait changer d’avis. L’un d’eux était un vêtement de 6 540 sommets à la taille, que le riggeur avait judicieusement réparti entre les hanches et les deux cuisses ; l’attribuer à un seul os l’aurait totalement empêché de suivre les jambes. Attribuer un vêtement à un os unique représente une modification importante du personnage de quelqu’un, fondée sur une supposition quant à la nature de l’élément ; c’est donc désormais une action que vous devez demander plutôt qu’un changement qui vous est imposé. Il n’y a pas de collision avec les jambes au-delà du plan avant, ni d’oscillation au repos lorsque le personnage reste immobile : la queue d’un renard debout pend donc tranquillement dans sa pose de port. Ce sont les deux prochains points de la liste, avec un traitement similaire pour les ailes, qui nécessitent une pose de repos et un effet ressort différents.