Utilisateur:RemiCr/Brouillon

Max Creation Graph (MCG) est un langage graphique basé sur des graphes qui permet de fabriquer des outils pour créer, modifier et animer du contenu de manière procédurale. MCG est inclus dans le logiciel 3ds Max depuis la version 2016.[1] Il sert à programmer des modules complémentaires accessibles depuis 3ds Max, sans avoir recours à un éditeur de code. L’environnement de MCG permet de créer des graphes dans lesquels chaque bloc représente une étape de la procédure et chaque connexion représente un transfert de données de la sortie d’un bloc à l’entrée du suivant. Le graphe résultant représente un flux de données qui se lit de gauche à droite : les données entrent dans les Paramètres ou les Entrées et traversent les opérateurs vers la droite jusqu’à un bloc de sortie qui détermine le type de graphe. MCG peut être utilisé pour générer, entre autres, des primitives graphiques, des modificateurs et des contrôleurs d’animation pour 3ds Max.

Mise en contexte

modifier

La création de MCG a été motivée par un contexte où les approches procédurales dans la création de contenu sont de plus en plus encouragées.[2]

Les projets de création de contenu 3D deviennent de plus en plus complexes et nécessitent le travail de plus en plus de personnes. Même en divisant le travail entre les artistes, il est difficile de gérer les dépendances entre tous les morceaux d’un projet. De plus, les clients veulent proposer des changements tard dans le processus de production.[3]

L’approche procédurale consiste à créer ou modifier du contenu à partir de paramètres et d’algorithmes, par opposition à une approche manuelle. Elle permet de modifier des paramètres à une étape du projet et de voir ce changement se propager à toutes les étapes subséquentes sans avoir à manuellement réajuster les autres paramètres. Par exemple, si le positionnement de poteaux électriques se fait de manière procédurale par rapport au sol, un changement dans la forme du terrain va automatiquement ajuster la position des poteaux. Elle permet aussi de générer automatiquement du contenu en suivant certaines règles prédéfinies. Cette approche semblait donc appropriée pour faciliter la réalisation de projets d’envergure en réduisant la quantité de travail manuel à effectuer à chaque fois qu’un paramètre est modifié.[4]

De plus, au moment de la sortie initiale de MCG, l’ajout de contenu procédural était l’idée la plus votée sur le site de suggestions pour 3ds Max.[5]

Éditeur de graphes

modifier

L’éditeur de graphes est accessible dans le menu Scripting -> Max Creation Graph. Visuellement, ce dernier s’apparente au Slate Material Editor. L’éditeur est divisé en cinq sections principales. La colonne de gauche contient la liste de tous les blocs disponibles, divisés en catégories. La fenêtre en bas à droite contient la documentation sur l’opérateur actuellement sélectionné. La fenêtre en bas à droite contient les messages retournés par le compilateur et le vérificateur de types. La section principale quadrillée contient les graphes.

Partage des graphes

modifier

L’éditeur MCG offre la possibilité de compiler un graphe .maxtool et tous les graphes imbriqués .maxcompound qu’il contient dans un seul fichier .mcg. Ce fichier peut ensuite être partagé. Il est également possible d’installer des fichiers .mcg à partir de l’éditeur pour accéder aux graphes qu’il contient[5]. On peut trouver une section dédiée aux graphes MCG sur les sites ScriptSpot et CreativeMarket.[6]

Il existe aussi d’autres méthodes pour déployer des graphes MCG sur un réseau.[7]

Types de blocs

modifier

Dans MCG, les opérateurs, paramètres et autres sont représentés par des blocs rectangulaires qui disposent de connecteurs de part et d’autre. Les connecteurs à gauche d’un bloc représentent les entrées et ceux à droite représentent les sorties. La couleur d’un connecteur indique le type de données qui peut être transmis par ce dernier.

Schéma simplifié d'un graphe MCG contenant des paramètres, des opérateurs et une sortie.

Paramètre

modifier

