dimanche 18 novembre 2012

Enumerate list python la fin du range.

    J'ai découvert il y a peu de temps une fonction de l'objet list qui existe depuis quelques temps mais qui se fait discrète, elle m'a drôlement simplifier la vie. Cette fonction c'est enumerate(list). Enumerate d'une list retourne un objet pas vraiment exploitable.
 
listA = ["un", "deux", "trois", "quatre", "cinq"]
print (enumerate(listA))
#enumerate object at 0x000000000209A900

La où énumerate est vraiment intéressant c'est son utilisation dans une boucle for. Par item enumerate return un tuple contenant l'index de l'item et l'item lui même:
listA = ["un", "deux", "trois", "quatre", "cinq"]

for i, item in enumerate(listA):
    print (i)
    print (item)


# Result:
0
un
1
deux
2
trois
3
quatre
4
cinq


Voila finit les:
 

for i in range(0, len(listA)):
    print (i)
    print (listA[i])

i = 0
for item in listA:
    print (i)
    print (item)
    i += 1 

Faut avouer que avec enumerate c'est quand même plus propres et plus python like. see ya

dimanche 21 octobre 2012

PyQt parent to main maya window


    Pour parenter sa fenetre pyqt a celle de maya pour pouvoir l'avoir en top et qu'elle se hide avec elle. Il faut récupérer le QMainWindow() et y parenter notre nouvelle fenêtre grasse au module SIP.
Exemple:



import maya.OpenMayaUI as OpenMayaUI
import sip
from PyQt4 import QtCore, QtGui
class window(QtGui.QMainWindow):
    def __init__ (self,        parent = sip.wrapinstance( long( OpenMayaUI.MQtUtil.mainWindow() ), QtCore.QObject )):
        super(window, self).__init__(parent)
        
d = window()
d.show()

lundi 15 octobre 2012

astuce python, compare two variables with set

        Petit astuce python fort pratique ! l'utilisation des variables de type "set". "set" permet de faire des opérations entre variables "set". Voici quelques exemples:


#union
a = set(['a','b','c','d'])
b = set(['d','d','d','d','e','f','g'])
a.union(b)

# Result: set(['a', 'c', 'b', 'e', 'd', 'g', 'f']) #
#remarques: 'd' est stocké qu'une fois dans le nouveau set; attention le set mélanges les valeurs

#différence
a = set(['a','b','c','d','e','f','g'])
b = set(['d','d','d','d','e','f','g'])
a.difference(b)
# Result: set(['a', 'c', 'b']) # 



Il existe beaucoup d'autres opérateurs, pour plus de détails:
 http://docs.python.org/library/sets.html

lundi 17 septembre 2012

PyQt right click button (QPushButton)


    Qt ne propose pas d'event 'right click', du genre mousePressRightEvent() et c'est bien dommage.  Donc c'est a nous de faire ce event, pas vraiment en créant un nouvelle fonction mais en modifiant la fonction mousePressEvent() classique. Pour cela nous devons dériver notre QPushButton a partir d'une nouvelle classe, exemple PushRightButton (le 'Q' étant réservé a Qt).


#
#


#import des modules Qt
from PyQt4.QtGui import *
from PyQt4.QtCore import *

#creation de la class, on precise qu'on derive la class QPushButton entre parentheses
class PushButtonRight (QPushButton):

    #creation du signal emetteur (emet rien pour le moment)
    rightClick = pyqtSignal()


    #creation de notre fontion __init__ avec un arg string pour le nom du futur bouton
    def __init__ (self, string):
        #on integre la classe QPushButton a notre class PushRightButton
        QPushButton.__init__(self, string)

    #modification de la fontion mousePressEvent
    def mousePressEvent (self, event):
        #on integre la fonction QPushButton.mousePressEvent(self, event) a notre fonction PushRightButton.mousePressEvent(self, event)
        QPushButton.mousePressEvent(self, event)

        #condition du click droit
        if event.button() == Qt.RightButton :
            #emittion du signal rightClick
            self.rightClick.emit()
            print ('right click')

#
#


Maintenant il suffit de creer un bouton grace a notre class PushRightButton et de faire la connection:

#
#


butRightClick = PushRightButton('hello')

butRightClick.rightClick.connect(laFuturFonction)

#
#



mardi 11 septembre 2012

MFnHikEffector

    Comment créer des jolies nodes de contrôles comme ceci (viewport en wireframe):





Grace a l'API maya et a MFnHikEffector:

import maya.OpenMayaAnim as OpenMayaAnim
node = OpenMayaAnim.MFnHikEffector()
node.create()

mercredi 29 août 2012

python mel delete history

    Petite astuce toute bête, comment faire un 'delete by type history' en mel ou python, et bien grâce a la fonction delete:

