Les vêtements animés sont de plus en plus présents dans les productions modernes qu’elles soient indépendantes ou AAA. Que ce soit avec une grande cape comme dans la série Batman Arkham, un simple foulard attaché à la taille comme dans Sifu ou la longue robe des personnages de Journey, ils rendent les mouvements plus impactants. Dans cet article nous allons voir la base du fonctionnement technique de la simulation de vêtements. L’idée n’est pas de vous permettre d’implémenter directement dans un jeu ces systèmes mais plutôt de vous donner des bases et potentiellement envie de creuser le sujet.

 

Le tissu, un objet à part

Pour bien comprendre le fonctionnement des vêtements il faut d’abord comprendre ce qui les démarque des autres objets d’un moteur. Il y a deux grandes familles d’objets présentes dans un jeu vidéo, les meshs et les particules.

Usuellement, un mesh est un objet composé de sommets fixes liés entre eux pour former des triangles. L’objet est considéré comme un ensemble ayant les mêmes propriétés (poids, vitesse, etc…). Si un sommet du mesh bouge, tous les autres sommets le feront de la même façon (sauf exception lorsqu’ils sont animés via des shaders comme l’eau ou l’herbe par exemple). La grande majorité des objets visibles dans un jeu vidéo sont des meshs.

Les particules sont des points dans l’espace ayant chacun des propriétés uniques. Elles sont complétement indépendantes les unes des autres. Le comportement d’une particule n’influencera pas celui de ses voisines. C’est habituellement utilisé pour faire des effets spéciaux (fumée, électricité, poussière, …) en affichant une image ou un mesh à la position de la particule.

Le tissu est un mélange de ses deux systèmes, c’est un mesh dont les sommets sont gérés comme des particules. Dans ce cas, les particules exercent des contraintes les unes sur les autres. Si une particule du tissu accélère alors elle donnera une partie de cette accélération à ses voisins qui feront de même avec leurs voisins, etc… Ces particules ont le même rôle que les sommets d’un mesh et sont reliés entre elles pour former des triangles.

Schéma montrant les différences entre mesh, particules et tissu.

Le mouvement

Il existe différentes méthodes pour donner du mouvement à un vêtement. Chacune a ses avantages et inconvénients, le choix se fait selon les besoins visuels du jeu, les performances visées et le budget disponibles.

La méthode la plus simple et que l’on voit dans la majorité des jeux est d’attacher le vêtement au corps du personnage, de la même façon que la peau est gérée. Avec cette méthode, par exemple pour un t-shirt, si le personnage replie son avant-bras, le tissu se déforme au niveau du coude pour prendre la forme arrondie de l’articulation. L’avantage de cette méthode est qu’elle est très peu couteuse en performance et facile à mettre en place, mais il n’y a pas de mouvement libre du tissu.

La seconde méthode qui demande plus de temps et de moyen est l’animation manuelle du vêtement. À la façon d’une animation classique où l’animateur manipule le squelette d’un personnage, il va ici manipuler les sommets du tissu et choisir manuellement leur placement pour lui donner la forme et le mouvement désiré. Le résultat peut être très convaincant et stylisé, mais cela demande beaucoup de travail surtout si le rendu doit être réaliste.

Pour faire gagner du temps aux animateurs il est possible de faire une simulation précalculée prenant en compte la gravité, l’étirement maximal du tissu, le vent et d’autres paramètres physiques. Une animation sera automatiquement générée et en modifiant les paramètres, ils peuvent itérer rapidement jusqu’à obtenir le résultat souhaité.

Le problème de l’animation manuelle ou précalculée est qu’en cas de changement dans la situation où l’animation est utilisé (ce qui arrive régulièrement dans une production) il faut la modifier manuellement et la réimporter dans le moteur. De plus, cela ne peut pas s’adapter dynamiquement aux actions imprévisibles du joueur. Pour éviter ces désagréments, il existe une dernière méthode. La plus couteuse en performances et la plus complexe à développer. C’est la simulation temps réel.

Dans ce cas, à chaque image du jeu est calculée la position des sommets du tissu en fonction de différents paramètres physiques (vent, vitesse, poids, plasticité du tissu, etc…). Cette méthode est utilisée uniquement dans les plus grosses productions comme Batman: Arkham City, The Last of Us, Spider Man, etc…. En plus d’être couteuse en performances elle prend beaucoup de temps à développer, ce qui la rend inaccessible pour beaucoup de studios. Elle a de nombreux points communs avec la méthode précalculée mais les contraintes de temps réel forcent à être ingénieux pour avoir des résultats convaincants en faisant le moins de calcul possible. C’est techniquement la méthode plus intéressante, c’est sur elle que se base la suite de l’article.

