mercredi 7 décembre 2016

Python et 3ds Max... Et si c'etait pas si mauvais.




















 







Avec des logos aussi similaires on aurait pu croire à une rencontre fusionelle! Ah non, et en plus 3ds max à change de logo...


Hello à tous!


    Cela fait trop longtemps que je vais à reculons pour mettre mon nez dans le python de 3ds max... et bien voila! c'est fait ! et je vais vous en dire deux mots.
Le MaxPlus est apparu dans la version 2014, il est complete de version en version. 
MaxPlus c'est le module python de 3ds max, et c'est qu'un seul et unique gros fichier python! (déjà ça part mal vous aller me dire).
Je n'ai jamais voulu m'y plonge déjà parce que MaxPlus est trop eloigne du max script (on verra pourquoi et pourquoi c'est une bonne chose) et que de faire des choses simples me paraissait trop compliquer, surement par manque d'expérience dans la programmation. De plus je ne m'intéressais pas d'aussi pret à la programmation oriente objet. Et la pire des raisons pour que les gens ne se lancent pas dans le MaxPlus c'est le manque d'informations, la doc est aussi vide que Myspace et il y a très peu de tuto sur la toile, heureusement il y a quelques exemples, bref la communication et la documentation sont les gros points noirs du MaxPlus.

Donc voilà, ici, je pose ma brique à édifice pour y remédier.

    Le premier point que j'aimerais éclairer c'est qu'il ne faut pas chercher à se rapprocher du max script comme le fait le python et le mel, par exemple pour Maya. Vous retrouverez quelques noms de fonctions similaire, evidement, mais la logique n'est pas la même. LA raison : c'est que MaxPlus est base sur l'API C++ de 3ds Max. Et quand j'ai compris ça, les portes de mon petit cerveau se sont ouvertes.    En fait, MaxPlus est ce que l'on appelle un wrapper, il essaie tant bien que mal à "traduire" le C++ en Python. Pour faire ça les Monsieurs d'Autodesk ont choisi d'utiliser le programme swig. C'est surement pour cette raison que des choses maladroites sont faites comme l'utilisation d'un seul fichier, des classes servant de namespace, des méthodes converties en fonctions où tout un tas d'autres choses... mais qui au fond nous empeche pas d'utiliser MaxPlus.

    Ayant compris ça il est donc possible de lire la doc C++ et de s'y retrouver en MaxPlus. Nous retrouverons les "interfaces" C++, plus simplement dit les "objets, comme les INodes, Animatable, FPInterface... À la différence avec le max script où nous ne retrouvons pas de manière transparente ces objets. L'exemple flagrant est la création d'une teapot, en maxscript le mot "teapot" suffit à faire apparaitre une teapot dans le viewport, en MaxPlus il va falloir deux lignes de code mais derrière ces deux lignes il y a un concept simple de la 3d : les notions de node et d'objet referent. Alors que le maxscript jou la boîte noire sur ce genre de chose (ce que veut faire le nouveau pymx 2017) 
 
Un autre element fort intéressent est l'intégration de PySide, ce qui change pas mal la donne par rapport au Maxscript (sans .net). Avec PySide, le wrapper python de Qt, nous allons pouvoir faire des interfaces vraiment pousse. Par contre... il semble qu'avec des interceptions (de click, touches, move...) un peu pousse 3ds Max perd le contrôle et la navigation dans le viewport devient impossible.

    Malheureusement il manque pas mal de choses essentiels dans Max plus. Comme par exemple l'interface skinOps qui permet d'utiliser efficacement le modifier skin. Un petit éditeur integre à Max pour pouvoir taper quelques lignes a le vole. L'implementation des types python, les INodeTab, les tableaux de INode, sont partiellement implémentés en liste python; maliste[-1] nous retournerons un Index Error Index out of range... ce qui oblige à faire une petite liste compréhension pour convertir l'INodeTab en une liste python de INode. Ne possède pas de moyen simple de lister tous les objets de la scène. Ou encore l'utilisation de getter / setter en plus des properties classique, par exemple:



INode.name #retourne name

INode.name = mon_nouveau_name #set un nouveau nom

INode.GetName() #retourne name

INode.SetName(mon_nouveau_name) #set un nouveau nom

   De mon point de vue MaxPlus semble assez prometteur malgré tous ses défauts et j'ose espérer que cest sur la bonne voie. Ce qui me fait le plus peur c'est Autodesk... et que les dernières maj de python max de la version 2017 sont loin d'etre ce que j'attendais ....