cmds.delete(ch = True)

mercredi 8 août 2012

convert string character into a variable

   Petite astuces python:
Comment convertir une chaine de caracteres en une variable et pouvoir recuperer sa valeur. Grace a la fonction locals().

sal = 12
d = 'sal'

v = locals()[d]

print v        

#Result: 12 

English version:

mardi 7 août 2012

UI function with arguments


    Comme vous avez deja pu le remarquer, Python maya accepte pas d'arguments pour les callback fonctions des UI, par exemple ce qui suit le 'command' d'un bouton...
Faire ceci n'est pas possible:

bt1 = cmds.button(l = 'test1', c = maFonction(monArgument))

La maniere la plus simple de contourner le probleme et de faire appel a la fonction functools.partial. Pour executer une fonction a l'aide de functools.partial:

functools.partial(maFonction, monArgument)

Un petit exemple concret:

import maya.cmds as cmds
from functools import partial




def selType(none = None, types = None):
    t = cmds.ls(type = types)
    cmds.select(t)
    


if cmds.window('partialEx', q= True, ex = True):
    cmds.deleteUI('partialEx')
win = cmds.window('partialEx')
lay = cmds.columnLayout()


bt1 = cmds.button(l = 'test1',p = lay, c = partial(selType, types = 'mesh'))
bt2 = cmds.button(l = 'test2',p = lay, c = partial(selType, types = 'nurbsSurface'))


cmds.showWindow(win)

Notez que functools.partial demande un argument supplementaire, ici j'ai ajouté none = None. Si la fonction est dans une class alors le self de la class fera l'affaire.

dimanche 5 août 2012

maya python vector

    Salut salut.
Je cherchais comment avoir la distance entre deux vertex quand je me suis rendu compte que dans python on travail pas avec des vecteurs, on fait tout avec les listes et les tuples. Alors que en Mel on a bien des variables de types vector:
vector $vect1 = <<0,1,0>>;
vector $vect2 = <<1,3,0>>;
vector $vect3 = $vect1 + $vect2;
// Result: <<1, 4, 0>>  // 


Alors comment faire la même chose en python dans maya ? En utilisant l'API et la class MVector, au passage voici le script qui permet d'avoir le vecteur distance entre deux vertex:
import maya.cmds as m
import maya.OpenMaya as om

vX = m.pointPosition("pCube1.vtx[2]")
vX = m.pointPosition("pCube1.vtx[3]")

vXx = om.MVector(vX[0], vX[1], vX[2])
vYy = om.MVector(vY[0], vY[1], vY[2])

vZz =  vYy - vXx

print vZz.x
print vZz.y
print vZz.z


English version:

jeudi 2 août 2012

bake animation nParticle on locators


    Ici mon objectif est de faire une simulation avec nParticles et d'y instancier un petit rig de sphere, première étape: faire la simu avec des nParticles Ball de mm taille que les spheres finals, deuxième étapes: récupérer les position de chaque particule a chaque image, troisième étapes: réattribuer ces positions a des locators (aussi nombreux que les particles) et pour finir parenter les rigs (ou autre node non simulable), dupliqué en bon nombre, aux locators.

En image:


pph264 from colin laubry on Vimeo.

et voici le script que j'ai du écrire pour faire tout cela.

#recuperation de la derniere image
endFrame = cmds.playbackOptions(q = True, maxTime = True)

#recuperation de la premiere image
startFrame = cmds.playbackOptions(q = True, minTime = True)

#recuperation de la selection, dans l'ordre nParticle Instance de base
sel = cmds.ls(sl = True)
part = sel[0]
inst = sel[1]

#nom des futurs instances dupliques
new = ("newInstance_"+part+"_")

#alignement et freeze de l'instance de base
cmds.pointConstraint(part, inst, mo = False)
cmds.pointConstraint(part, inst, rm = True)
cmds.makeIdentity(inst, apply=True, t=1, r=1, s=1, n=0)

#pour chaque frame
for i in range(startFrame, endFrame):
    #deplacement du curseur de la timeline
    cmds.currentTime(i)
    #recuperation du nombre de particles
    nPart = cmds.nParticle(part, ct = True, q = True )
    print i
    #pour chaque particle
    for j in range(1, nPart+1):
        #test de l'existence pour pas dupliquer a chaque frame
        if cmds.objExists((new+str(j))) == 0:
            #duplication de linstance de base
            dup = cmds.duplicate(inst, n = (new+str(j)))
        #recuperation de la position de chaque particle
        posPP = cmds.nParticle(part, at = 'position', id = j, q = True )
        #Attribution de la position a linstance duplique
        cmds.setAttr((new+str(j)+".tx"), posPP[0])
        cmds.setAttr((new+str(j)+".ty"), posPP[1])
        cmds.setAttr((new+str(j)+".tz"), posPP[2])
        #creation de keyframe
        cmds.setKeyframe(new+str(j)+".tx")
        cmds.setKeyframe(new+str(j)+".ty")
        cmds.setKeyframe(new+str(j)+".tz")