La simulation de vêtements temps réel est particulièrement visible dans Batman: Arkham City.

 

Simuler un mouvement en temps réel

Il existe de nombreuses façons de simuler le mouvement en temps réel d’un tissu. Il est possible de les séparer en 2 grandes familles, celles basées sur les forces et celles basées sur la position.

Les méthodes basées sur les forces ont pour objectif de faire une simulation réaliste du tissu. L’idée est que les forces appliquées sur un sommet vont influencer la vélocité de ses voisins. Pour atteindre cet objectif, plusieurs paramètres rentrent en compte. Il y a la gravité, la résistance des ressorts liant les sommets entre eux, la vélocité de chaque sommet, le vent, et d’autres contraintes physiques selon les cas. Les ressorts liant les sommets sont responsables de l’élasticité du tissu, ils se tendent et détendent selon les forces appliquées. C’est ce qui va permettre au tissu de retrouver sa forme initiale lorsqu’il n’y a pas de mouvement. C’est aussi ce qui va dicter à quel point un sommet va communiquer sa force à ses voisins pour propager le mouvement dans le tissu.

Les simulations basées sur la force ont l’avantage théorique d’être proche de la réalité, mais elles sont couteuses et instables. Les sommets propageant chacun leurs forces aux autres, si les forces deviennent trop importantes, le système peut s’emballer et le tissu risque d’avoir des mouvements incontrôlables.

Pour éviter l’instabilité il existe les méthodes basées sur les positions des sommets du tissu (type de simulation nommé Position Based Dynamics – PBD). L’idée n’est pas de propager une force en la distribuant aux voisins, mais d’utiliser la position des voisins et les forces propres du sommet pour déterminer sa vélocité. Moins couteuse et plus stable, cette technique a le défaut de donner un résultat théoriquement moins réaliste.

Les deux méthodes ont en commun de demander beaucoup de calculs. Les forces et contraintes physiques s’appliquant sur un tissu peuvent être très différentes d’un sommet à l’autre. Lors du calcul de la vélocité d’un sommet, ses voisins n’ont potentiellement pas encore été influencés par les changements (forces ou position) de leurs autres voisins. Il n’est donc pas possible d’avoir un résultat parfait en faisant le calcul une seule fois pour chaque sommet. Pour s’assurer que les forces et mouvements se propagent, il faut itérer plusieurs fois sur tous les sommets. Il existe différents moyens d’approcher un résultat correct en peu d’itération. En 2016 des chercheurs de Nvidia ont proposé le modèle XPBD, une méthode PBD avec ajouts de contraintes d’élasticités, convergeant rapidement vers une solution crédible.

Comparaison des résultats obtenus avec les méthodes PBD et XPBD en fonction du nombre d'itérations. La méthode XPBD donne des résultats crédible en moins d'itérations.

Les méthodes basées sur les positions sont aujourd’hui les plus utilisés dans l’industrie. Les solutions temps réel utilisées dans Nvidia Apex Cloth (Unreal Engine 4, Unity, …) et Havok Cloth (The Legend of Zelda: The Breath Of The Wild, Wolfenstein: Youngblood, …) reposent autour de ce concept. Récemment, Unreal Engine 5 a introduit une nouvelle méthode prometteuse basée sur du machine learning.

 

Les collisions

Une fois le mouvement fonctionnel, il est possible de le faire réagir à son environnement en lui ajoutant des contraintes de collisions.

Il existe plusieurs façons de gérer les collisions dans un jeu vidéo. Le plus souvent cela est géré en regardant à intervalles réguliers si le mesh de collision d’un objet (mesh simplifié parfois réduit à un simple cube) est dans un autre. Si c’est le cas alors on fait reculer l’objet dans la direction inverse de sa vitesse pour faire en sorte qu’il ne soit plus dans l’objet. En fonction de différents paramètres on le renvoie plus ou moins fort dans la direction opposée. C’est la détection de collisions discrète.

