Qu'est-ce que Mutable ?
Mutable est une trousse à outils de l'Unreal Engine qui permet de générer des maillages squelettiques, des matériaux et des textures dynamiques dans l'éditeur ou à l'exécution. Elle a été conçue pour aider les infographistes et les concepteurs à créer des systèmes de personnalisation des personnages, mais elle peut générer divers contenus dynamiques, comme des animaux, des accessoires et d'autres ressources à maillage squelettique.
Mutable est conçu pour fonctionner de manière efficace en jeu, mais c'est aussi un outil de pipeline de contenu pour les projets qui requièrent la flexibilité nécessaire pour créer de nombreuses variations de maillage squelettique dans l'Unreal Editor.
Mutable est conçu pour :
Prendre en charge la personnalisation approfondie avec de nombreux paramètres et couches de texture.
Prendre en charge les interactions de maillage complexes.
Prendre en charge les effets de texture peu performants sur le GPU, tels que les projections enveloppantes et de nombreuses projections planes.
Optimiser l'utilisation de la mémoire
Réduire le coût des shaders.
Réduire le nombre d'appels à générer.
L'utilisation de Mutable déplace une partie des coûts en mémoire et en CPU au moment de la génération des personnages. Les personnages sont générés en arrière-plan à l'aide de ressources de CPU et de mémoire de travail. Ils n'utilisent que les ressources d'un maillage squelettique prégénéré une fois la génération terminée.
Fonctionnalités de Mutable
Mutable contient les fonctionnalités suivantes :
General
Des systèmes de paramètres flexibles relient les objets personnalisables à effets multiples.
Diviser les personnages personnalisables en plusieurs ressources pour faciliter le travail simultané des artistes.
Maillage
Supprimer les parties masquées afin d'optimiser les performances et d'éviter les conflits d'affichage entre surfaces proches (z-fighting).
Précalculer les morphoses au moment de la génération des personnages.
Fusionner les maillages afin de réduire les appels à générer.
Déformer les maillages en fonction des interactions entre les parties du personnage.
Les textures
Précalculer des images de texture à l'exécution en combinant plusieurs effets.
Prendre en charge plusieurs types de projecteurs : planaire, cylindrique et enveloppant.
Prendre en charge plusieurs modes de fusion de textures : multiplication, lumière douce, lumière vive, brûlage, densité des couleurs, etc.
Gérer les dispositions UV afin de supprimer de façon dynamique les parties de texture superflues.
Animation et physique
Combiner les graphiques d'animation de plusieurs parties.
Fusionner et déformer les ressources physiques de collision avec les maillages.
Gérer les données de simulation de textile lors de la génération des personnages.
Performances
Instanciation flexible de personnages personnalisés.
Prendre en charge la gestion des LOD à l'exécution.
Prendre en charge plusieurs états pour ajuster la génération de personnage à différents cas d'utilisation.
Prendre en charge le chargement dynamique de textures avec la génération à la demande.
Objets et acteurs personnalisables
Le diagramme ci-dessous montre la façon dont les maillages, les textures et les matériaux sont utilisés pour la personnalisation de personnages. Les principaux concepts du système sont les ressources CustomizableObject, les ressources CustomizableObjectInstance et les acteurs dotés de composants spéciaux qui utilisent ces ressources.
Mutable utilise des ressources CustomizableObject, des ressources CustomizableObjectInstance et des acteurs dotés de composants spéciaux pour créer les ressources finales.
Objets personnalisables
Les objets personnalisables sont un nouveau type de ressource ajouté à l'Unreal Engine. Ils représentent un objet pouvant être personnalisé à l'aide de Mutable. Cela comprend toutes les variantes qui peuvent lui être appliquées. Il définit les paramètres contrôlés à l'exécution par le joueur ou le code du jeu, et la façon dont ils affectent les objets finaux.
Vous pouvez créer des objets personnalisables dans le tiroir à contenu ou le navigateur de contenu à l'aide du menu Ajouter un nouveau :
Créer un objet personnalisable.
Paramètres
Un objet personnalisable contient plusieurs paramètres qui peuvent être modifiés à l'exécution. Il existe plusieurs types de paramètres :
Paramètres du curseur : paramètres numériques avec des décimales, compris entre 0,0 et 1,0. Ils sont généralement créés explicitement par un Node-Float-Parameter et utilisés pour des effets continus tels que des effets de texture ou les morphoses de maillage.
Paramètres d'énumération : ils représentent une option dans un ensemble prédéfini d'options. Ils peuvent être créés par un Node-Object-Group, pour sélectionner un objet enfant, ou par Node-Enum-Parameter, pour choisir une option ou plusieurs Node-Switch.
Paramètres de case à cocher : ils représentent deux possibilités, activé ou désactivé. Ils sont créés par un Node-Object-Group lorsque le type de groupe est "Toggle Each".
Paramètres de couleur : ils représentent une couleur avec un canal alpha utilisant un vecteur de quatre valeurs float numériques comprises entre 0,0 et 1,0. Ils sont créés par Node-Color-Parameter.
Paramètres de projecteur : ils représentent un projecteur dont la position peut être modifiée à l'exécution. Ils sont créés avec Node-Projector-Parameter.
Instance d'objet personnalisable
L'instance d'objet personnalisable est un nouveau type de ressource utilisé avec Mutable. Elle représente une instance d'un CustomizableObject, un ensemble de valeurs de paramètre à appliquer à un CustomizableObject afin de créer une ressource personnalisée. Par exemple, si vous avez un CustomizableObject pour les bandits, chaque bandit unique que vous créez avec sera une CustomizableObjectInstance.
Pour créer une ressource d'instance à partir d'un objet personnalisable, faites un clic droit sur votre objet personnalisable et sélectionnez Créer une nouvelle instance :
Créer une nouvelle instance d'objet personnalisable.
Éditeurs de Mutable
Éditeur d'objet personnalisable
Double-cliquez sur un objet personnalisable pour ouvrir l'éditeur d'objet personnalisable :
L'éditeur d'objet personnalisable.
L'interface contient les panneaux suivants :
Graphique source : il renferme les nœuds blueprints qui définissent la structure de l'objet personnalisable, y compris ses paramètres de LOD, les sections de maillage, les maillages, les textures, les paramètres et les effets qui les relient.
Propriétés de l'objet : il renferme les propriétés générales de l'objet.
Propriétés du nœud : il renferme les propriétés du nœud sélectionné.
Hublot de l'instance de prévisualisation : il affiche l'aperçu 3D lorsqu'un objet est ouvert et compilé.
Paramètres de l'instance de prévisualisation : il affiche les paramètres actuels de l'objet en prévisualisation. Vous pouvez les modifier directement ici. Il peut également "précalculer" l'instance actuelle en un ensemble de ressources standard de l'Unreal Engine. Consultez la rubrique Précalculer des instances pour en savoir plus.
La barre d'outils de l'éditeur contient les éléments suivants :
Enregistrer : enregistrer l'objet actuel.
Compiler : compiler l'objet actuel avec tous ses enfants et met à jour l'aperçu. Cela est nécessaire pour refléter les modifications apportées au graphique. Pour plus d'informations sur la compilation et ses options, consultez la rubrique Optimisation des performances.
Compiler uniquement la sélection : compiler l'objet actuel et ses enfants prévisualisés uniquement. Cela permet une itération plus rapide lorsque l'objet personnalisable est très volumineux.
Analyseur de mémoire de texture : ouvrir un panneau d'outils qui affiche les textures résultantes de l'objet de prévisualisation et leurs détails, tels que la taille finale, le format et l'utilisation de la mémoire.
Analyseur de performance : ouvrir un panneau d'outils qui évalue l'objet actuel en générant de nombreuses instances aléatoires et en affichant plusieurs métriques pertinentes, telles que le nombre de triangles ou le temps de génération.
Éditeur d'instance d'objet personnalisable
L'éditeur d'instance d'objet personnalisable permet de visualiser et de modifier des CustomizableObjectInstances. Il ne comporte que deux panneaux et est similaire aux panneaux Aperçu et Propriétés du nœud de l'éditeur d'objet personnalisable.
Hiérarchie des objets
Objets
Mutable organise chaque objet personnalisable dans une hiérarchie. Chaque objet possède un nœud racine qui est relié à tous les autres nœuds. Ces nœuds représentent les composants, les maillages, les matériaux, les textures et les paramètres. N'importe quel objet peut avoir un nombre illimité d'objets enfants. Un enfant peut :
Ajouter des maillages et des sections de maillage à l'objet final
Étendre un maillage déjà présent dans un autre objet
Supprimer une partie du maillage dans un autre objet
Appliquer les textures d'un matériau à un autre objet.
Activer les balises définies par l'utilisateur, utilisables dans les objets du même niveau pour appliquer différents effets.
Dans le même temps, les objets enfants peuvent avoir leurs propres objets enfants dans une hiérarchie illimitée.
Groupes
Les objets enfants peuvent être organisés en groupes. Les groupes définissent la logique entre l'objet et son parent quant à la manière dont les objets enfants sont activés. Par exemple, tous les enfants d'un t-shirt peuvent être regroupés avec un paramètre d'objet qui permet aux utilisateurs de n'en sélectionner qu'un à la fois, voire aucun.
Voici deux objets enfants connectés par le biais d'un groupe :
Chaque groupe a un type de groupe qui peut être l'un des suivants :
Activer/désactiver : les objets enfants apparaissent comme des options pouvant être activées ou désactivées.
Au moins une option : un seul objet enfant doit être sélectionné.
Aucun ou un : un seul objet enfant peut être sélectionné.
Toutes les options : tous les enfants de l'objet sont actifs en permanence. Cela donne l'impression que les enfants se connectaient directement au parent.
Composants d'acteur
Un seul objet personnalisable peut générer plusieurs composants d'acteur. Les paramètres peuvent affecter plusieurs composants à la fois, mais ils peuvent également les activer ou les désactiver de façon conditionnelle. Pour créer plusieurs composants, consultez la rubrique Référence sur les nœuds de composants.
Maillage squelettique de référence
Les nœuds de composant de maillage ont une propriété appelée Maillage squelettique de référence. Il s'agit d'un maillage squelettique standard de l'Unreal Engine. Il est utilisé pour les raisons suivantes :
Tous les maillages squelettiques générés pour ce composant dans les instances de CustomizableObject utilisent les propriétés Maillage squelettique de référence pour tout ce que Mutable ne crée pas ou ne modifie pas. Cela comprend des données telles que les distances de LOD, les propriétés physiques, les volumes de délimitation, le squelette, etc. Lorsqu'une instance de CustomizableObject est créée pour la première fois, le maillage squelettique de référence est utilisé pour chaque composant d'acteur. Cette option peut être désactivée à l'aide de la fonction "SetReplaceDiscardedWithReferenceMeshEnabled" de la classe CustomizableObjectSystem. Pour plus d'informations, consultez les rubriques Utiliser Mutable en C++ et Utiliser Mutable à partir des blueprints.
C'est la raison pour laquelle les projets utilisent généralement un maillage squelettique simple ou générique comme maillage squelettique de référence. Une option consiste à remplacer le maillage squelettique de référence par un maillage squelettique précalculé généré dans l'éditeur, avec l'apparence //generic// souhaitée. Pour plus d'informations, consultez la rubrique Précalculer des instances.
Ressources multiples
Un grand CustomizableObject peut être divisé en plusieurs ressources. Cette option est importante lorsque plusieurs utilisateurs travaillent sur les mêmes données, ainsi que pour le contrôle de version. Il existe 2 fonctionnalités pour cela :
Les objets enfants peuvent être sélectionnés en tant que parent d'un groupe d'objets dans une ressource différente au lieu de les connecter directement dans un graphique. Consultez la référence sur les nœuds Object Group et Child Object pour plus d'informations.
Il existe des nœuds Diagram spéciaux pour exporter et importer des connexions à partir du graphique dans d'autres ressources.
Ceci est utile pour les données de l'éditeur, mais cela n'a rien à voir avec le chargement dynamique des données dans les jeux empaquetés. Le chargement dynamique de données pour les jeux empaquetés a lieu indépendamment du fait que l'objet personnalisable soit divisé en plusieurs ressources ou non.
Interactions entre objets
Mutable dispose de plusieurs fonctionnalités permettant de gérer les interactions entre objets. L'une est Object Groups, qui crée des paramètres d'instance qui sélectionnent un seul objet enfant d'un ensemble, de sorte qu'il n'est pas possible d'ajouter plus d'un de ces objets. Prenons l'exemple d'un groupe pour les chapeaux de personnage, qui permet de sélectionner un seul chapeau ou aucun, mais jamais deux en même temps.
De plus, Mutable dispose d'un système qui permet de créer différentes variantes d'un objet en fonction des autres objets ajoutés à une instance. Imaginons par exemple un personnage avec plusieurs coiffures et chapeaux. Vous pouvez créer des variations pour certaines coiffures qui seront utilisées lorsque le personnage possède un type de chapeau. Pour cela, vous pouvez utiliser les variations de la section Maillage et d'autres nœuds Variation.
Un autre exemple d'interaction entre objets est la suppression sélective de fragments de maillage d'un objet à l'aide de modificateurs présents dans un autre objet.
Ces deux types d'interactions entre objets utilisent le système de balise. Vous pouvez définir vos propres balises et les activer lorsqu'un objet est actif dans une instance. Le nœud Mesh Section permet d'ajouter des balises. Ensuite, plusieurs nœuds agissent différemment en fonction des balises présentes dans une instance donnée, comme le nœud Mesh Section Variation de ou le nœud Clip Mesh With Mesh Modifier.
Dispositions de texture
Mutable permet de fusionner des maillages et des sections de maillage de plusieurs objets en un seul maillage. Il permet également de supprimer des fragments de maillage des maillages existants. Ce faisant, Mutable modifie la disposition des UV de texture afin d'optimiser l'utilisation de la mémoire et de limiter les commandes de rendu. Mutable le fait automatiquement par défaut, mais le contrôle manuel est disponible par le biais de plusieurs propriétés dans le nœud Skeletal Mesh et le nœud Table.
Pour plus d'informations, consultez la rubrique Disposition des textures.
États
Un état représente un cas d'utilisation spécifique du jeu (comme en jeu, personnalisation des textiles, personnalisation faciale, etc.). Il peut être configuré avec un ensemble de paramètres que Mutable peut modifier facilement. Les états sont utilisés pour optimiser les mises à jour des instances. Par exemple, un état peut être optimisé pour les modifications du visage, un autre pour celles du corps, un autre pour les tatouages, et un autre encore pour les éléments susceptibles d'évoluer pendant le gameplay. Utiliser des états permet d'accélérer le temps de mise à jour du personnage en ne modifiant que les paramètres optimisés dans l'état sélectionné pour le personnage.
Consultez la page États pour en savoir plus.
Streaming
Le chargement dynamique des données de Mutable est important pour réduire l'utilisation de la mémoire. Un personnage personnalisable peut disposer de centaines d'options et d'éléments de personnalisation. Sans chargement dynamique de données, ils devraient être chargés en même temps du disque vers la mémoire, ce qui utiliserait plusieurs Go de RAM et prendrait beaucoup de temps. Mutable ne charge que les parties utilisées, ce qui réduit significativement la consommation de mémoire et les temps de chargement. De plus, toute partie non utilisée est déchargée.