English Version:

Pendant ce temps-lá chez FrameStudio ...



...ca tremble !



fr expression from colin laubry on Vimeo.

Pour faire ceci j'ai du me remettre en peu au mel et creer une expression noise sur chaque petit cube qui forme le gros cube. Qui de bien fou, juste une petit subtilité que j'ai découvert pour tester l'existence d'un object:

if ( `objExists $nomTest` ) {}

Voici l'expression en entiere:




//interrupteur attr
float $of = `getAttr "nurbsCircle1.onOff"`;
//boucle pour chaque petit cube
for ( $i=1; $i<99; ++$i ){
 //nom des petits cubes
 string $cu = "pCube" + $i;
 //test existence du nom
 if ( `objExists $cu` ) {
  //random value
  float $ra = `rand 1 3`;
    
     float $ran = 1+((noise(time)*$ra)/10)*$of;
    
  //application au scale
      scale -a $ran $ran $ran $cu;

  }

 else{
 //rien mm pas un string ca evite les ralentissements
 }
  
    
}





Pour le reste, j'ai ajouté trois wave deformer sur le gros cube pour avoir ce "flottement", Pour la spherification j'ai utilisé le sculpt deformer.

dimanche 15 juillet 2012

Bug maya python

Et voila un petit report de bug python maya.  J’étais tranquille entrain de faire un light lister quand je suis tombé sur ca:
sel = cmds.ls(type = 'pointLight')
cmds.select(sel)


Quand Maya exécute ces deux lignes de codes il sélectionne aussi les volumes light, Pas très pratique pour light lister encore plus pour un light lister qui liste par type de light.

C'est fou, avec la fonction:
   cmds.ls() 
Maya distingue pas la différence entre les point et les volumes light. Le truc lolilol c'est que pour contourner le problème j'ai simplement eu besoin de faire une condition par type.
    sel = cmds.ls(type = 'pointLight')
    lss = []
    for i  in sel:
        if cmds.nodeType(i) == 'pointLight':
            lss.append(i)
    cmds.select(lss)


vendredi 13 juillet 2012

Bake vertex


Et VOILA mon dernier né:
un script qui bake un mesh par les vertex, qui enregistre les info en une séquence de fichiers et qui peut baker a partir de cette séquence de fichiers.

Ce script qui n'est pas fou m'a quand même permis d'approfondir le système de class et de découvrir le cPickle qui permet d’écrire des données (list, dict, fonction ...) en binaire ou en ASCII sur un fichier. L'avantage, je suppose, est certainement sur des traitement de donnée en masse, mais je trouve que sa création de fichier I/O est quand même plus simple que en passant par les fonctions file.

Le seul problème c'est qu'il est assez lent  quand il rencontre un très grands nombres de vertex, c'est du a la lenteur de la fonction xform. J'ai cru comprendre que en passant par l' API de maya j'aurais de meilleurs performances mais je n'ai pas encore plongé le nez dans l'API donc pour l'instant je garde ma fonction xform a deux balles.

Si ça intéresse, une fois qu'il sera "bullet proof"je le mettrais a disposition en téléchargement.

Petite vidéo de présentation:



bakescript from colin laubry on Vimeo.

Pendant ce temps-lá chez FrameStudio

Explosion de papier trop cool:
    -ground rigging
    -blendshape
    -particles
    -rigidbody



FR Shot04 anim v26 CL from colin laubry on Vimeo.

    La vrai première fois que je fais des fx dans maya et ben les particles c'est le bordel, il n'y a même pas de mesher, la loose, j'ai du adapter un script trouvé sur le net mondial. Je précise que c'est les vieilles particles pas les nParticles.
    Pour les simu physique sa marche bien et c'est rapide.

L'anim des bonhomme, c'est Fanny.b.





mercredi 13 juin 2012

pyton pymel cacheFile

yo,

La prod du labo (canal+) fut la première expérience a supinfocom où nous avons utilisé le couple maya max. Maya pour l'anim et max modé et rendu. 
Maya ne gérant pas ça, j'ai du faire un petit outil d'export de point cache par lot.



Apprenant au fur et a mesure j'ai commencé par utiliser la pré fonction mel:
   
doCreateGeometryCache 6 {  0 , $valueStart, $valueEnd, 
"OneFilePerFrame", "1", $path,"0",$name,"0", "add", "0", "1", "1","0","1",
"mcc","0" } ;

