Ejemplo n.º 1
0
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
Ejemplo n.º 2
0
    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
Ejemplo n.º 6
0
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 )
    
    
    
Ejemplo n.º 7
0
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')
Ejemplo n.º 12
0
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
Ejemplo n.º 15
0
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' )
Ejemplo n.º 17
0
                                    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
Ejemplo n.º 21
0
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
Ejemplo n.º 22
0
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]
Ejemplo n.º 24
0
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
Ejemplo n.º 28
0
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' )