Un paramètre correspond à une donnée qui est passée au graphe lors de l’exécution. Il ne dispose que d’un connecteur de sortie. Il existe deux types de paramètres, soient les paramètres explicites et implicites.

Explicite : Un paramètre explicite est une entrée avec laquelle l’utilisateur peut interagir. Un champ approprié est donc automatiquement généré dans l’interface utilisateur pour chaque paramètre explicite présent dans le graphe. Le bloc Paramètre permet généralement de spécifier une valeur par défaut. Pour les types numériques, il permet aussi de définir des limites dans la plage de données que l’utilisateur pourra entrer.

Implicite : Un paramètre implicite est spécifique à un certain type de graphe. Ce dernier ne peut pas être directement modifié par l’utilisateur. Il ne génère donc pas de champ dans l’interface. Par exemple, dans un graphe de modificateur, le paramètre Modifier : TriMesh permet d’accéder à l’objet à modifier sans que l’utilisateur ait à le spécifier.

Opérateur

modifier

Les opérateurs constituent la majeure partie des graphes. Un opérateur représente généralement une fonction qui prend un nombre défini d’entrées et qui retourne un résultat. Il peut aussi représenter une constante ou un énoncé de contrôle, par exemple une condition ou une boucle.

Graphe imbriqué (compound)

modifier

Un graphe imbriqué est un opérateur qui a été défini dans un autre graphe MCG. Dans un graphe, il fonctionne de la même manière qu’un opérateur de base. Les graphes imbriqués permettent de factoriser les graphes et de créer des fonctions réutilisables à partir de MCG.

Entrée

modifier

Une entrée (Input) est utilisée lors de la création d’un opérateur imbriqué. Elle représente un des connecteurs d’entrée qui apparaitront sur l’opérateur. Le bloc d’entrée ne dispose que d’un connecteur de sortie.

Une sortie est le bloc terminal d’un graphe. Un graphe doit contenir seulement une sortie pour être valide. Le type d’un graphe est déterminé à partir de son opérateur de sortie.

Types de graphes

modifier

MCG Peut être utilisé pour concevoir différents types de graphes. Le type de graphe est déterminé à partir de son bloc de sortie. Certains types de graphes ont accès à des Paramètres implicites additionnels.

Version originale[5]

Type de graphe Bloc de sortie Paramètres implicites Description
Primitive géométrique Output : geometry Geometry : Matrix Génère un maillage 3D
Modificateur Output : modifier Modifier : Matrix

Modifier : TriMesh

Modifier : BoundingBox

Génère un modificateur peut être appliqué sur un maillage existant
Fonction MaxScript Output : MAXScript function Aucun Génère une fonction qui peut être appelée dans un script ou dans la console MAXScript
Graphe imbriqué (compound) Output : Compound Aucun Génère un opérateur qui peut être utilisé dans d'autres graphes

Depuis 3ds Max 2016 extension 1[8]

Type de graphe Bloc de sortie Paramètres implicites Description
Contrôleur d’animation Output : <TYPE> Controller Transform Controller : Matrix Génère un contrôleur qui permet d'animer un objet existant et/ou ses attributs

Depuis 3ds Max 2016 extension 2[9]

Type de graphe Bloc de sortie Paramètres implicites Description
Primitive de forme Output : shape Shape : Matrix Génère une spline

Caractéristiques du langage[10]

modifier

Fonctionnel

modifier

Le langage de programmation de MCG est basé sur le paradigme de programmation déclaratif fonctionnel. Son noyau a été conçu selon l’approche purement fonctionnelle. En effet, chaque bloc d’un graphe, à l’exception de la sortie, représente une fonction qui génère un résultat à partir de ses entrées. Chaque fonction récupère le résultat des fonctions précédentes pour effectuer son calcul. On retrouve dans MCG certaines caractéristiques typiques des langages fonctionnels :

Objets immuables : La majorité des structures de données utilisées dans MCG sont immuable, c’est-à-dire qu’elles ne peuvent pas être modifiées après leur construction. Cela permet entre autres d’implanter des opérateurs qui s’exécutent en parallèle dans se soucier des conditions de course.

