On pourrait citer une multitude de ressources sur l’apprentissage du code, mais chacun ne traite que du code et purement du code. Ici, c’est votre travail de graphiste qui vous montrera comment, de vos actions, vous pourrez les transformer en code.
Le but, ici, est de vous montrer :

  • comment débuter facilement
  • que coder ne veut pas dire « doctorat en mathématiques »
  • des concepts basiques de la programmation
  • que tout ça n’est pas sorcier
  • découvrir le MEL
  • le transformer en Python

Configurer maya

Peu de choses, le script editor se trouve ici:

Activez l’affichage du Stack trace

Vous n’avez rien besoin de plus.

Premiers pas – MEL

Dans cette partie, nous traiterons de comment commencer à scripter en MEL à partir de vos actions en tant que graphiste.

Actions

Créons une première scène basique:

  • un cube
  • on le groupe
  • on renomme le cube et le groupe

Regardez ce qui est écrit dans le script editor, ça ressemble très fortement aux actions que vous avez entreprises, mais aussi à la liste d’actions précédente!

polyCube -w 1 -h 1 -d 1 -sx 1 -sy 1 -sz 1 -ax 0 1 0 -cuv 4 -ch 1;
// Result: pCube1 polyCube1 // 
doGroup 0 1 1;
select -r group1 ;
rename "group1" "papa";
// Result: papa // 
select -r pCube1 ;
rename "pCube1" "jouet";
// Result: jouet // 

Ceci est un enchainement de fonctions MEL, vous pouvez commander Maya grâce à ça.
Les // définissent un commentaire, les lignes à droite ne seront pas interprétées par Maya lors de l’exécution.
On va s’amuser un peu:

  • faites une nouvelle scène (une nouvelle commande apparait: file -f -new;)
  • copiez/collez le script suivant dans un onglet MEL du script editor
  • exécutez (ctrl+a pour tout sélectionner, ctrl+entrée pour exécuter)
polyCube -w 1 -h 1 -d 1 -sx 1 -sy 1 -sz 1 -ax 0 1 0 -cuv 4 -ch 1;
doGroup 0 1 1;
select -r group1 ;
rename "group1" "papa";
select -r pCube1 ;
rename "pCube1" "jouet";

Vous devriez avoir exactement le même résulta qu’a la main.
Analysons maintenant la première ligne:
polyCube -w 1 -h 1 -d 1 -sx 1 -sy 1 -sz 1 -ax 0 1 0 -cuv 4 -ch 1;
La commande commence par le nom de la commande: polyCube, suivit de ce qu’on appelle les arguments (-w 1, …) et termine par un ;.
Les arguments servent à paramétrer la commande, si vous les changez, le résulta changera.
Essayez donc:
polyCube -w 2 -h .5 -d 1 -sx 10 -sy 1 -sz 1 -ax 1 1 1 -cuv 4 -ch 1;

Documentation

La partie la plus importante est la documentation, sans elle, vous êtes aveugles.
Heureusement, Maya à une documentation très simple et complète quant à ses commandes, elle se trouve ici.

Observez la documentation de notre polyCube.

Le premier détail à observer est le nom des paramètres. Le retour maya donne le nom court des paramètres. Aussi, le paramètre court -w est en réalité -width dont la description est Width of the cube. Default: 1.0.

Les paramètres ayant un Default sont optionnels.
Si vous avez cherchés la documentation des autres commandes, vous avez du vous casser les dents sur doGroup. En effet, ce n’est pas une commande maya à proprement parler mais une procédure. Pour le moment, ce que vous avez à retenir, c’est que les procédures sont un groupe de commandes encapsulées dans un fichier afin de pouvoir les réutiliser.

Précisions

doGroup

Quand un retour ne vous parait pas clair, vous pouvez demander à Maya de quoi il s’agit:

whatIs polyCube;
// Result: Command // 
whatIs doGroup;
// Result: Mel procedure found in: C:/Program Files/Autodesk/Maya2020/scripts/others/doGroup.mel // 

Il vous dit même où trouver la source de cette procédure!

Simplification

