Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import maya.cmds as mc
- #cree un cercle en curve qui definie le positionnement du character a 'x' frames en walk / run
- #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
- sel = mc.ls(selection=True, long=True)[0]
- namespace_sel = mc.ls(sl=True)[0].split(':')[0]
- main_grp = sel.split('|')[2:3]
- local_curveShape = mc.listRelatives(main_grp, allDescendents=True, type='nurbsCurve')[2]
- local_curve = mc.listRelatives(local_curveShape, parent=True)[0]
- walkRun_grp = 'lay_walkRun_grp'
- namespace_circle = namespace_sel + '_walkRun_circle'
- #check si le group ou sera stocker les curves exist ou pas
- if not mc.objExists(walkRun_grp):
- mc.group(empty=True, name='lay_walkRun_grp')
- #check si la curve du character exist ou pas
- if not mc.objExists(namespace_circle):
- w_circle = mc.circle(nr=(0, 1, 0), name=namespace_circle)[0]
- mc.parent(w_circle, walkRun_grp)
- attrToHide = mc.listAttr(w_circle, keyable=True)[1:]
- #hide les attributs non nessesaire de la curve
- for a in attrToHide:
- mc.setAttr(w_circle + '.' + a, keyable=False, channelBox=False)
- #ajout d'un attribut pour que la curve suivent ou pas
- mc.addAttr(w_circle, longName='Status', shortName='status', at='enum', enumName='Follow:Stay')
- mc.setAttr(w_circle + '.status', keyable=True)
- #creation de nodes pour faire un space switching et connections entre eux
- choice_status_node = mc.createNode('choice', name='choice_' + w_circle + '_status')
- decompose_matrix = mc.createNode('decomposeMatrix', name='decompose_' + w_circle + '_status')
- mc.connectAttr(w_circle + '.status', choice_status_node + '.selector', force=True)
- mc.connectAttr(local_curve + '.worldMatrix[0]', choice_status_node + '.input[0]', force=True)
- mc.connectAttr(w_circle + '.worldMatrix[0]', choice_status_node + '.input[1]', force=True)
- mc.connectAttr(choice_status_node + '.output', decompose_matrix + '.inputMatrix', force=True)
- mc.connectAttr(decompose_matrix + '.outputTranslate', w_circle + '.translate', force=True)
- mc.connectAttr(decompose_matrix + '.outputRotate', w_circle + '.rotate', force=True)
- #ajout d'un attribut pour les differents types de marches et courses
- mc.addAttr(w_circle, longName='Speed', shortName='speed', at='enum', enumName='WalkA:WalkB:WalkC:WalkBasic:RunA:RunB:RunC:KidWalkA:KidWalkB:KidRunA:KidRunB')
- mc.setAttr(w_circle + '.speed', keyable=True)
- #ajout d'un attibut pour le scale de la curve qui sera a 'x' frames en fonction du type de marche
- mc.addAttr(w_circle, longName='Frames', shortName='frames', at='long', dv=24)
- mc.setAttr(w_circle + '.frames', keyable=True)
- #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)
- floatConstant_node = mc.createNode('floatConstant', name='floatConstant_' + w_circle)
- #Walk
- mc.setDrivenKeyframe(floatConstant_node + '._f', currentDriver=w_circle + '.speed', driverValue=0, value=0.1148)
- mc.setDrivenKeyframe(floatConstant_node + '._f', currentDriver=w_circle + '.speed', driverValue=1, value=0.0645)
- mc.setDrivenKeyframe(floatConstant_node + '._f', currentDriver=w_circle + '.speed', driverValue=2, value=0.2111)
- mc.setDrivenKeyframe(floatConstant_node + '._f', currentDriver=w_circle + '.speed', driverValue=3, value=0.0883)
- #Run
- mc.setDrivenKeyframe(floatConstant_node + '._f', currentDriver=w_circle + '.speed', driverValue=4, value=0.3733)
- mc.setDrivenKeyframe(floatConstant_node + '._f', currentDriver=w_circle + '.speed', driverValue=5, value=1.14)
- mc.setDrivenKeyframe(floatConstant_node + '._f', currentDriver=w_circle + '.speed', driverValue=6, value=0.463)
- #Kid
- mc.setDrivenKeyframe(floatConstant_node + '._f', currentDriver=w_circle + '.speed', driverValue=7, value=0.0826)
- mc.setDrivenKeyframe(floatConstant_node + '._f', currentDriver=w_circle + '.speed', driverValue=8, value=0.1256)
- mc.setDrivenKeyframe(floatConstant_node + '._f', currentDriver=w_circle + '.speed', driverValue=9, value=0.2907)
- mc.setDrivenKeyframe(floatConstant_node + '._f', currentDriver=w_circle + '.speed', driverValue=10, value=0.2083)
- #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
- multiply_divide = mc.createNode('multiplyDivide', name='multiplyDivide_' + w_circle)
- mc.setAttr(multiply_divide + '.operation', 1)
- mc.connectAttr(floatConstant_node + '.outFloat', multiply_divide + '.input1X')
- mc.connectAttr(floatConstant_node + '.outFloat', multiply_divide + '.input1Z')
- mc.connectAttr(w_circle + '.frames', multiply_divide + '.input2X')
- mc.connectAttr(w_circle + '.frames', multiply_divide + '.input2Z')
- mc.connectAttr(multiply_divide + '.output', w_circle + '.scale', force=True)
- #changement de la couleur de la curve
- mc.setAttr(w_circle + '.overrideEnabled', 1)
- mc.setAttr(w_circle + '.overrideColor', 31)
- mc.select(w_circle, r=True)
Advertisement
Add Comment
Please, Sign In to add comment