Skip to content

Construire un monde ouvert dans le navigateur, partie 25 : un seul squelette pour toutes les tenues

Par Oleg Sidorkin, CTO et cofondateur de Cinevva

Vous découvrez la série ? Consultez le guide de la série. Il explique ce qu’est un spike et fournit les liens vers toutes les parties.

La partie 24 a rendu le monde persistant et donné du mouvement à sa végétation grâce au vent. Cette partie revient aux personnages, mais sous l’angle de leur garde-robe : un créateur peut-il choisir un corps de base, changer de vêtements, sélectionner une coiffure et lancer n’importe quelle animation, le tout à partir d’un pack de ressources gratuit, sans aucun travail de rigging ni création d’animations ? Construire un rig personnalisé n’est pas le bon risque à éliminer. La vraie question est de savoir si un pack CC0 peut répondre à l’ensemble des besoins.

Un pack conçu pour fonctionner comme un tout

Ouvrir le Spike 50 dans un nouvel onglet ↗ · Voir le code source

Quaternius propose quatre ressources dont la compatibilité semble presque trop parfaite : Universal Base Characters, avec des corps masculins et féminins ainsi que huit coiffures et deux jeux de sourcils ; Modular Character Outfits, réparti en éléments pour le corps, les bras, les jambes et les pieds, avec des accessoires tels que des spallières et une capuche ; et les packs un et deux d’Universal Animation Library, soit 262 clips au total couvrant les déplacements, le combat, l’escalade, l’agriculture, la pêche, les poses d’attente et les interactions sociales. L’examen de leurs fichiers glTF a révélé la raison de cette compatibilité : tous les maillages des quatre packs sont riggés sur le même squelette de style UE5 à 65 articulations, avec les mêmes noms d’articulations et les mêmes poses de liaison, de la racine au bassin puis de la colonne vertébrale à la tête, des bras symétriques comportant quinze articulations de doigts de chaque côté et des jambes symétriques. Aucun retargeting n’est nécessaire. C’est l’exact opposé du problème de retargeting entre trois squelettes rencontré dans le Spike 35, où un rig facial à 213 os devait communiquer avec un rig Mixamo à 65 os. Ici, les quatre packs ont été volontairement créés sur le squelette de la bibliothèque d’animations, et leur correspondance est exacte.

Le spike est donc devenu un exercice de liaison plutôt qu’un problème de pipeline d’animation. La couche de base charge le glTF d’un corps, clone la scène avec SkeletonUtils.clone afin que chaque personnage dispose de sa propre instance de squelette au lieu de répercuter les modifications des os dans la scène mise en cache par le chargeur, puis met en cache ce squelette à 65 os comme squelette canonique, avec l’objet d’armature servant de racine à l’animation.

Réassocier un manteau à un corps

L’astuce qui permet à l’ensemble de fonctionner tient au fait qu’il est impossible de simplement reparenter le maillage d’une tenue dans la scène : il référence encore les os de son propre glTF, placés dans une autre sous-arborescence. Chaque élément modulaire, qu’il s’agisse du corps d’un paysan ou des jambes d’un rôdeur, arrive sous la forme de son propre SkinnedMesh, avec son propre clone de la même armature. La liaison parcourt les os du squelette source dans leur ordre d’origine, recherche chacun d’eux par son nom dans le squelette canonique, puis construit un nouveau Skeleton à partir de ces os réassociés en réutilisant les matrices inverses de liaison de la source. Elle appelle ensuite SkinnedMesh.bind avec la matrice de liaison identité de la source. Après la liaison, le maillage est détaché de sa scène source et directement rattaché à la racine du personnage. Comme la matrice de liaison capture la transformation globale au moment de la liaison et que la racine reste à l’identité, la transformation globale propre au maillage n’affecte jamais le résultat : le skinning s’effectue entièrement à travers les os désormais partagés.

Les cheveux et les sourcils occupent eux aussi des emplacements, et ils ont permis de corriger une hypothèse erronée. La structure des dossiers indiquait « rigged to head bone », ce qui laissait penser que les cheveux étaient un maillage statique rattaché à l’os de la tête avec un décalage précalculé. Ce n’est pas le cas. Chaque fichier de coiffure contient un SkinnedMesh pondéré sur les 65 articulations, les poids des cheveux longs s’étendant jusqu’au haut de la colonne vertébrale et au cou afin qu’ils retombent lorsque le personnage baisse la tête. Les cheveux suivent donc le même processus de réassociation par nom que n’importe quel élément de tenue. Le seul cas particulier est l’emplacement du corps de la tenue : lorsqu’il est utilisé, le maillage du corps de base est masqué afin d’éviter que la tenue ne le traverse, tandis que les bras, les jambes, les pieds et les accessoires se superposent simplement, car le pack a été conçu pour qu’ils coexistent avec le corps de base, dont la peau reste visible partout où les vêtements ne la couvrent pas.

