Mes joueurs ont enfin de vrais visages.
L'architecture : un seul squelette de corps pour tous les joueurs. C'est là que vivent le motion matching, les montages et toutes les animations retargetées, et je n'y touche jamais. La tête est un mesh MetaHuman séparé qui se contente de porter la pose du corps, et la tête attribuée à un joueur est déterminée par son ID dans la base de données. Même joueur, même visage, sur toutes les machines, pour toujours.
Les cous s'étiraient comme ceux des girafes quand les joueurs couraient. Je cachais l'os de la tête du corps pour qu'il ne traverse pas celle du MetaHuman. Sauf que cacher un os écrase sa transformation, et le mesh de la tête recopie justement ces transformations pour se mettre en pose. Je donnais au visage un os de tête corrompu. Ça marchait à l'arrêt et ça explosait en mouvement.
Les deux fonctionnalités ne peuvent littéralement pas coexister, et aucune correction dans le code n'existe. La réponse était la plus ennuyeuse, celle que j'avais écrite dans mon propre document de conception dès le premier jour avant de passer des heures à l'éviter : un mesh de corps sans tête. Supprimer les polygones de la tête dans Blender, garder l'os. Exactement ce que font les vrais jeux de foot. Zéro logique à l'exécution maintenant. Toute cette catégorie de problèmes a disparu.
La leçon : quand la solution propre, c'est « du travail de contenu » et la bidouille, c'est « du code », je fonce sur le code. Ce réflexe m'a coûté une soirée.
Et les visages ne sont pas cosmétiques. Chaque joueur est une ligne dans une base de données : nom, âge, contrat, potentiel. Alors quand un jeune de dix-sept ans issu de votre centre de formation perce en équipe première, ce n'est pas « Player_0412 ». Il a un visage que vous reconnaissez.
Livré : têtes MetaHuman sur un corps d'animation partagé
Cet article a été traduit de l'anglais avec l'aide de l'IA. Lire l'original