Je recommande, pour plus de lisibilité et de maintenabilité, d’utiliser le nom long des paramètres.
Nous pouvons réécrire notre liste d’action en fonction de ce qu’on connait déjà:

file -force -new;  // Comme ça on reset tout avant
polyCube -width 2 -height .5 -subdivisionsX 10 -axis 1 1 1;
group;  // La procedure execute la commande group
rename "group1" "papa";
rename "pCube1" "jouet";

Variables

Reprenons cette partie :

polyCube;
// Result: pCube1 polyCube1 //

Via les arguments, nous pouvons spécifier le nom du cube crée:

polyCube -n "uber_super_cube";
// Result: uber_super_cube1 polyCube3 //

De cette manière, la partie

rename "group1" "papa";
rename "pCube1" "jouet";

N’es plus valide, vu que pCube1 est maintenant uber_super_cube1.
De plus, vous avez remarqués que la ligne //Result: pCube1 polyCube1 est changée en // Result: uber_super_cube1 polyCube3.
Ca veut dire que la commande polyCube nous renvoie des valeurs, ici, deux mots correspondant à uber_super_cube1 et polyCube3. Nous pouvons stocker ce résulta en mémoire afin de le réutiliser.
C’est un des concepts fondamentaux de tout script/programme, la mise en mémoire d’une valeur pour la réutiliser, on les appelle variables.

On les déclare de cette manière:
$value = 10;
Le nom commence par un $, et on place un = entre le nom de la variable et sa valeur.
Pour afficher son contenu:
print($var);
Pour une commande, on doit rajouter ` au début et à la fin de la commande:

$var = `polyCube -w 2 -h .5 -d 1 -sx 10 -sy 1 -sz 1 -ax 1 1 1 -cuv 4 -ch 1`;
print($var);
pCube4
polyCube4

$var contient ce qu’on appelle une liste. Pour accéder à un de ces éléments, on spécifie son index entre [], l’index est la position de l’objet voulu et commence par 0:

print($var[0]);
pCube1

Nous pouvons simplifier/debugger notre script:

file -force -new;  // we clear the scene
$my_cube = `polyCube -width 2 -height .5 -subdivisionsX 10 -axis 1 1 1 -n "cube_msh"`;  // with a super cool name
$my_group = `group`;  // this returns the new group name
rename $my_group "papa";  // renames the group by papa
rename $my_cube[0] "jouet";  // renames the mesh by jouet

Type de données

Vous avez brièvement vu certains type de données: liste, mot, nombre, soyons maintenant un peu plus précis.

Il existe, en MEL plusieurs type de données dont:

  • les nombres: -10, 0, 5, …
  • les nombres décimaux: -10.102, 0.0, 5.6, …
  • les chaines de caractères: "cube", "jouet", …
  • les listes (ou array) qui peuvent contenir les types ci dessus: {“blahone”,“blahtwo”,“blahthree”}

Et quelques autres.

Conclusion

Vous pouvez donc très facilement, en MEL, le langage natif de script de maya, créer des scripts afin d’automatiser vos taches redondantes.

Voici quelques ressources utiles:
Documentation Commands Maya
# MEL How-To

Python

Vous pouvez très bien vous limiter au MEL pour scripter dans maya, je ne vais pas faire de débat dessus, et n’avancerais qu’une comparaison: coder en MEL c’est ne boire que de la 1664, s’ouvrir au Python, et potentiellement d’autres langages, c’est découvrir qu’il existe une multitude d’autres bières, du rhum, du vin, des cocktails…

MEL to Py

Vous avez vu qu’un commande MEL pouvait s’écrire de cette manière:
$var = `command -argument`;
L’équivalent python est:
var = command(argument)

En reprenant notre petit script MEL:

file -force -new;  // we clear the scene
$my_cube = `polyCube -width 2 -height .5 -subdivisionsX 10 -axis 1 1 1 -n "cube_msh"`;  // with a super cool name
$my_group = `group`;  // this returns the new group name
rename $my_group "papa";  // renames the group by papa
rename $my_cube[0] "jouet";  // renames the mesh by jouet

devient en python:

import maya.cmds as mc

mc.file(force=True, new=True)  # we clear the scene
my_cube = mc.polyCube(width=2, height=.5, subdivisionsX=10, axis=[1, 1, 1], name="cube_msh")  # with a super cool name
my_group = mc.group()  # this returns the new group name
mc.rename(my_group, "papa")  # renames the group by papa
mc.rename(my_cube[0], "jouet")  # renames the mesh by jouet

Voici les différences majeures constatées sur ce bout de code:

  • il n’y a pas de ;
  • import maya.cmds as mc
    python, n’étant pas un langage propre à maya mais un logiciel indépendant, celui ci à besoin de savoir où il doit piocher ses fonctions.
    Le concept de procédure n’existe plus.
    import maya.cmds permet d’exposer un groupe de fonctions utilisable par notre script,
    as mc permet de les utiliser en n’ayant besoin de préfixer les fonctions que par mc. au lieu de maya.cmds.
    En préfixant les fonctions (anciennement commandes en MEL), par mc., on permet à python d’utiliser les fonctions qu’on connait déjà.
    maya.cmds s’appelle un package.
  • mc.file(force=True, new=True)
    On spécifie à python: utilise cette fonction provenant de cette ressource (package): appelle la fonction file provenant du package mc.
    Les arguments sont mis entre parenthèse. Les arguments optionnels, dans notre cas, doivent spécifier une valeur: force=True.
  • my_group = mc.group()
    Dernière observation, en python, il n’y à pas de $ en début de variable ni de ` en début et fin de commande.