Ce type de détection a pour défaut de ne pas bien prendre en compte un objet se déplaçant très rapidement. Dans la vérification de contact avec un obstacle, l’objet risque à un test de collision d’être avant l’obstacle et lors du prochain test d’être après. L’objet passe alors à travers l’obstacle sans avoir généré de collision. Cela est visible dans certaines grosses productions, notamment dans Halo Infinite où certaines armes peuvent faire voler les corps suffisamment vite pour qu’une partie du corps d’un ennemi passe à travers le plafond mais pas le reste. Le personnage est alors bloqué. Dans le cas du tissu, ce problème est amplifié par la vitesse différente de chaque sommet. En cas de mouvement trop rapide certains sommets peuvent passer à travers un mur alors que d’autres non. Donnant l’impression que le personnage est “attaché” au mur.

Pour éviter ces problèmes, il existe la détection de collision continue. L’idée ici est de prévoir avant son déplacement avec quels autres objets l’objet actuel peut entrer en contact. Il existe des façons plus ou moins couteuses de mettre cette technique en place, si cela vous intéresse je vous invite à regarder le talk GDC de Chris Lewin, ingénieur physique chez Electronic Arts.

Comparaison des méthodes de détection de collisions

Dans le cas du tissu la méthode la plus utile est celle des contacts prédictifs (utilisé dans le Frostbite Engine de EA). L’idée est de se dire que 2 objets proches ont une grande chance de se toucher. Si un sommet du tissu se trouve dans un rayon proche d’un objet et qu’il se dirige vers l’objet alors un contact sera généré et le tissu sera repoussé. Dans d’autres cas des contacts seront générés uniquement parce que le tissu est très proche de l’objet même s’il ne le touche pas. De cette façon on s’assure que le tissu ne rentrera jamais dans l’objet. Cette technique permet de limiter les artefacts visuels, mais a pour défaut de parfois générer des collisions alors qu’il n’y en a pas, créant une distance entre le tissu et l’objet.

Les limitations de la méthode des contacts prédictifs sont visibles dans les célébrations de FIFA 23. Les shorts des joueurs ne touchent jamais leurs jambes.

 

La gestion des collisions est un processus très couteux dont la complexité s’accroit avec le nombre de sommets du tissu et le nombre et la complexité des obstacles. Une façon évidente d’optimiser les vérifications de collision est de limiter le nombre d’objets pouvant interagir avec un tissu. Dans beaucoup de jeux seul le corps du personnage portant le vêtement génère des collisions. Mais un corps reste un mesh souvent dense. Si l’objectif n’est pas d’avoir des collisions ultra-réalistes alors il est possible de simplifier le mesh en utilisant uniquement des sphères et des capsules. Plus besoin de faire de la vérification polygone par polygone, il suffit d’utiliser les calculs simples de collisions des sphères et des capsules.

 

Conclusion

La simulation de tissus temps réel est un sujet complexe sur lequel des chercheurs travaillent encore aujourd’hui. Il existe de nombreuses implémentations possibles, ce qui vous est présenté ici est une sélection de ce qui me semble le plus utile pour comprendre le sujet.

Il y a d’autres aspects intéressants de la simulation peu présents actuellement dans les jeux vidéo que je n’évoque pas, notamment concernant les tissus multicouches et le déchirement. J’écrirai peut-être sur ces sujets dans le futur. Si vous souhaitez dès maintenant en savoir plus, je vous invite à regarder les différentes sources citées ci-dessous.

Cet article fait partie de la série d'articles Tech Temps Réel  dédiée à la vulgarisation des méthodes de rendues et de simulation temps réel utilisées dans les jeux vidéo. Pour ne pas rater les prochains articles :  Twitter / Mastodon / Bluesky.

Sources et plus :

🗣️ Conférence | 📽️ Vidéo | 👨‍💻 Code | 📄 Papier | 📃 Thèse

🗣️ Real-Time Cloth Solutions on ‘Marvel’s Spider-Man’, Sophie Brennan, Insomniac Games, 2019

🗣️ Cloth Self Collision with Predictive Contacts, Chris Lewin, EA, 2018

📽️,👨‍💻 The Secret of Cloth Simulation, Ten Minute Physics, Matthias Muller, 2022

📽️,👨‍💻 Cloth Self-Collision Handling, Ten Minutes Physics, Matthias Muller, 2022

📄 Fast Simulation of Cloth-Rigid Body Based on PBD, Sijie Huang and Hui Zang, 2020

📄 XPBD: Position-Based Simulation of Compliant Constrained Dynamics, Matthias Muller, Nvidia, 2016

📃 Tearable cloth, Kurt Thompson Phillips, 2008

👨‍💻 Cloth Tearing Simple Project, Paul Galand and Antoine Aubin, 2022