gsee

AM_FefuRunCircle py2.7

May 13th, 2020
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.21 KB | None | 0 0
  1. import maya.cmds as mc
  2.  
  3. #cree un cercle en curve qui definie le positionnement du character a 'x' frames en walk / run
  4.  
  5. #stock les infos necessaire, le nom du namespace(pour ne pas avoir de doublons, et des noms uniques), la 3eme curves de la hierachie et le nom du group ou sera stocker les curves
  6.  
  7. sel = mc.ls(selection=True, long=True)[0]
  8. namespace_sel = mc.ls(sl=True)[0].split(':')[0]
  9. main_grp = sel.split('|')[2:3]
  10. local_curveShape = mc.listRelatives(main_grp, allDescendents=True, type='nurbsCurve')[2]
  11. local_curve = mc.listRelatives(local_curveShape, parent=True)[0]
  12. walkRun_grp = 'lay_walkRun_grp'
  13. namespace_circle = namespace_sel + '_walkRun_circle'
  14.  
  15. #check si le group ou sera stocker les curves exist ou pas
  16.  
  17. if not mc.objExists(walkRun_grp):
  18.     mc.group(empty=True, name='lay_walkRun_grp')
  19.  
  20. #check si la curve du character exist ou pas
  21.  
  22. if not mc.objExists(namespace_circle):
  23.     w_circle = mc.circle(nr=(0, 1, 0), name=namespace_circle)[0]
  24.     mc.parent(w_circle, walkRun_grp)
  25.     attrToHide = mc.listAttr(w_circle, keyable=True)[1:]
  26.  
  27.     #hide les attributs non nessesaire de la curve
  28.  
  29.     for a in attrToHide:
  30.         mc.setAttr(w_circle + '.' + a, keyable=False, channelBox=False)
  31.  
  32.     #ajout d'un attribut pour que la curve suivent ou pas
  33.  
  34.     mc.addAttr(w_circle, longName='Status', shortName='status', at='enum', enumName='Follow:Stay')
  35.     mc.setAttr(w_circle + '.status', keyable=True)
  36.  
  37.     #creation de nodes pour faire un space switching et connections entre eux
  38.  
  39.     choice_status_node = mc.createNode('choice', name='choice_' + w_circle + '_status')
  40.     decompose_matrix = mc.createNode('decomposeMatrix', name='decompose_' + w_circle + '_status')
  41.  
  42.     mc.connectAttr(w_circle + '.status', choice_status_node + '.selector', force=True)
  43.     mc.connectAttr(local_curve + '.worldMatrix[0]', choice_status_node + '.input[0]', force=True)
  44.     mc.connectAttr(w_circle + '.worldMatrix[0]', choice_status_node + '.input[1]', force=True)
  45.     mc.connectAttr(choice_status_node + '.output', decompose_matrix + '.inputMatrix', force=True)
  46.     mc.connectAttr(decompose_matrix + '.outputTranslate', w_circle + '.translate', force=True)
  47.     mc.connectAttr(decompose_matrix + '.outputRotate', w_circle + '.rotate', force=True)
  48.  
  49.     #ajout d'un attribut pour les differents types de marches et courses
  50.    
  51.     mc.addAttr(w_circle, longName='Speed', shortName='speed', at='enum', enumName='WalkA:WalkB:WalkC:WalkBasic:RunA:RunB:RunC:KidWalkA:KidWalkB:KidRunA:KidRunB')
  52.     mc.setAttr(w_circle + '.speed', keyable=True)
  53.  
  54.     #ajout d'un attibut pour le scale de la curve qui sera a 'x' frames en fonction du type de marche
  55.  
  56.     mc.addAttr(w_circle, longName='Frames', shortName='frames', at='long', dv=24)
  57.     mc.setAttr(w_circle + '.frames', keyable=True)
  58.  
  59.     #ajout d'un node float qui aura la value du scale de la curve a 1 frame, puis drive n key de ces values en fonction de l'attribut .speed (type de marche)
  60.  
  61.     floatConstant_node = mc.createNode('floatConstant', name='floatConstant_' + w_circle)
  62.  
  63.     #Walk
  64.  
  65.     mc.setDrivenKeyframe(floatConstant_node + '._f', currentDriver=w_circle + '.speed', driverValue=0, value=0.1148)
  66.     mc.setDrivenKeyframe(floatConstant_node + '._f', currentDriver=w_circle + '.speed', driverValue=1, value=0.0645)
  67.     mc.setDrivenKeyframe(floatConstant_node + '._f', currentDriver=w_circle + '.speed', driverValue=2, value=0.2111)
  68.     mc.setDrivenKeyframe(floatConstant_node + '._f', currentDriver=w_circle + '.speed', driverValue=3, value=0.0883)
  69.  
  70.     #Run
  71.  
  72.     mc.setDrivenKeyframe(floatConstant_node + '._f', currentDriver=w_circle + '.speed', driverValue=4, value=0.3733)
  73.     mc.setDrivenKeyframe(floatConstant_node + '._f', currentDriver=w_circle + '.speed', driverValue=5, value=1.14)
  74.     mc.setDrivenKeyframe(floatConstant_node + '._f', currentDriver=w_circle + '.speed', driverValue=6, value=0.463)
  75.  
  76.     #Kid
  77.  
  78.     mc.setDrivenKeyframe(floatConstant_node + '._f', currentDriver=w_circle + '.speed', driverValue=7, value=0.0826)
  79.     mc.setDrivenKeyframe(floatConstant_node + '._f', currentDriver=w_circle + '.speed', driverValue=8, value=0.1256)
  80.     mc.setDrivenKeyframe(floatConstant_node + '._f', currentDriver=w_circle + '.speed', driverValue=9, value=0.2907)
  81.     mc.setDrivenKeyframe(floatConstant_node + '._f', currentDriver=w_circle + '.speed', driverValue=10, value=0.2083)
  82.  
  83.     #ajout d'un node multiplyDivide qui va multiplier la value du floatConstant precedament cree en fonction de l'attribut .frames. connections des attribut entre eux et sur le scale x et y de la curve
  84.  
  85.     multiply_divide = mc.createNode('multiplyDivide', name='multiplyDivide_' + w_circle)
  86.     mc.setAttr(multiply_divide + '.operation', 1)
  87.     mc.connectAttr(floatConstant_node + '.outFloat', multiply_divide + '.input1X')
  88.     mc.connectAttr(floatConstant_node + '.outFloat', multiply_divide + '.input1Z')
  89.     mc.connectAttr(w_circle + '.frames', multiply_divide + '.input2X')
  90.     mc.connectAttr(w_circle + '.frames', multiply_divide + '.input2Z')
  91.     mc.connectAttr(multiply_divide + '.output', w_circle + '.scale', force=True)
  92.  
  93.     #changement de la couleur de la curve
  94.  
  95.     mc.setAttr(w_circle + '.overrideEnabled', 1)
  96.     mc.setAttr(w_circle + '.overrideColor', 31)
  97.  
  98.     mc.select(w_circle, r=True)
Advertisement
Add Comment
Please, Sign In to add comment