Type de données

En python, les types les plus utilisés sont:

  • int: -10, 0, 5, …
  • float
  • bool
  • string
  • les nombres (int): -10, 0, 5, …
  • les nombres décimaux (float): -10.102, 0.0, 5.6, …
  • les chaines de caractères (str): "cube", "jouet", …
  • les booleens (bool): True ou False

les conteneurs:

  • les listes (list): [-5, 6.3, "foo"]
    Contrairement au MEL, peuvent contenir de n’importe quel types
  • les relations clé/valeur (dict): {"keya": "valueA", "keyb": "valueb"}

Ressources

Quelques ressources pour aller plus loin.

openclassrooms
courspython

TP

Le plus dur est de trouver quoi faire, les exemples ne manquent pas, mais sans idées clair, on peut vite se perdre.
Pour aller au bout de ces exemples, une dernière notion très importante est la recherche.
Chaque script nous apprend quelque chose, il vous faudra chercher dans maya comment accomplir une tache, chercher sur le net si un concept de programmation n’a pas été abordé dans ce cour (tous en gros…), tel que les conditions, les boucles, … C’est comme ça que vous allez apprendre.
Dites vous que si vous ne trouvez pas un élément de réponse sur le net, c’est que vous avez mal formulé le problème.
Voici des exemples par département.

Modeling

Clean de scène avant d’envoyer au département suivant.

  • supprimer tous les objets préfixés par _trash_
  • supprimer toutes les références
  • vérifier que les nodes de type mesh sont suffixés par _msh
  • vérifier que les groupes sont suffixés par _grp
  • vérifier que les meshs sont conformes (pas de trous, pas de ngons, …)

Notions:
Listes, boucles, recherche dans les strings.

Rigging

Créer des manipulateurs le long d’une chaine de joint.
Pouvoir mettre à jour leur forme et couleur.

Notions:
Listes, boucles, attributs maya.

Shading

Créer un attribut qui défini un type de matériel par object/groupe.
Générer un shading network correspondant à ce matériel et l’assigner en fonction des attributs précédents.

Notions:
Listes, boucles, dictionnaires.

Layout

Générer une ville à base de cubes de démentions et couleurs aléatoires.

Notions:
Boucles, random.

Animation

Pour chaque object séléctionné, créer une animation en zig zag.

Notions:
Boucles, random

Lighting

Créer un dome light avec une HDR dans le dossier de projet maya.
Créer une animation pour une tournette.
La rendre.

Notions:
Gestion de chemin de fichier.

Conclusion

En espérant que ça vous permette de vous initier au script et surtout vous permette de ne plus perdre de temps sur vos taches répétitives.