Les arguments: {
    (0 custom start/end, 1 render globals, 2 timeline),
    (start value),
    (end value),
    (type d'enregistrement "OneFilePerFrame", "OneFile"),
    (0/1 refresh caching), (chemin d'enregistrement),
    (0/1 appliqué le cache a chaque mesh),
    (le nom du cache file),
    (0/1 utilisé le nom comme prefix),
    (le type d'action: "add", "merge", "mergeDelete", "replace"),
    (0/1 forcer l’écriture du fichier),
    (0/1 force une simulation si presente),
    (simulation rate),
    (sample mulitplier),
    (0/1 double float),
    (nom du format),
    (0/1 local ou world space),
}


Puis je suis passé au pymel et j'ai compris le gain de performance par rapport au mel (peut etre x10 dans ce cas la).
La fonction utilisé est celle ci:

   
pm.cacheFile(f = 'nomDuFichier', fm='OneFile', st=startFrame, 
et=endFrame, points=geometryObj, dir=dirPath)
Les arguments presenté ici sont le minimun pour  un export de cache mais en lisant l'aide on comprend qu'on peut arriver a beaucoup de choses.
Le gain de temps est flagrant, de plus mieux adapté pour de l'export pour un logiciel autre que maya puis qu'il load pas les caches sur la geometry a la différence du mel.

Petit tips sur le quel je me suis pris pas mal la tete, sur une list (ls) de type 'mesh' comment ne pas lister les "deformShape" ou les "origShape" ... (les nodes de shapes utilisé pour les blendshapes, skin ...)
Enfet ce type de node s'appelle des nodes intermédiaires et il existe un flag dans le 'ls' qui est 'ni' (non intermediate).

 
slCache = pm.ls("*_m_*", ni = True, type ='mesh')


Petit exemple d'utilisation:


cache files tool maya from colin laubry on Vimeo.





lundi 11 juin 2012

CORNEE


Hop hop un nouveau ticket.

Dernier boulot en date: CORNEE.




C'est un court de 5 min réalisé en collaboration avec l'illustrateur torsioniste d'images Stephane Blanquet.
Le projet porte le nom de "Le Laboratoire d'Images" et est produit par canal+ pour être diffusé dans le Mensomadaire (émission d'une heure en peu déliré). Le but du projet est de réaliser une série de courts (sept je crois) en collaboration avec des illustrateurs et pouvoir confronter le monde de la 2d avec celui de l'animation 3d.

A voir ici, mensomadaire de juin:

ICI




















Quel a été mon rôle la dedans?

En quatrième année a Supinfocom Arles, la classe est divisé en trois spécialités: Animation, Image et Réalisation . Je suis en spé Image.

Durant la prod de CORNEE on m'a élu "Lead Image", ma mission: gérer une équipe de sept personnes, faire en sorte que tout ce passe bien du coté visuel, garder une homogénéisée entre le travail des étudiants et gérer les souhaits de l'illustrateur. J'ai aussi fais de tout sur le film (modé, textures, compo ...).

A moindre mesure j'ai pu me confronter au monde du tech artiste, j'ai du mettre un place une "pipeline" max / maya et maya / max (gérer des points cache en masse, pour le détail un futur ticket est a prévoir). Résoudre les problèmes rencontrés et simplifier la vie des coéquipiers.

Conclusion, une bonne expérience de prod avec plein de pression pour gérer les délais et les envies de l'auteur, mais ça n'a que confirmé ce que j'aime faire dans le 3D.

hop hop tchou.




Hello World !

Salut, c'est moi colin laubry !
Je suis élève a Supinfocom Arles promo 2013.




Ce qui me botte c'est le script, rigging, td, fx, et compo ... j'aime me prendre la tête sur des trucs chiants et compliqués.

Voici mon showreel 2011:


Show Reel 2011 / 2012 from colin laubry on Vimeo.
music : pompom ace, Robert Le Magnifique.
In order of appearance :
-GameBoy : 3ds max, physX (personnal project). vimeo.com/14176427
-Kang : Zbrush (personnal project).
-Zbrush Cowboy : Zbrush (school project).
-High Strike : 3ds max, scanline, After Effects (school project, short-movie made in 6 month alone). vimeo.com/23108522
- Psychococo : 3ds max, Realflow, Vray, Boujou (school project). vimeo.com/36032721
-L'ombre d'un soufle : Photoshop, After Effects (canal J project).
-Fuel Wave : RealFlow, Vray (personnal project). vimeo.com/14334086
-Fahrenheit 451 : 3ds max (intern project at Alphaville).
-Apoteket : 3ds max, Realflow (intern project at Alphaville).
-Erectus : 3ds max, after effects (Traditional short-movie by V.Dubar).