def treeBendingLookAtConnect( inputLookTarget, inputRotTarget ): lookTarget = pymel.core.ls( inputLookTarget )[0] rotTarget = pymel.core.ls( inputRotTarget )[0] rotTargetBase = rotTarget.getParent() rotTargetList = rotTarget.listRelatives( c=1, ad=1, type='joint' ) map( lambda x : sgCmds.makeParent( x ) if x.getParent().nodeType() == 'joint' else None, rotTargetList ) rotTargetPoints = map( lambda x : sgCmds.putObject( x ), rotTargetList ) map( lambda x : x.dh.set( 0 ), rotTargetPoints ) rotTargetPointsBase = sgCmds.makeChild( rotTargetBase ) rotTargetList.append( rotTarget ) sgCmds.lookAtConnect( lookTarget, rotTargetPointsBase ) sgCmds.makeParent( rotTargetPointsBase ) pymel.core.parent( rotTargetPoints, rotTargetPointsBase ) rotTargetList.reverse() rotTargetPoints.reverse() numRotTargets = len( rotTargetList ) sgCmds.addAttr( lookTarget, ln='bendWeight', min=0, max=1, dv=1, k=1 ) sgCmds.addAttr( lookTarget, ln='powRate', min=0, max=2, dv=1, k=1 ) for i in range( len( rotTargetList )-1 ): powRateBaseValue = ( i + 1.0 )/numRotTargets rotTargetH = rotTargetList[i] rotTargetHBase = rotTargetH.getParent() rotTargetChild = rotTargetH.listRelatives( c=1 )[0] aimCuPointPiv = sgCmds.makeChild( rotTargetHBase ) aimCuPointBase = sgCmds.makeChild( aimCuPointPiv ) aimCuPoint = sgCmds.makeChild( aimCuPointBase ) pymel.core.xform( aimCuPointPiv, ws=1, matrix=rotTargetH.wm.get() ) pymel.core.xform( aimCuPointBase, ws=1, matrix=rotTargetChild.wm.get() ) rotTargetPoint = rotTargetPoints[i] dcmp = sgCmds.getLocalDecomposeMatrix( rotTargetPoint.wm, aimCuPointBase.wim ) sgCmds.addAttr( rotTargetH, ln='lookWeight', min=0, max=1, k=1, dv= 1.0/numRotTargets ) multEnv = pymel.core.createNode( 'multDoubleLinear' ) multPow = pymel.core.createNode( 'multiplyDivide' ); multPow.op.set( 3 ) multPowAndEnv = pymel.core.createNode( 'multDoubleLinear' ) multEnv.output >> multPowAndEnv.input1 multPow.outputX >> multPowAndEnv.input2 multPow.input1X.set( powRateBaseValue ) lookTarget.powRate >> multPow.input2X rotTargetH.lookWeight >> multEnv.input1 lookTarget.bendWeight >> multEnv.input2 multTrans = pymel.core.createNode( 'multiplyDivide' ) dcmp.outputTranslate >> multTrans.input1 multPowAndEnv.output >> multTrans.input2X multPowAndEnv.output >> multTrans.input2Y multPowAndEnv.output >> multTrans.input2Z multTrans.output >> aimCuPoint.t sgCmds.lookAtConnect( aimCuPoint, rotTargetH ) sgCmds.addAttr( lookTarget, ln='rotTarget', at='message' ) rotTargetPointsBase.message >> lookTarget.rotTarget
poleVConst = sel.t.listConnections(s=0, d=1, type='poleVectorConstraint')[0] ikHandle = poleVConst.constraintTranslateX.listConnections( s=0, d=1, type='ikHandle')[0] endEffector = ikHandle.endEffector.listConnections(s=1, d=0)[0] endJnt = endEffector.tx.listConnections(s=1, d=0)[0] middleJnt = endEffector.getParent() mdMiddle = middleJnt.tx.listConnections(s=1, d=0)[0] mdEnd = endJnt.tx.listConnections(s=1, d=0)[0] sgCmds.addOptionAttribute(sel, 'IK Length') sgCmds.addAttr(sel, ln='ikUpperLength', k=1) sgCmds.addAttr(sel, ln='ikLowerLength', k=1) powMiddle = pymel.core.createNode('multiplyDivide') powMiddle.input1X.set(2) powMiddle.op.set(3) powEnd = pymel.core.createNode('multiplyDivide') powEnd.input1X.set(2) powEnd.op.set(3) sel.attr('ikUpperLength') >> powMiddle.input2X sel.attr('ikLowerLength') >> powEnd.input2X origDistMiddle = mdMiddle.input2Y.get() origDistEnd = mdEnd.input2Y.get() multMid = pymel.core.createNode('multDoubleLinear')
import pymel.core from sgMaya import sgCmds sels = pymel.core.ls( sl=1 ) first = sels[0] second = sels[1] target = sels[2] sgCmds.addAttr( target, ln='blend', min=0, max=1, k=1 ) chFirsts = first.listRelatives( c=1, type='transform' ) chSeconds = second.listRelatives( c=1, type='transform' ) chTargets = target.listRelatives( c=1, type='transform' ) for i in range( len( chFirsts ) ): chFirst = chFirsts[i] chSecond = chSeconds[i] chTarget = chTargets[i] sgCmds.blendTwoMatrixConnect( chFirst, chSecond, chTarget, ct=1, cr=1 ) target.attr( 'blend' ) >> chTarget.attr( 'blend' )
import pymel.core from sgMaya import sgCmds sels = pymel.core.ls(sl=1) ctl = sels[0] mesh = sels[1] blShapeNodes = sgCmds.getNodeFromHistory(mesh, 'blendShape') for blendNode in blShapeNodes: for i in range(blendNode.w.numElements()): wPlug = blendNode.w[i] attrName = cmds.ls(wPlug.name())[0].split('.')[-1] try: sgCmds.addAttr(ctl, ln=attrName, k=1, min=0, max=1) except: continue ctl.attr(attrName) >> wPlug
for i in range( 2 ): bendCtl = sgCmds.makeController( sgModel.Controller.switchPoints, 1, makeParent=1, name= ctl.replace( 'Part', 'Bend%d' % i ) ) pBendCtl = bendCtl.getParent() bendCtl.getShape().shape_ty.set( 0.5 ) bendCtl.getShape().shape_rx.set( 90 ) pBendCtl.setParent( ctl ) sgCmds.setTransformDefault( pBendCtl ) pBendCtl.r.set( 0, 90*i, 0 ) bend1, handle1 = pymel.core.nonLinear( geo, type='bend' ) handle1.setParent( bendCtl ) sgCmds.setTransformDefault( handle1 ) handle1.r.set( 0,0,90 ) bend1.lowBound.set( 0 ) sgCmds.addOptionAttribute( bendCtl ) sgCmds.addAttr( bendCtl, ln='bend', k=1 ) multNode = pymel.core.createNode( 'multDoubleLinear' ) bendCtl.bend >> multNode.input1 multNode.input2.set( 5 ) multNode.output >> bend1.curvature handle1.v.set( 0 ) sgCmds.addAttr( bendCtl, ln='lowBound', k=1, min=0, dv=1 ) sgCmds.addAttr( bendCtl, ln='highBound', k=1, min=0, dv=1 ) multLow = pymel.core.createNode( 'multDoubleLinear' ) bendCtl.lowBound >> multLow.input1 multLow.input2.set( -1 ) multLow.output >> bend1.lowBound bendCtl.highBound >> bend1.highBound
def createGrassController( meshs, ground ): import pymel.core from sgMaya import sgCmds, sgModel reload( sgCmds ) from maya import mel, cmds, OpenMaya curves = [] ctlsList = [] bbys = [] for mesh in meshs: bb = pymel.core.exactWorldBoundingBox( mesh ) bbys.append( bb[4] ) meshMaxY = max( bbys ) coreGrp = pymel.core.createNode( 'transform', n='grassRigCoreGrp' ) pivCtls = [] for mesh in meshs: pymel.core.select( mesh + '.e[15]' ) mel.eval( 'SelectEdgeLoopSp;' ) targetCurve = pymel.core.ls( mel.eval( 'polyToCurve -form 2 -degree 3;' )[0] )[0] curveCuted = sgCmds.cutCurve( targetCurve, ground ) curveBB = pymel.core.exactWorldBoundingBox( curveCuted ) curvePos = [ ( curveBB[0] + curveBB[3] )/2 , 0, ( curveBB[2] + curveBB[5] )/2 ] curveScaleY = meshMaxY/curveBB[4] curveP = pymel.core.createNode( 'transform' ) curveP.t.set( curvePos ) curveCuted.setParent( curveP ) curveP.sy.set( curveScaleY ) curveCuted.setParent( w=1 ) pymel.core.makeIdentity( curveCuted, apply=1, t=1, r=1, s=1, n=0, pn=1 ) pymel.core.delete( targetCurve, curveP ) mel.eval( 'rebuildCurve -ch 1 -rpo 1 -rt 0 -end 1 -kr 0 -kcp 0 -kep 1 -kt 0 -s 7 -d 3 -tol 0.01 "%s";' % curveCuted.name() ) wire = pymel.core.ls( mel.eval( 'wire -gw false -en 1.000000 -ce 0.000000 -li 0.000000 -w %s %s;' % ( curveCuted.name(), mesh ) )[0] )[0] pymel.core.setAttr( wire + '.dropoffDistance[0]', 10000 ) curves = wire.listConnections( s=1, d=0, type='nurbsCurve' ) ctls = sgCmds.createControllerByCurveCVs( curveCuted ) curves.append( curveCuted ) ctlsList.append( ctls ) firstCtl = ctls[0] pFirstCtl = firstCtl.getParent() pivCtl = pymel.core.createNode( 'transform', n='Piv_' + firstCtl.nodeName() ) pivCtl.t.set( pymel.core.xform( pFirstCtl, q=1, ws=1, t=1 ) ) pFirstCtl.setParent( pivCtl ) pivCtl.v.set( 0 ) pivCtls.append( pivCtl ) pymel.core.parent( curves, pivCtl, coreGrp ) for curve in curves: curve.v.set( 0 ) bbAllCtls = OpenMaya.MBoundingBox() for pivCtl in pivCtls: bbAllCtls.expand( OpenMaya.MPoint( *pymel.core.xform( pivCtl, q=1, ws=1, t=1 ) ) ) duCurvePivPoint = bbAllCtls.center() duCurvePivPoint = [ duCurvePivPoint.x, duCurvePivPoint.y, duCurvePivPoint.z ] duCurveEndPoint = [ duCurvePivPoint[0], meshMaxY, duCurvePivPoint[2] ] duCurve = pymel.core.curve( p=[ duCurvePivPoint, duCurveEndPoint ], d=1 ) duCurve.v.set( 0 ) mel.eval( 'rebuildCurve -ch 1 -rpo 1 -rt 0 -end 1 -kr 0 -kcp 0 -kep 1 -kt 0 -s 7 -d 3 -tol 0.01 "%s";' % duCurve.name() ) duCtls = sgCmds.createControllerByCurveCVs( duCurve ) pivCtl = pymel.core.createNode( 'transform', n='Piv_' + duCtls[0].nodeName() ) pivCtlPos = pymel.core.xform( duCtls[0], q=1, ws=1, t=1 ) pivCtl.t.set( pivCtlPos ) duCtls[0].getParent().setParent( pivCtl ) sgCmds.makeParent( pivCtl ) pivCtlMaxY = pymel.core.exactWorldBoundingBox( pivCtl )[4] lookAtCtl = sgCmds.makeController( sgModel.Controller.conePoints, makeParent=1, n='Ctl_LookAt_%s' % duCurve.nodeName() ) lookAtCtl.getParent().t.set( pivCtlPos[0], pivCtlMaxY, pivCtlPos[2] ) sgCmds.lookAtConnect( lookAtCtl, pivCtl ) composeMatrix = pymel.core.createNode( 'composeMatrix' ) wtAddMtx = pymel.core.createNode( 'wtAddMatrix' ) composeMatrix.outputMatrix >> wtAddMtx.i[0].m wtAddMtx.i[0].w.set( 0.5 ) lookAtCtl.matrix >> wtAddMtx.i[1].m wtAddMtx.i[1].w.set( 0.5) dcmpWtAdd = sgCmds.getDecomposeMatrix( wtAddMtx.matrixSum ) for i in range( len( duCtls ) ): sgCmds.makeParent( duCtls[i].getParent(), n= 'Piv_' + duCtls[i].nodeName() ) dcmpWtAdd.outputRotate >> duCtls[i].getParent().r for i in range( len( duCtls ) ): dcmp = sgCmds.getLocalDecomposeMatrix( duCtls[i].wm, duCtls[i].getParent().pim ) for j in range( len( ctlsList ) ): dcmp.outputTranslate >> ctlsList[j][i].t dcmp.outputRotate >> ctlsList[j][i].r dcmp.outputScale >> ctlsList[j][i].s for eachPiv in pivCtls: pivCtl.r >> eachPiv.r sgCmds.addOptionAttribute( lookAtCtl ) sgCmds.addAttr( lookAtCtl, ln='showDetail', k=1, min=0, max=1 ) lookAtCtl.attr( 'showDetail' ) >> pivCtl.v pymel.core.parent( coreGrp ) coreGrp.attr( 'inheritsTransform' ).set( 0 ) coreGrp.t.set( lock=1 ) coreGrp.r.set( lock=1 ) coreGrp.s.set( lock=1 ) mainGrp = pymel.core.createNode( 'transform', n='grassRigMainGrp' ) jnt = pymel.core.joint() pymel.core.move( mainGrp, duCurvePivPoint[0], duCurvePivPoint[1], duCurvePivPoint[2], ws=1 ) pymel.core.parent( duCurve, coreGrp, pivCtl.getParent(), lookAtCtl.getParent(), mainGrp ) pymel.core.skinCluster( meshs, jnt ) for duCtl in duCtls: sgCmds.setIndexColor( duCtl, 28 ) sgCmds.setIndexColor( lookAtCtl, 22 ) pymel.core.select( lookAtCtl )
import pymel.core from sgMaya import sgCmds sels = pymel.core.ls(sl=1) ctl = sels[0] meshs = sels[1:] sgCmds.addAttr(ctl, ln='smooth', min=0, max=2, cb=1, at='long') for mesh in meshs: meshShape = mesh.getShape() smoothNode = pymel.core.polySmooth(mesh, mth=0, sdt=2, ovb=1, ofb=3, ofc=0, ost=1, ocr=0, dv=1, bnr=1, c=1, kb=1, ksb=1, khe=0, kt=1, kmb=1, suv=1, peh=0, sl=1, dpe=1,
import pymel.core from sgMaya import sgCmds eyeCtl = pymel.core.ls('EyeBDCtrl')[0] sgCmds.addOptionAttribute(eyeCtl) sgCmds.addAttr(eyeCtl, ln='specMode', at='enum', en=':default:twinkle', k=1) sgCmds.addAttr(eyeCtl, ln='twinkleIndex', at='long', k=1) twinkleShader = pymel.core.ls(sl=1)[0] texturePath = os.path.dirname(cmds.file(q=1, sceneName=1)) + '/texture' twinklePath = texturePath + '/TwinkleEye.0001.png' twinkleSmallPath = texturePath + '/TwinkleEye_small.0001.png' newShaders = [] def convertTwincleTexture(twinkleShader): files = twinkleShader.listConnections(s=1, d=0, type='file') if not files: return None targetFile = files[0] fileConnections = targetFile.listConnections(s=0, d=1, p=1, c=1) lambertShaderCon = None rsShaderCon = None for origCon, dstCon in fileConnections: if origCon.longName() == 'outColor': lambertShaderCon = dstCon elif origCon.longName() == 'outAlpha':
gpuCacheTr = sgCmds.createGpuCache(firstObject) pymel.core.refresh() firstObject.attr('displaySmoothMesh').set(subdivisionValue) rsProxyTr = sgCmds.createRedshiftProxy(firstObject) pymel.core.refresh() pymel.core.parent(gpuCacheTr.getShape(), rsProxyTr, add=1, shape=1) pymel.core.delete(gpuCacheTr) rsProxyTr.getShape().lodVisibility.set(0) firstObjName = firstObject.nodeName() rsProxyTr.rename(firstObjName + '_000') rsProxyTr.addAttr("origObjectPath", dt='string') origExportPath = origdirPath + "/" + firstObject.name().replace( '|', '_').replace(':', '_') + '.mb' rsProxyTr.attr("origObjectPath").set(origExportPath) sgCmds.addAttr(firstObject, ln="origName", dt='string') firstObject.attr('origName').set(firstObjName) firstObject.setParent(w=1) pymel.core.select(firstObject) cmds.file(origExportPath, f=1, options="v=0", typ="mayaBinary", pr=1, es=1) pymel.core.delete(firstObject) rsProxyTr.rename(firstObjName) if len(targets) == 1: continue for otherObj in targets[1:]: duProxyTr = duplicateRsProxyTr(rsProxyTr) if not duProxyTr: continue try: duProxyTr.setParent(otherObj.getParent()) except:
condition2 = condition con1Dests = condition1.listConnections( s=0, d=1, type='transform', p=1, c=1 ) con2Dests = condition2.listConnections( s=0, d=1, type='transform', p=1, c=1 ) if not con1Dests: continue add1 = pymel.core.createNode( 'addDoubleLinear' ) add2 = pymel.core.createNode( 'addDoubleLinear' ) setRange1 = pymel.core.createNode( 'setRange' ) setRange2 = pymel.core.createNode( 'setRange' ) con1Dests[0][0] >> add1.input1 con2Dests[0][0] >> add2.input1 sgCmds.addAttr( sel, ln='origVis', min=-1, max=1, at='long', k=1 ) sgCmds.addAttr( sel, ln='paintedVis', min=-1, max=1, at='long', k=1 ) sel.attr( 'origVis' ) >> add1.input2 sel.attr( 'paintedVis' ) >> add2.input2 add1.output >> setRange1.valueX add2.output >> setRange2.valueX setRange1.maxX.set( 1 ) setRange1.oldMaxX.set( 1 ) setRange2.maxX.set( 1 ) setRange2.oldMaxX.set( 1 ) setRange1.outValueX >> con1Dests[0][1] setRange2.outValueX >> con2Dests[0][1]
rsProxyShape = rsProxyTr.getShape() pymel.core.parent(gpuCacheTr.getShape(), rsProxyTr, add=1, shape=1) pymel.core.delete(gpuCacheTr) rsProxyShape.lodVisibility.set(0) selName = sel.nodeName() sgCmds.getSourceConnection(rsProxyTr, sel) if sel.getParent(): try: rsProxyTr.setParent(sel.getParent()) except: pass rsProxyTr.addAttr("origObjectPath", dt='string') origExportPath = origdirPath + "/" + sel.name().replace('|', '_').replace( ':', '_') + '.mb' sgCmds.addAttr(sel, ln="origName", dt='string') sel.attr('origName').set(sel.name()) sel.setParent(w=1) pymel.core.select(sel) cmds.file(origExportPath, f=1, options="v=0", typ="mayaBinary", pr=1, es=1) rsProxyTr.attr("origObjectPath").set(origExportPath) selName = sel.nodeName() pymel.core.delete(sel) rsProxyTr.rename(selName) for child in rsProxyTr.listRelatives(c=1, ad=1): if child.nodeType() == 'mesh': child.rename(rsProxyTr.nodeName() + 'Shape') elif child.nodeType() == 'gpuCache': child.rename(rsProxyTr.nodeName() + '_gpuShape')
from sgMaya import sgCmds import pymel.core sels = pymel.core.ls(sl=1) ctl = sels[0] ctlGrp = sels[1] sgCmds.addAttr(ctl, ln='showDetail', min=0, max=1, at='long', cb=1) ctl.showDetail >> ctlGrp.v
mel.eval( 'displaySmoothness -divisionsU 0 -divisionsV 0 -pointsWire 4 -pointsShaded 1 -polygonObject 1;' ) gpuCacheTr = sgCmds.createGpuCache( firstObject ) pymel.core.refresh() firstObject.attr( 'displaySmoothMesh' ).set( subdivisionValue ) rsProxyTr = sgCmds.createRedshiftProxy( firstObject ) pymel.core.refresh() pymel.core.parent( gpuCacheTr.getShape(), rsProxyTr, add=1, shape=1 ) pymel.core.delete( gpuCacheTr ) rsProxyTr.getShape().lodVisibility.set( 0 ) firstObjName = firstObject.nodeName() rsProxyTr.rename( firstObjName + '_000' ) rsProxyTr.addAttr( "origObjectPath", dt='string' ) origExportPath = origdirPath + "/" + firstObject.name().replace( '|', '_' ).replace( ':', '_' ) + '.mb' rsProxyTr.attr( "origObjectPath" ).set( origExportPath ) sgCmds.addAttr( firstObject, ln="origName", dt='string' ) firstObject.attr( 'origName' ).set( firstObjName ) firstObject.setParent( w=1 ) pymel.core.select( firstObject ) cmds.file( origExportPath, f=1, options="v=0", typ="mayaBinary", pr=1, es=1 ) pymel.core.delete( firstObject ) rsProxyTr.rename( firstObjName ) if len( targets ) == 1: continue for otherObj in targets[1:]: duProxyTr = duplicateRsProxyTr( rsProxyTr ) if not duProxyTr: continue try:duProxyTr.setParent( otherObj.getParent() ) except:pass pymel.core.xform( duProxyTr, ws=1, matrix=otherObj.wm.get() )
import pymel.core from sgMaya import sgCmds sels = pymel.core.ls( sl=1 ) ctl = sels[0] mesh = sels[1] blShapeNodes = sgCmds.getNodeFromHistory( mesh, 'blendShape' ) for blendNode in blShapeNodes: for i in range( blendNode.w.numElements() ): wPlug = blendNode.w[i] attrName = cmds.ls( wPlug.name() )[0].split( '.' )[-1] try:sgCmds.addAttr( ctl, ln=attrName, k=1, min=0, max=1 ) except:continue ctl.attr( attrName ) >> wPlug
def createGrassController(meshs, ground): import pymel.core from sgMaya import sgCmds, sgModel reload(sgCmds) from maya import mel, cmds, OpenMaya curves = [] ctlsList = [] bbys = [] for mesh in meshs: bb = pymel.core.exactWorldBoundingBox(mesh) bbys.append(bb[4]) meshMaxY = max(bbys) coreGrp = pymel.core.createNode('transform', n='grassRigCoreGrp') pivCtls = [] for mesh in meshs: pymel.core.select(mesh + '.e[15]') mel.eval('SelectEdgeLoopSp;') targetCurve = pymel.core.ls( mel.eval('polyToCurve -form 2 -degree 3;')[0])[0] curveCuted = sgCmds.cutCurve(targetCurve, ground) curveBB = pymel.core.exactWorldBoundingBox(curveCuted) curvePos = [(curveBB[0] + curveBB[3]) / 2, 0, (curveBB[2] + curveBB[5]) / 2] curveScaleY = meshMaxY / curveBB[4] curveP = pymel.core.createNode('transform') curveP.t.set(curvePos) curveCuted.setParent(curveP) curveP.sy.set(curveScaleY) curveCuted.setParent(w=1) pymel.core.makeIdentity(curveCuted, apply=1, t=1, r=1, s=1, n=0, pn=1) pymel.core.delete(targetCurve, curveP) mel.eval( 'rebuildCurve -ch 1 -rpo 1 -rt 0 -end 1 -kr 0 -kcp 0 -kep 1 -kt 0 -s 7 -d 3 -tol 0.01 "%s";' % curveCuted.name()) wire = pymel.core.ls( mel.eval( 'wire -gw false -en 1.000000 -ce 0.000000 -li 0.000000 -w %s %s;' % (curveCuted.name(), mesh))[0])[0] pymel.core.setAttr(wire + '.dropoffDistance[0]', 10000) curves = wire.listConnections(s=1, d=0, type='nurbsCurve') ctls = sgCmds.createControllerByCurveCVs(curveCuted) curves.append(curveCuted) ctlsList.append(ctls) firstCtl = ctls[0] pFirstCtl = firstCtl.getParent() pivCtl = pymel.core.createNode('transform', n='Piv_' + firstCtl.nodeName()) pivCtl.t.set(pymel.core.xform(pFirstCtl, q=1, ws=1, t=1)) pFirstCtl.setParent(pivCtl) pivCtl.v.set(0) pivCtls.append(pivCtl) pymel.core.parent(curves, pivCtl, coreGrp) for curve in curves: curve.v.set(0) bbAllCtls = OpenMaya.MBoundingBox() for pivCtl in pivCtls: bbAllCtls.expand( OpenMaya.MPoint(*pymel.core.xform(pivCtl, q=1, ws=1, t=1))) duCurvePivPoint = bbAllCtls.center() duCurvePivPoint = [duCurvePivPoint.x, duCurvePivPoint.y, duCurvePivPoint.z] duCurveEndPoint = [duCurvePivPoint[0], meshMaxY, duCurvePivPoint[2]] duCurve = pymel.core.curve(p=[duCurvePivPoint, duCurveEndPoint], d=1) duCurve.v.set(0) mel.eval( 'rebuildCurve -ch 1 -rpo 1 -rt 0 -end 1 -kr 0 -kcp 0 -kep 1 -kt 0 -s 7 -d 3 -tol 0.01 "%s";' % duCurve.name()) duCtls = sgCmds.createControllerByCurveCVs(duCurve) pivCtl = pymel.core.createNode('transform', n='Piv_' + duCtls[0].nodeName()) pivCtlPos = pymel.core.xform(duCtls[0], q=1, ws=1, t=1) pivCtl.t.set(pivCtlPos) duCtls[0].getParent().setParent(pivCtl) sgCmds.makeParent(pivCtl) pivCtlMaxY = pymel.core.exactWorldBoundingBox(pivCtl)[4] lookAtCtl = sgCmds.makeController(sgModel.Controller.conePoints, makeParent=1, n='Ctl_LookAt_%s' % duCurve.nodeName()) lookAtCtl.getParent().t.set(pivCtlPos[0], pivCtlMaxY, pivCtlPos[2]) sgCmds.lookAtConnect(lookAtCtl, pivCtl) composeMatrix = pymel.core.createNode('composeMatrix') wtAddMtx = pymel.core.createNode('wtAddMatrix') composeMatrix.outputMatrix >> wtAddMtx.i[0].m wtAddMtx.i[0].w.set(0.5) lookAtCtl.matrix >> wtAddMtx.i[1].m wtAddMtx.i[1].w.set(0.5) dcmpWtAdd = sgCmds.getDecomposeMatrix(wtAddMtx.matrixSum) for i in range(len(duCtls)): sgCmds.makeParent(duCtls[i].getParent(), n='Piv_' + duCtls[i].nodeName()) dcmpWtAdd.outputRotate >> duCtls[i].getParent().r for i in range(len(duCtls)): dcmp = sgCmds.getLocalDecomposeMatrix(duCtls[i].wm, duCtls[i].getParent().pim) for j in range(len(ctlsList)): dcmp.outputTranslate >> ctlsList[j][i].t dcmp.outputRotate >> ctlsList[j][i].r dcmp.outputScale >> ctlsList[j][i].s for eachPiv in pivCtls: pivCtl.r >> eachPiv.r sgCmds.addOptionAttribute(lookAtCtl) sgCmds.addAttr(lookAtCtl, ln='showDetail', k=1, min=0, max=1) lookAtCtl.attr('showDetail') >> pivCtl.v pymel.core.parent(coreGrp) coreGrp.attr('inheritsTransform').set(0) coreGrp.t.set(lock=1) coreGrp.r.set(lock=1) coreGrp.s.set(lock=1) mainGrp = pymel.core.createNode('transform', n='grassRigMainGrp') jnt = pymel.core.joint() pymel.core.move(mainGrp, duCurvePivPoint[0], duCurvePivPoint[1], duCurvePivPoint[2], ws=1) pymel.core.parent(duCurve, coreGrp, pivCtl.getParent(), lookAtCtl.getParent(), mainGrp) pymel.core.skinCluster(meshs, jnt) for duCtl in duCtls: sgCmds.setIndexColor(duCtl, 28) sgCmds.setIndexColor(lookAtCtl, 22) pymel.core.select(lookAtCtl)
import maya.cmds as cmds from sgMaya import sgCmds sels = cmds.ls( sl=1 ) ctl = sels[-1] meshs = sels[:-1] wobbleDeformer, handle = cmds.deformer( meshs, type='wobble' ) cmds.parent( handle, ctl ) sgCmds.addAttr( ctl, ln='speed', k=1, min=0 ) sgCmds.addAttr( ctl, ln='weight', k=1, min=0 ) cmds.connectAttr( ctl + '.speed', wobbleDeformer + '.timeFrequency' ) cmds.connectAttr( ctl + '.weight', wobbleDeformer + '.Strength' )
1, makeParent=1, name=ctl.replace('Part', 'Bend%d' % i)) pBendCtl = bendCtl.getParent() bendCtl.getShape().shape_ty.set(0.5) bendCtl.getShape().shape_rx.set(90) pBendCtl.setParent(ctl) sgCmds.setTransformDefault(pBendCtl) pBendCtl.r.set(0, 90 * i, 0) bend1, handle1 = pymel.core.nonLinear(geo, type='bend') handle1.setParent(bendCtl) sgCmds.setTransformDefault(handle1) handle1.r.set(0, 0, 90) bend1.lowBound.set(0) sgCmds.addOptionAttribute(bendCtl) sgCmds.addAttr(bendCtl, ln='bend', k=1) multNode = pymel.core.createNode('multDoubleLinear') bendCtl.bend >> multNode.input1 multNode.input2.set(5) multNode.output >> bend1.curvature handle1.v.set(0) sgCmds.addAttr(bendCtl, ln='lowBound', k=1, min=0, dv=1) sgCmds.addAttr(bendCtl, ln='highBound', k=1, min=0, dv=1) multLow = pymel.core.createNode('multDoubleLinear') bendCtl.lowBound >> multLow.input1 multLow.input2.set(-1) multLow.output >> bend1.lowBound bendCtl.highBound >> bend1.highBound
import pymel.core from sgMaya import sgCmds eyeCtl = pymel.core.ls( 'EyeBDCtrl' )[0] sgCmds.addOptionAttribute( eyeCtl ) sgCmds.addAttr( eyeCtl, ln='specMode', at='enum', en=':default:twinkle', k=1 ) sgCmds.addAttr( eyeCtl, ln='twinkleIndex', at='long', k=1 ) twinkleShader = pymel.core.ls( sl=1 )[0] texturePath = os.path.dirname( cmds.file( q=1, sceneName=1 ) ) + '/texture' twinklePath = texturePath + '/TwinkleEye.0001.png' twinkleSmallPath = texturePath + '/TwinkleEye_small.0001.png' newShaders = [] def convertTwincleTexture( twinkleShader ): files = twinkleShader.listConnections( s=1, d=0, type='file' ) if not files: return None targetFile = files[0] fileConnections = targetFile.listConnections( s=0, d=1, p=1, c=1 ) lambertShaderCon = None rsShaderCon = None for origCon, dstCon in fileConnections: if origCon.longName() == 'outColor': lambertShaderCon = dstCon elif origCon.longName() == 'outAlpha': rsShaderCon = dstCon
from sgMaya import sgCmds import pymel.core sels = pymel.core.ls( sl=1 ) ctl = sels[0] mod = sels[1] sgCmds.addOptionAttribute( ctl ) sgCmds.addAttr( ctl, ln='modVis', k=1, min=0, max=1, dv=1, at='long' ) ctl.attr( 'modVis' ) >> mod.v
firstCtl = pymel.core.ls( '_'.join( endCtl.split( '_' )[:-1] ) + '_0' )[0] pFirstCtl = firstCtl.getParent() base = pFirstCtl.getParent() pMainCtl.setParent( base ) lookAtBase = pymel.core.createNode( 'transform', n= 'lookAtBase_' + firstCtl ) pymel.core.xform( lookAtBase, ws=1, matrix= firstCtl.wm.get() ) lookAtChild = sgCmds.makeLookAtChild( mainCtl, lookAtBase ) lookAtChild.rename( 'lookAtChild_' + firstCtl ) lookAtBase.setParent( base ) pFirstCtl.setParent( lookAtChild ) joints = sgCmds.createFkControlJoint( pFirstCtl ) joints[0].v.set( 0 ) mainCtlFriend = pymel.core.createNode( 'transform' ) pMainCtl = mainCtl.getParent() mainCtlFriend.setParent( pMainCtl ) sgCmds.setTransformDefault( mainCtlFriend ) blendNode = sgCmds.createBlendTwoMatrixNode( mainCtlFriend, mainCtl, local=1 ) dcmp = sgCmds.getDecomposeMatrix( blendNode.matrixSum ) for joint in joints[1:]: dcmp.outputRotate >> joint.r sgCmds.addOptionAttribute( mainCtl ) sgCmds.addAttr( mainCtl, ln='showDetail', min=0, max=1, at='long', cb=1 ) mainCtl.attr( 'showDetail' ) >> pFirstCtl.v
def createMatrixTransformFromVertex( inputVtx ): centerVtx = pymel.core.ls( inputVtx )[0] vertices = sgCmds.getConnectedVertices( centerVtx ) if len( vertices ) < 3: return None curveTr = pymel.core.curve( p=[ [0,0,0] for i in range( len( vertices ) ) ], d=2 ) curveShape = curveTr.getShape() for i in range( len( vertices ) ): connectedVtx = vertices[i] curveInfo = sgCmds.getPointOnCurveFromMeshVertex( connectedVtx ) curveInfo.position >> curveShape.controlPoints[i] pymel.core.closeCurve( curveShape, ch=0, ps=0, rpo=1, bb=0.5, bki=0, p=0.1 ) curveInfos = [] for i in range( 4 ): curveInfo = pymel.core.createNode( 'pointOnCurveInfo' ) curveShape.worldSpace >> curveInfo.inputCurve curveInfo.parameter.set( i * 0.25 ) curveInfos.append( curveInfo ) newTr = pymel.core.createNode( 'transform' ) distX = pymel.core.createNode( 'distanceBetween' ) distY = pymel.core.createNode( 'distanceBetween' ) curveInfos[0].position >> distX.point1 curveInfos[2].position >> distX.point2 curveInfos[1].position >> distY.point1 curveInfos[3].position >> distY.point2 sgCmds.addAttr( newTr, ln='origLengthX', cb=1, dv=distX.distance.get() ) sgCmds.addAttr( newTr, ln='origLengthY', cb=1, dv=distY.distance.get() ) divScaleX = pymel.core.createNode( 'multiplyDivide' ); divScaleX.op.set( 2 ) divScaleY = pymel.core.createNode( 'multiplyDivide' ); divScaleY.op.set( 2 ) newTr.origLengthX >> divScaleX.input2X distX.distance >> divScaleX.input1X newTr.origLengthY >> divScaleY.input2X distY.distance >> divScaleY.input1X divScaleX.outputX >> newTr.sx divScaleY.outputX >> newTr.sy divScaleY.outputX >> newTr.sz vectorX = pymel.core.createNode( 'plusMinusAverage' ); vectorX.op.set( 2 ) vectorY = pymel.core.createNode( 'plusMinusAverage' ); vectorY.op.set( 2 ) curveInfos[0].position >> vectorX.input3D[0] curveInfos[2].position >> vectorX.input3D[1] curveInfos[1].position >> vectorY.input3D[0] curveInfos[3].position >> vectorY.input3D[1] centerCurveInfo = sgCmds.getPointOnCurveFromMeshVertex( centerVtx ) fbf = pymel.core.createNode( 'fourByFourMatrix' ) vectorX.output3Dx >> fbf.in00 vectorX.output3Dy >> fbf.in01 vectorX.output3Dz >> fbf.in02 vectorY.output3Dx >> fbf.in10 vectorY.output3Dy >> fbf.in11 vectorY.output3Dz >> fbf.in12 centerCurveInfo.positionX >> fbf.in30 centerCurveInfo.positionY >> fbf.in31 centerCurveInfo.positionZ >> fbf.in32 mm = pymel.core.createNode( 'multMatrix' ) fbf.output >> mm.i[0] newTr.pim >> mm.i[1] dcmp = pymel.core.createNode( 'decomposeMatrix' ) mm.matrixSum >> dcmp.imat dcmp.ot >> newTr.t dcmp.outputRotate >> newTr.r newTr.dla.set( 1) return newTr, curveTr
def buildArcControl(numJointUpper, numJointLower, typ='arm'): armTops = [] armMiddles = [] armEnds = [] fkIkCtls = [] for side in ['_L_', '_R_']: armTops += pymel.core.ls('jnt%s%s0' % (side, typ)) armMiddles += pymel.core.ls('jnt%s%s1' % (side, typ)) armEnds += pymel.core.ls('jnt%s%s1_end' % (side, typ)) fkIkCtls += pymel.core.ls('anim%s%s_IKFK' % (side, typ)) if not armTops: for side in ['_L_', '_R_']: armTops += pymel.core.ls('%s01%sJNT' % (typ.capitalize(), side)) armMiddles += pymel.core.ls('%s02%sJNT' % (typ.capitalize(), side)) armEnds += pymel.core.ls('%s03%sJNT' % (typ.capitalize(), side)) fkIkCtls += pymel.core.ls('%s%sIKFKSwitch' % (typ.capitalize(), side)) for sideIndex in range(2): coreGrp = pymel.core.createNode( 'transform', n='%sInterporationCoreGrp%s' % (typ.capitalize(), ['_L_', '_R_'][sideIndex])) pymel.core.xform(coreGrp, ws=1, matrix=pymel.core.xform(armTops[sideIndex], q=1, ws=1, matrix=1)) armTop = armTops[sideIndex] armMiddle = armMiddles[sideIndex] armEnd = armEnds[sideIndex] armUpper = sgCmds.addMiddleTranslateJoint(armMiddle, n='MiddleJnt_' + armMiddle) armRotMiddle = sgCmds.addMiddleJoint(armMiddle, n='MiddleRotJnt_' + armMiddle) armLower = sgCmds.addMiddleTranslateJoint(armEnd, n='MiddleJnt_' + armEnd) targets = [armTop, armMiddle, armEnd] circleSubCtls = [] for i in range(len(targets)): circleSubCtl = pymel.core.circle(normal=[1, 0, 0], n=targets[i].replace( 'jnt_', 'sub_Ctl_'), radius=0.1)[0] circleSubCtlGrp = pymel.core.group(circleSubCtl, n='P' + circleSubCtl) pymel.core.parent(circleSubCtlGrp, coreGrp) pymel.core.xform(circleSubCtlGrp, ws=1, matrix=targets[i].wm.get()) circleSubCtls.append(circleSubCtl) firstSubCtl = circleSubCtls[0] secondSubCtl = circleSubCtls[1] thirdSubCtl = circleSubCtls[2] upperSubCtl = pymel.core.circle(normal=[1, 0, 0], n=secondSubCtl + '_upper', radius=0.1)[0] upperSubCtlOffset = pymel.core.group(upperSubCtl, n='Offset' + upperSubCtl) upperSubCtlGrp = pymel.core.group(upperSubCtlOffset, n='P' + upperSubCtl) lowerSubCtl = pymel.core.circle(normal=[1, 0, 0], n=secondSubCtl + '_lower', radius=0.1)[0] lowerSubCtlOffset = pymel.core.group(lowerSubCtl, n='Offset' + lowerSubCtl) lowerSubCtlGrp = pymel.core.group(lowerSubCtlOffset, n='P' + lowerSubCtl) pymel.core.parent(upperSubCtlGrp, coreGrp) pymel.core.parent(lowerSubCtlGrp, coreGrp) pymel.core.xform(upperSubCtlGrp, ws=1, matrix=firstSubCtl.wm.get()) pymel.core.xform(lowerSubCtlGrp, ws=1, matrix=secondSubCtl.wm.get()) firstPos = pymel.core.xform(firstSubCtl, q=1, ws=1, t=1) secondPos = pymel.core.xform(secondSubCtl, q=1, ws=1, t=1) thirdPos = pymel.core.xform(thirdSubCtl, q=1, ws=1, t=1) upperPos = [(firstPos[i] + secondPos[i]) / 2 for i in range(3)] lowerPos = [(secondPos[i] + thirdPos[i]) / 2 for i in range(3)] pymel.core.xform(upperSubCtlGrp, ws=1, t=upperPos) pymel.core.xform(lowerSubCtlGrp, ws=1, t=lowerPos) def getPointOneTwo(pointerCtl1, pointerCtl2, baseCtl): point1Dcmp = sgCmds.getLocalDecomposeMatrix( pointerCtl1.wm, baseCtl.wim) point2Dcmp = sgCmds.getLocalDecomposeMatrix( pointerCtl2.wm, baseCtl.wim) point1 = sgCmds.makeChild(baseCtl, n='pointer1_' + baseCtl) point2 = sgCmds.makeChild(baseCtl, n='pointer2_' + baseCtl) point1Dcmp.otx >> point1.tx point2Dcmp.otx >> point2.tx sgCmds.convertMultDoubleConnection(point1.tx).set(0.5) sgCmds.convertMultDoubleConnection(point2.tx).set(0.5) point1.dh.set(1) point2.dh.set(1) return point1, point2 def disconnectRotate(inputNode): node = pymel.core.ls(inputNode)[0] cons = node.r.listConnections(s=1, d=0, p=1) if cons: cons[0] // node.r upperPoint1, upperPoint2 = getPointOneTwo(firstSubCtl, secondSubCtl, upperSubCtl) lowerPoint1, lowerPoint2 = getPointOneTwo(secondSubCtl, thirdSubCtl, lowerSubCtl) upperCurve = sgCmds.makeCurveFromObjects(firstSubCtl, upperPoint1, upperPoint2, secondSubCtl) lowerCurve = sgCmds.makeCurveFromObjects(secondSubCtl, lowerPoint1, lowerPoint2, thirdSubCtl) upperCurve.setParent(coreGrp) upperCurve.t.set(0, 0, 0) upperCurve.r.set(0, 0, 0) lowerCurve.setParent(coreGrp) lowerCurve.t.set(0, 0, 0) lowerCurve.r.set(0, 0, 0) upperJoints = sgCmds.createPointOnCurve(upperCurve, numJointUpper, nodeType='joint', vector=[1, 0, 0]) lowerJoints = sgCmds.createPointOnCurve(lowerCurve, numJointLower, nodeType='joint', vector=[1, 0, 0]) pymel.core.parent(upperJoints, coreGrp) pymel.core.parent(lowerJoints, coreGrp) for upperJoint in upperJoints: upperJoint.jo.set(0, 0, 0) for lowerJoint in lowerJoints: lowerJoint.jo.set(0, 0, 0) disconnectRotate(upperJoints[0]) pymel.core.delete(upperJoints[-1]) disconnectRotate(lowerJoints[0]) disconnectRotate(lowerJoints[-1]) sgCmds.blendTwoMatrixConnect(upperJoints[-2], lowerJoints[1], lowerJoints[0], ct=False) ctlGrp = pymel.core.createNode( 'transform', n='%sInterporationCtlGrp%s' % (typ.capitalize(), ['_L_', '_R_'][sideIndex])) sgCmds.constrain_all(armTop, ctlGrp) pymel.core.xform(ctlGrp, os=1, matrix=sgCmds.getDefaultMatrix()) sgCmds.addAttr(fkIkCtls[sideIndex], ln='showArcCtls', cb=1, min=0, max=1, at='long') fkIkCtls[sideIndex].showArcCtls >> ctlGrp.v fkIkCtls[sideIndex].showArcCtls.set(1) sgCmds.addAttr(fkIkCtls[sideIndex], ln='arc', k=1, min=0, max=1) circleCtls = [] for i in range(len(targets)): circleCtl = pymel.core.circle(normal=[1, 0, 0], n=targets[i].replace( 'jnt_', 'Ctl_itp_'), radius=0.5)[0] circleCtlGrp = pymel.core.group(circleCtl, n='P' + circleCtl) pymel.core.parent(circleCtlGrp) pymel.core.xform(circleCtlGrp, ws=1, matrix=targets[i].wm.get()) circleCtls.append(circleCtl) for i in range(len(targets)): circleCtls[i].t >> circleSubCtls[i].t circleCtls[i].r >> circleSubCtls[i].r sgCmds.constrain_parent(armTop, circleCtls[0].getParent()) sgCmds.constrain_parent(armRotMiddle, circleCtls[1].getParent()) sgCmds.constrain_parent(armEnd, circleCtls[2].getParent()) upperCtl = pymel.core.circle(normal=[1, 0, 0], n=circleCtls[1] + '_upper', radius=0.5)[0] upperCtlOffset = pymel.core.group(upperCtl, n='Offset' + upperCtl) upperCtlGrp = pymel.core.group(upperCtlOffset, n='P' + upperCtl) lowerCtl = pymel.core.circle(normal=[1, 0, 0], n=circleCtls[1] + '_lower', radius=0.5)[0] lowerCtlOffset = pymel.core.group(lowerCtl, n='Offset' + lowerCtl) lowerCtlGrp = pymel.core.group(lowerCtlOffset, n='P' + lowerCtl) upperCtl.t >> upperSubCtl.t lowerCtl.t >> lowerSubCtl.t upperSubCtlOffset.t >> upperCtlOffset.t lowerSubCtlOffset.t >> lowerCtlOffset.t sgCmds.constrain_parent(armUpper, upperCtlGrp) sgCmds.constrain_parent(armLower, lowerCtlGrp) pymel.core.parent(circleCtls[0].getParent(), circleCtls[1].getParent(), circleCtls[2].getParent(), upperCtlGrp, lowerCtlGrp, ctlGrp) arcNode = pymel.core.createNode('makeThreePointCircularArc') arcNode.point1.set(0, 0, 0) armMiddle.t >> arcNode.point2 dcmpEnd = sgCmds.getLocalDecomposeMatrix(armEnd.wm, armTop.wim) rangeNode = pymel.core.createNode('setRange') if sideIndex == 0: rangeNode.minZ.set(0.001) rangeNode.maxZ.set(10000) rangeNode.oldMinZ.set(0.001) rangeNode.oldMaxZ.set(10000) else: rangeNode.minZ.set(-100) rangeNode.maxZ.set(-0.001) rangeNode.oldMinZ.set(-100) rangeNode.oldMaxZ.set(-0.001) dcmpEnd.ot >> rangeNode.value rangeNode.outValue >> arcNode.point3 curveShape = pymel.core.createNode('nurbsCurve') curveTr = curveShape.getParent() curveTr.setParent(armTop) pymel.core.xform(curveTr, os=1, matrix=sgCmds.getDefaultMatrix()) arcNode.outputCurve >> curveShape.create middleTargets = [armUpper, armLower] offsetCtls = [upperSubCtlOffset, lowerSubCtlOffset] for i in range(2): nearPointChild = pymel.core.createNode('transform') nearPointChild.setParent(curveTr) nearCurve = pymel.core.createNode('nearestPointOnCurve') curveShape.local >> nearCurve.inputCurve middleDcmp = sgCmds.getLocalDecomposeMatrix( middleTargets[i].wm, curveTr.wim) middleDcmp.ot >> nearCurve.inPosition nearCurve.position >> nearPointChild.t dcmp = sgCmds.getLocalDecomposeMatrix(nearPointChild.wm, middleTargets[i].wim) blendColor = pymel.core.createNode('blendColors') dcmp.ot >> blendColor.color1 blendColor.color2.set(0, 0, 0) fkIkCtls[sideIndex].arc >> blendColor.blender blendColor.output >> offsetCtls[i].t circleCtls[0].v.set(0) circleCtls[2].v.set(0) for joint in upperJoints[:-1] + lowerJoints[1:]: sgCmds.makeParent(joint) attrNameX = sgCmds.addMultDoubleLinearConnection(joint.rx) attrNameY = sgCmds.addMultDoubleLinearConnection(joint.ry) attrNameZ = sgCmds.addMultDoubleLinearConnection(joint.rz) if not attrNameX: continue attrNameX.set(0.5) attrNameY.set(0.5) attrNameZ.set(0.5)
d=1, type='transform', p=1, c=1) if not con1Dests: continue add1 = pymel.core.createNode('addDoubleLinear') add2 = pymel.core.createNode('addDoubleLinear') setRange1 = pymel.core.createNode('setRange') setRange2 = pymel.core.createNode('setRange') con1Dests[0][0] >> add1.input1 con2Dests[0][0] >> add2.input1 sgCmds.addAttr(sel, ln='origVis', min=-1, max=1, at='long', k=1) sgCmds.addAttr(sel, ln='paintedVis', min=-1, max=1, at='long', k=1) sel.attr('origVis') >> add1.input2 sel.attr('paintedVis') >> add2.input2 add1.output >> setRange1.valueX add2.output >> setRange2.valueX setRange1.maxX.set(1) setRange1.oldMaxX.set(1) setRange2.maxX.set(1) setRange2.oldMaxX.set(1) setRange1.outValueX >> con1Dests[0][1] setRange2.outValueX >> con2Dests[0][1]
def buildArcControl( numJointUpper, numJointLower, typ='arm' ): armTops = [] armMiddles = [] armEnds = [] fkIkCtls = [] for side in ['_L_', '_R_' ]: armTops += pymel.core.ls( 'jnt%s%s0' % ( side, typ ) ) armMiddles += pymel.core.ls( 'jnt%s%s1' % ( side, typ ) ) armEnds += pymel.core.ls( 'jnt%s%s1_end' % ( side, typ ) ) fkIkCtls += pymel.core.ls( 'anim%s%s_IKFK' % ( side, typ ) ) if not armTops: for side in ['_L_', '_R_' ]: armTops += pymel.core.ls( '%s01%sJNT' % ( typ.capitalize(), side ) ) armMiddles += pymel.core.ls( '%s02%sJNT' % ( typ.capitalize(), side ) ) armEnds += pymel.core.ls( '%s03%sJNT' % ( typ.capitalize(), side ) ) fkIkCtls += pymel.core.ls( '%s%sIKFKSwitch' % ( typ.capitalize(), side ) ) for sideIndex in range( 2 ): coreGrp = pymel.core.createNode( 'transform', n='%sInterporationCoreGrp%s' % ( typ.capitalize(), ['_L_','_R_'][sideIndex] ) ) pymel.core.xform( coreGrp, ws=1, matrix=pymel.core.xform( armTops[sideIndex], q=1, ws=1, matrix=1 ) ) armTop = armTops[sideIndex] armMiddle = armMiddles[sideIndex] armEnd = armEnds[sideIndex] armUpper = sgCmds.addMiddleTranslateJoint( armMiddle, n='MiddleJnt_' + armMiddle ) armRotMiddle = sgCmds.addMiddleJoint( armMiddle, n='MiddleRotJnt_' + armMiddle ) armLower = sgCmds.addMiddleTranslateJoint( armEnd, n='MiddleJnt_' + armEnd ) targets = [ armTop, armMiddle, armEnd ] circleSubCtls = [] for i in range( len( targets ) ): circleSubCtl = pymel.core.circle( normal=[1,0,0], n=targets[i].replace( 'jnt_', 'sub_Ctl_' ), radius=0.1 )[0] circleSubCtlGrp = pymel.core.group( circleSubCtl, n='P' + circleSubCtl ) pymel.core.parent( circleSubCtlGrp, coreGrp ) pymel.core.xform( circleSubCtlGrp, ws=1, matrix=targets[i].wm.get() ) circleSubCtls.append( circleSubCtl ) firstSubCtl = circleSubCtls[0] secondSubCtl = circleSubCtls[1] thirdSubCtl = circleSubCtls[2] upperSubCtl = pymel.core.circle( normal=[1,0,0], n=secondSubCtl + '_upper', radius=0.1 )[0] upperSubCtlOffset = pymel.core.group( upperSubCtl, n='Offset' + upperSubCtl ) upperSubCtlGrp = pymel.core.group( upperSubCtlOffset, n='P' + upperSubCtl ) lowerSubCtl = pymel.core.circle( normal=[1,0,0], n=secondSubCtl + '_lower', radius=0.1 )[0] lowerSubCtlOffset = pymel.core.group( lowerSubCtl, n='Offset' + lowerSubCtl ) lowerSubCtlGrp = pymel.core.group( lowerSubCtlOffset, n='P' + lowerSubCtl ) pymel.core.parent( upperSubCtlGrp, coreGrp ) pymel.core.parent( lowerSubCtlGrp, coreGrp ) pymel.core.xform( upperSubCtlGrp, ws=1, matrix=firstSubCtl.wm.get() ) pymel.core.xform( lowerSubCtlGrp, ws=1, matrix=secondSubCtl.wm.get() ) firstPos = pymel.core.xform( firstSubCtl, q=1, ws=1, t=1 ) secondPos = pymel.core.xform( secondSubCtl, q=1, ws=1, t=1 ) thirdPos = pymel.core.xform( thirdSubCtl, q=1, ws=1, t=1 ) upperPos = [ (firstPos[i] + secondPos[i])/2 for i in range( 3 ) ] lowerPos = [ (secondPos[i] + thirdPos[i])/2 for i in range( 3 ) ] pymel.core.xform( upperSubCtlGrp, ws=1, t=upperPos ) pymel.core.xform( lowerSubCtlGrp, ws=1, t=lowerPos ) def getPointOneTwo( pointerCtl1, pointerCtl2, baseCtl ): point1Dcmp = sgCmds.getLocalDecomposeMatrix( pointerCtl1.wm, baseCtl.wim ) point2Dcmp = sgCmds.getLocalDecomposeMatrix( pointerCtl2.wm, baseCtl.wim ) point1 = sgCmds.makeChild( baseCtl, n='pointer1_' + baseCtl ) point2 = sgCmds.makeChild( baseCtl, n='pointer2_' + baseCtl ) point1Dcmp.otx >> point1.tx point2Dcmp.otx >> point2.tx sgCmds.convertMultDoubleConnection( point1.tx ).set( 0.5 ) sgCmds.convertMultDoubleConnection( point2.tx ).set( 0.5 ) point1.dh.set( 1 ) point2.dh.set( 1 ) return point1, point2 def disconnectRotate( inputNode ): node = pymel.core.ls( inputNode )[0] cons = node.r.listConnections( s=1, d=0, p=1 ) if cons: cons[0] // node.r upperPoint1, upperPoint2 = getPointOneTwo( firstSubCtl, secondSubCtl, upperSubCtl ) lowerPoint1, lowerPoint2 = getPointOneTwo( secondSubCtl, thirdSubCtl, lowerSubCtl ) upperCurve = sgCmds.makeCurveFromObjects( firstSubCtl, upperPoint1, upperPoint2, secondSubCtl ) lowerCurve = sgCmds.makeCurveFromObjects( secondSubCtl, lowerPoint1, lowerPoint2, thirdSubCtl ) upperCurve.setParent( coreGrp ); upperCurve.t.set( 0,0,0 ); upperCurve.r.set( 0,0,0 ) lowerCurve.setParent( coreGrp ); lowerCurve.t.set( 0,0,0 ); lowerCurve.r.set( 0,0,0 ) upperJoints = sgCmds.createPointOnCurve( upperCurve, numJointUpper, nodeType='joint', vector=[1,0,0] ) lowerJoints = sgCmds.createPointOnCurve( lowerCurve, numJointLower, nodeType='joint', vector=[1,0,0] ) pymel.core.parent( upperJoints, coreGrp ) pymel.core.parent( lowerJoints, coreGrp ) for upperJoint in upperJoints: upperJoint.jo.set( 0,0,0 ) for lowerJoint in lowerJoints: lowerJoint.jo.set( 0,0,0 ) disconnectRotate( upperJoints[0] ) pymel.core.delete( upperJoints[-1] ) disconnectRotate( lowerJoints[0] ) disconnectRotate( lowerJoints[-1] ) sgCmds.blendTwoMatrixConnect( upperJoints[-2], lowerJoints[1], lowerJoints[0], ct=False ) ctlGrp = pymel.core.createNode( 'transform', n='%sInterporationCtlGrp%s' % ( typ.capitalize(), ['_L_','_R_'][sideIndex] ) ) sgCmds.constrain_all(armTop, ctlGrp) pymel.core.xform( ctlGrp, os=1, matrix= sgCmds.getDefaultMatrix() ) sgCmds.addAttr( fkIkCtls[sideIndex], ln='showArcCtls', cb=1, min=0, max=1, at='long' ) fkIkCtls[sideIndex].showArcCtls >> ctlGrp.v fkIkCtls[sideIndex].showArcCtls.set( 1 ) sgCmds.addAttr( fkIkCtls[sideIndex], ln='arc', k=1, min=0, max=1 ) circleCtls = [] for i in range( len( targets ) ): circleCtl = pymel.core.circle( normal=[1,0,0], n=targets[i].replace( 'jnt_', 'Ctl_itp_' ), radius=0.5 )[0] circleCtlGrp = pymel.core.group( circleCtl, n='P' + circleCtl ) pymel.core.parent( circleCtlGrp ) pymel.core.xform( circleCtlGrp, ws=1, matrix=targets[i].wm.get() ) circleCtls.append( circleCtl ) for i in range( len( targets ) ): circleCtls[i].t >> circleSubCtls[i].t circleCtls[i].r >> circleSubCtls[i].r sgCmds.constrain_parent( armTop, circleCtls[0].getParent() ) sgCmds.constrain_parent( armRotMiddle, circleCtls[1].getParent() ) sgCmds.constrain_parent( armEnd, circleCtls[2].getParent() ) upperCtl = pymel.core.circle( normal=[1,0,0], n=circleCtls[1] + '_upper', radius=0.5 )[0] upperCtlOffset = pymel.core.group( upperCtl, n='Offset' + upperCtl ) upperCtlGrp = pymel.core.group( upperCtlOffset, n='P' + upperCtl ) lowerCtl = pymel.core.circle( normal=[1,0,0], n=circleCtls[1] + '_lower', radius=0.5 )[0] lowerCtlOffset = pymel.core.group( lowerCtl, n='Offset' + lowerCtl ) lowerCtlGrp = pymel.core.group( lowerCtlOffset, n='P' + lowerCtl ) upperCtl.t >> upperSubCtl.t lowerCtl.t >> lowerSubCtl.t upperSubCtlOffset.t >> upperCtlOffset.t lowerSubCtlOffset.t >> lowerCtlOffset.t sgCmds.constrain_parent( armUpper, upperCtlGrp ) sgCmds.constrain_parent( armLower, lowerCtlGrp ) pymel.core.parent( circleCtls[0].getParent(), circleCtls[1].getParent(), circleCtls[2].getParent(), upperCtlGrp, lowerCtlGrp, ctlGrp ) arcNode = pymel.core.createNode( 'makeThreePointCircularArc' ) arcNode.point1.set( 0,0,0 ) armMiddle.t >> arcNode.point2 dcmpEnd = sgCmds.getLocalDecomposeMatrix( armEnd.wm, armTop.wim ) rangeNode = pymel.core.createNode( 'setRange' ) if sideIndex == 0: rangeNode.minZ.set( 0.001 ); rangeNode.maxZ.set( 10000 ) rangeNode.oldMinZ.set( 0.001 ); rangeNode.oldMaxZ.set( 10000 ) else: rangeNode.minZ.set( -100 ); rangeNode.maxZ.set( -0.001 ) rangeNode.oldMinZ.set( -100 ); rangeNode.oldMaxZ.set( -0.001 ) dcmpEnd.ot >> rangeNode.value rangeNode.outValue >> arcNode.point3 curveShape = pymel.core.createNode( 'nurbsCurve' ) curveTr = curveShape.getParent() curveTr.setParent( armTop ) pymel.core.xform( curveTr, os=1, matrix=sgCmds.getDefaultMatrix() ) arcNode.outputCurve >> curveShape.create middleTargets = [armUpper, armLower] offsetCtls = [upperSubCtlOffset, lowerSubCtlOffset] for i in range( 2 ): nearPointChild = pymel.core.createNode( 'transform' ) nearPointChild.setParent( curveTr ) nearCurve = pymel.core.createNode( 'nearestPointOnCurve' ) curveShape.local >> nearCurve.inputCurve middleDcmp = sgCmds.getLocalDecomposeMatrix( middleTargets[i].wm, curveTr.wim ) middleDcmp.ot >> nearCurve.inPosition nearCurve.position >> nearPointChild.t dcmp = sgCmds.getLocalDecomposeMatrix( nearPointChild.wm, middleTargets[i].wim ) blendColor = pymel.core.createNode( 'blendColors' ) dcmp.ot >> blendColor.color1 blendColor.color2.set( 0,0,0 ) fkIkCtls[sideIndex].arc >> blendColor.blender blendColor.output >> offsetCtls[i].t circleCtls[0].v.set(0) circleCtls[2].v.set(0) for joint in upperJoints[:-1] + lowerJoints[1:]: sgCmds.makeParent( joint ) attrNameX = sgCmds.addMultDoubleLinearConnection( joint.rx ) attrNameY = sgCmds.addMultDoubleLinearConnection( joint.ry ) attrNameZ = sgCmds.addMultDoubleLinearConnection( joint.rz ) if not attrNameX: continue attrNameX.set( 0.5 ) attrNameY.set( 0.5 ) attrNameZ.set( 0.5 )
targetChildren[i].attr( 'displaySmoothMesh' ).set( subdivisionValues[i] ) rsProxyTr = sgCmds.createRedshiftProxy( sel ) pymel.core.refresh() rsProxyShape = rsProxyTr.getShape() pymel.core.parent( gpuCacheTr.getShape(), rsProxyTr, add=1, shape=1 ) pymel.core.delete( gpuCacheTr ) rsProxyShape.lodVisibility.set( 0 ) selName = sel.nodeName() sgCmds.getSourceConnection( rsProxyTr, sel ) if sel.getParent(): try:rsProxyTr.setParent( sel.getParent() ) except:pass rsProxyTr.addAttr( "origObjectPath", dt='string' ) origExportPath = origdirPath + "/" + sel.name().replace( '|', '_' ).replace( ':', '_' ) + '.mb' sgCmds.addAttr( sel, ln="origName", dt='string' ) sel.attr( 'origName' ).set( sel.name() ) sel.setParent( w=1 ) pymel.core.select( sel ) cmds.file( origExportPath, f=1, options="v=0", typ="mayaBinary", pr=1, es=1 ) rsProxyTr.attr( "origObjectPath" ).set( origExportPath ) selName = sel.nodeName() pymel.core.delete( sel ) rsProxyTr.rename( selName ) for child in rsProxyTr.listRelatives( c=1, ad=1 ): if child.nodeType() == 'mesh': child.rename( rsProxyTr.nodeName() + 'Shape' ) elif child.nodeType() == 'gpuCache': child.rename( rsProxyTr.nodeName() + '_gpuShape' )
for mainCtl in sels: bb = pymel.core.exactWorldBoundingBox( mainCtl.getShape() ) mainCtlPos = pymel.core.xform( mainCtl, q=1, ws=1, t=1 ) minPoint = [ bb[0], 0, mainCtlPos[2] ] centerPoint = mainCtlPos maxPoint = [ bb[3], 0, mainCtlPos[2] ] minCenter, minMiddle, minEnd, minStatic, minMove = getPointers( centerPoint, minPoint ) maxCenter, maxMiddle, maxEnd, maxStatic, maxMove = getPointers( centerPoint, maxPoint ) sgCmds.addOptionAttribute( mainCtl ) sgCmds.addAttr( mainCtl, ln='bendMin', k=1 ) sgCmds.addAttr( mainCtl, ln='bendMax', k=1 ) sgCmds.addAttr( mainCtl, ln='bendMinRounding', k=1, min=0, max=10, dv=10 ) sgCmds.addAttr( mainCtl, ln='bendMaxRounding', k=1, min=0, max=10, dv=10 ) multMax = pymel.core.createNode( 'multDoubleLinear' ) multMin = pymel.core.createNode( 'multDoubleLinear' ) multMaxRounging = pymel.core.createNode( 'multDoubleLinear' ) multMinRounging = pymel.core.createNode( 'multDoubleLinear' ) mainCtl.attr( 'bendMin' ) >> multMin.input1 multMin.input2.set( -1 ) multMin.output >> minCenter.rz mainCtl.attr( 'bendMax' ) >> multMax.input1 multMax.input2.set( 1 )
from sgMaya import sgCmds import pymel.core sels = pymel.core.ls(sl=1) sgCmds.addOptionAttribute(sels[0], 'options') sgCmds.addAttr(sels[0], ln='hide', min=0, max=1, k=1, at='long') revNode = pymel.core.createNode('reverse') sels[0].attr('hide') >> revNode.inputX revNode.outputX >> sels[1].v
from sgMaya import sgCmds import pymel.core sels = pymel.core.ls(sl=1) for sel in sels[2:]: blendNode = sgCmds.createBlendTwoMatrixNode(sels[0].wm, sels[1].wm) mm = pymel.core.createNode('multMatrix') sgCmds.matrixOutput(blendNode) >> mm.i[0] sel.pim >> mm.i[1] dcmp = sgCmds.getDecomposeMatrix(mm.matrixSum) dcmp.outputRotate >> sel.r sgCmds.addAttr(sel, ln='blend', min=0, max=1, k=1, dv=0.5) print sel.blend.name(), " >> ", blendNode.blend.name() sel.blend >> blendNode.blend
from sgMaya import sgCmds import pymel.core sels = pymel.core.ls( sl=1 ) for sel in sels[2:]: blendNode = sgCmds.createBlendTwoMatrixNode( sels[0].wm, sels[1].wm ) mm = pymel.core.createNode( 'multMatrix' ) blendNode.matrixSum >> mm.i[0] sel.pim >> mm.i[1] dcmp = sgCmds.getDecomposeMatrix( mm.matrixSum ) dcmp.ot >> sel.t sgCmds.addAttr( sel, ln='blend', min=0, max=1, k=1, dv=0.5 ) print sel.blend.name(), " >> ", blendNode.blend.name() sel.blend >> blendNode.blend
from sgMaya import sgCmds import pymel.core sels = pymel.core.ls( sl=1 ) sgCmds.addOptionAttribute( sels[0], 'options' ) sgCmds.addAttr( sels[0], ln='hide', min=0, max=1, k=1, at='long' ) revNode = pymel.core.createNode( 'reverse' ) sels[0].attr( 'hide' ) >> revNode.inputX revNode.outputX >> sels[1].v
for sel in sels: poleVConst = sel.t.listConnections( s=0, d=1, type='poleVectorConstraint' )[0] ikHandle = poleVConst.constraintTranslateX.listConnections( s=0, d=1, type='ikHandle' )[0] endEffector = ikHandle.endEffector.listConnections( s=1, d=0 )[0] endJnt = endEffector.tx.listConnections( s=1, d=0 )[0] middleJnt = endEffector.getParent() mdMiddle = middleJnt.tx.listConnections( s=1, d=0 )[0] mdEnd = endJnt.tx.listConnections( s=1, d=0 )[0] sgCmds.addOptionAttribute( sel, 'IK Length' ) sgCmds.addAttr( sel, ln='ikUpperLength', k=1 ) sgCmds.addAttr( sel, ln='ikLowerLength', k=1 ) powMiddle = pymel.core.createNode( 'multiplyDivide' ) powMiddle.input1X.set( 2 ); powMiddle.op.set( 3 ) powEnd = pymel.core.createNode( 'multiplyDivide' ) powEnd.input1X.set( 2 ); powEnd.op.set( 3 ) sel.attr( 'ikUpperLength' ) >> powMiddle.input2X sel.attr( 'ikLowerLength' ) >> powEnd.input2X origDistMiddle = mdMiddle.input2Y.get() origDistEnd = mdEnd.input2Y.get() multMid = pymel.core.createNode( 'multDoubleLinear' ) multEnd = pymel.core.createNode( 'multDoubleLinear' )