Absence d’effets de bord : À l’exception de certains blocs spécifiques, les opérateurs MCG n’ont pas d’effet de bord. Cela signifie que pour des données en entrée constantes, le graphe produira toujours le même résultat.

Transparence référentielle : Une des conséquences de l’absence d’effets de bord est le respect de la transparence référentielle. Dans un graphe MCG, un opérateur retourne toujours le même résultat, peu importe l’ordre dans lequel les opérations sont exécutées sous le capot.

Fonctions en tant que données : Dans MCG, les opérateurs et les sous-graphes représentent des fonctions. Ces dernières peuvent être passées en paramètre, stockées dans des tableaux et retournées par d’autres fonctions comme n’importe quel autre type de données. Le passage de fonctions par paramètre s’effectue en connectant la sortie de type Func dans l’entrée désirés. Ceci est l’équivalent de passer le sous-graphe en tant qu’expression lambda à l’opérateur qui prend une fonction en paramètre.

Compilé

modifier

Lors de l’évaluation du graphe, ce dernier est compilé en code binaire du Microsoft .NET Framework. Cette approche a été préférée à une approche par interpréteur par souci de performance[5]. Elle permet aussi de détecter certaines erreurs directement à la compilation plutôt qu’à l’exécution.

Statiquement typé

modifier

Le compilateur de graphe détermine les types de tout de toutes les données qui traversent le graphe à la compilation. MCG dispose d’un moteur de déduction de type pour déterminer le type réel des connections de type quelconque ainsi que le type contenu dans les tableaux à partir du reste du graphe. Si la déduction de types échoue, la compilation échoue aussi.

Architecture logicielle

modifier
Schéma simplifié de l'architecture logicielle de MCG

Implantation des opérateurs[3]

modifier

Les opérateurs de base de MCG et les types de données sont conçus à l’aide du langage C# et du framework .Net. Lors de la compilation, certains opérateurs sont traduits directement en opérateurs primitifs de C#, comme les opérations mathématiques de base. Les autres sont traduits en fonctions C# de plus haut niveau. 

Intégration dans 3ds Max[5]

modifier

Chaque graphe compilé génère un nouveau plugin de 3ds Max avec un identifiant unique. La compilation génère aussi un Wrapper MAXScript pour permettre à 3ds Max d’interagir avec le plugin et pour définir l’interface utilisateur.  Il est possible de modifier le fichier MAXScript pour personnaliser l’interface utilisateur de l’outil (Dans l’onglet Custom UI du menu Graph Properties).

Références

modifier
  1. (en) Eddie Perlberg, « Introducing 3ds Max 2016 », sur https://area.autodesk.com, (consulté le )
  2. (en) Kim Davidson, « Gamasutra - Sponsored: Go Procedural - A Better Way to Make Better Games », sur https://www.gamasutra.com, (consulté le )
  3. a et b (en) Autodesk, « Autodesk Vision Series: Procedural Content Creation », sur https://www.youtube.com/, (consulté le )
  4. (en) « The Future of Procedural Content Creation in 3D », sur https://simplymaya.com, (consulté le )
  5. a b c d et e (en) Christopher Diggins, « Introducing Max Creation Graph », sur https://area.autodesk.com, (consulté le )
  6. (en) « Max Creation Graph: The Year in Review », sur https://area.autodesk.com, (consulté le )
  7. (en) Martin Ashton, « MCG - The Network Deployment Guide | Learning | Area by Autodesk », sur https://area.autodesk.com, (consulté le )
  8. (en) Christopher Diggins, « Max Creation Graph Updates in 3ds Max 2016 Extension 1 », sur https://area.autodesk.com, (consulté le )
  9. (en) Eddie Perlberg, « 3ds Max 2016 Extension 2 », sur https://area.autodesk.com, (consulté le )
  10. (en) Christopher Diggins, « MCG: Visual Functional Programming », sur https://area.autodesk.com, (consulté le )