262 animations gratuites

Une fois le squelette partagé, l’animation devient presque anecdotique. Les deux fichiers glb des bibliothèques sont chargés, leurs clips sont regroupés dans une seule liste nommée, et les noms de pistes de ces clips font référence aux noms exacts des articulations via bone.position, bone.quaternion et bone.scale. Un AnimationMixer ayant pour racine l’armature du personnage trouve directement ces os par leur nom et les anime, avec un fondu enchaîné lors de chaque changement. Le panneau droit de la visionneuse contient une liste filtrable des 262 clips, chacun accompagné d’une pastille indiquant sa source : une recherche sur « fish » affiche ainsi toutes les animations de pêche des deux bibliothèques. Un éclairage trois points classique avec des ombres douces, une grille polaire sous les pieds et un tone mapping ACES préservent la lisibilité des textures de base stylisées sans écraser les ombres de la combinaison sombre.

La réduction des risques pour le produit est considérable. La fonctionnalité de personnalisation d’avatars peut être livrée à partir d’un pack CC0 sans aucun travail de rigging ni création d’animations : il suffit d’intégrer les quatre packs et de connecter une interface de garde-robe pour disposer immédiatement d’environ six tenues, multipliées par huit coiffures, deux sexes et 262 animations. Le squelette à 65 articulations est suffisamment petit pour que le coût du skinning GPU soit négligeable, et le travail sur le skinning par lots réalisé dans le Spike 45 prend déjà en charge plus de 200 avatars avec un rig de cette taille. La licence CC0 n’impose aucune restriction d’utilisation, ce qui autorise l’usage commercial sur une plateforme payante destinée aux créateurs. La question encore ouverte concerne les tenues importées par les utilisateurs. Il s’agit d’un problème de phase 3, qui sera résolu en effectuant, au moment de l’importation, un retargeting vers ce squelette canonique, soit l’inverse du retargeting à l’exécution du Spike 35. Les ressources occupent environ 147 Mo sur disque sous la forme de PNG 2K bruts et de fichiers glb d’animation non compressés. En production, ce volume serait ramené à environ 30 Mo grâce à la compression de textures KTX2 et à un passage dans gltf-transform.

Technologies présentées dans ce chapitre

Un squelette canonique unique pour tout un pack. Les quatre packs de Quaternius — corps de base, tenues modulaires et deux bibliothèques d’animations — sont tous riggés sur un squelette identique de style UE5 à 65 articulations, avec les mêmes noms d’articulations et les mêmes poses de liaison. Leur combinaison ne nécessite donc aucun retargeting. Le clonage de la base avec SkeletonUtils.clone attribue à chaque personnage sa propre instance de squelette au lieu de modifier la scène mise en cache par le chargeur.

Réassociation des squelettes par nom. Chaque élément modulaire fournit son propre SkinnedMesh référençant sa propre armature. La réassociation parcourt les os sources dans l’ordre, associe chacun d’eux par son nom au squelette canonique, construit un nouveau Skeleton en réutilisant les matrices inverses de liaison de la source, puis appelle SkinnedMesh.bind avec la matrice de liaison identité. Le maillage est ensuite rattaché à la racine partagée du personnage afin que le skinning s’effectue entièrement à travers les os partagés. L’emplacement du corps de la tenue masque le corps de base pour éviter les intersections ; les autres emplacements se superposent.

Les cheveux comme emplacement skinné. Les cheveux ne sont pas un élément statique attaché à l’os de la tête, mais un SkinnedMesh pondéré sur les 65 articulations. Les cheveux longs sont également pondérés sur le haut de la colonne vertébrale et le cou, de façon à retomber lorsque le personnage baisse la tête. Ils suivent le même processus de réassociation que les éléments de tenue.

Retargeting gratuit des animations indexées par nom. Les clips de l’Animation Library référencent les articulations par leur nom exact. Un AnimationMixer ayant pour racine l’armature partagée peut donc exécuter directement les 262 clips avec des fondus enchaînés, sans retargeting propre à chaque clip. La licence CC0 couvre l’usage commercial, et le faible nombre d’articulations maintient le coût du skinning GPU à un niveau suffisamment bas pour réutiliser le pipeline de skinning par lots du Spike 45. Voir le LOD piloté par le GPU.


Partie 25 sur 29. Précédent : Partie 24 - Sauvegarder un monde et rendre le vent visible Suivant : Partie 26 - Une eau convaincante à toutes les échelles Guide de la série : /fr/blog/2026-02-25-open-world-browser-series-guide