Hi everybody!

I've made this script that creates a ribbon setup between two selected 
objects, where the user can specify the number of spans of the nurbs plane 
(which is also the number of follicles and bind joints, as well as the 
length of the plane) and the number of controllers.to be created. 

Everything works fine except that I'm trying to connect the scale of each 
controller to the scale of each bind joint (using a plusMinusAverage node 
maybe?), having the influence of the controller diminish as the bind joint 
gets further away, until the influence will become zero where a new 
controller is. I'm not really sure on how to accomplish this, as the number 
of bind joints and controllers are not set in stone. Any suggestion is 
welcome!

Here is an example of what I have:

import maya.cmds as cmds

startPointText= "start"
endPointText= "end"
nurbsPlaneSpans= 6
nurbsPlaneCNTLs= 3

#Create NURBS plane (width is equal to number of bind joints that is 
wanted), and the master groups
ribbonNURBSPlane= cmds.nurbsPlane(p= [0, 0, 0], ax= [0, 1, 0], w= 
nurbsPlaneSpans, lr= 0.1666666667, d= 3, u= nurbsPlaneSpans, v= 1, ch= 
False, n= startPointText+ "_NURBS")
ribbonDriverGroup= cmds.group(n= startPointText+ "_ribbon_driver_GRP", em= 
True)
ribbonBindGroup= cmds.group(n= startPointText+ "_ribbon_bind_GRP", em= True)
cmds.select(d= True)

#Create driver joints, to start the first and last joint at the ends of the 
NURBS plane
firstRibbonJoint= cmds.joint(position= (nurbsPlaneSpans/ -2, 0, 0), n= 
startPointText+ "_ribbon_01_JNT", rad= 1)
cmds.select(d= True)
lastRibbonJoint= cmds.joint(position= (nurbsPlaneSpans/ 2, 0, 0), n= 
startPointText+ "_ribbon_%02d_JNT" %(nurbsPlaneCNTLs), rad= 1)
cmds.select(d= True)
#Get their positions and decrease nurbsPlaneCNTLs amount by 1 for formula
startXYZ= cmds.xform(firstRibbonJoint, query= 1, worldSpace= 1, 
translation= 1)
endXYZ= cmds.xform(lastRibbonJoint, q= 1, ws= 1, t= 1)
nurbsPlaneCNTLs= nurbsPlaneCNTLs- 1
#Midpoint formula
locationXYZ= startXYZ[0] + (endXYZ[0] - startXYZ[0])/nurbsPlaneCNTLs, 
startXYZ[1] + (endXYZ[1] - startXYZ[1])/nurbsPlaneCNTLs, startXYZ[2] + 
(endXYZ[2] - startXYZ[2])/nurbsPlaneCNTLs
cmds.select(d= True)
cmds.joint(p= (locationXYZ[0], locationXYZ[1], locationXYZ[2]), n= 
startPointText+ "_ribbon_02_JNT", rad= 1)
for i in range(nurbsPlaneCNTLs- 2):
    currentRibbonJointSelection= cmds.ls(sl= True)
    newXYZ= cmds.xform(currentRibbonJointSelection, query= 1, worldSpace= 
1, translation= 1)
    #Formula to find the next segment division (new point coordinates plus 
distance)
    remainderXYZ= newXYZ[0] + (locationXYZ[0] - startXYZ[0]), newXYZ[1] + 
(locationXYZ[1] - startXYZ[1]), newXYZ[2] + (locationXYZ[2] - startXYZ[2])
    cmds.select(d= True)
    cmds.joint(p= (remainderXYZ[0], remainderXYZ[1], remainderXYZ[2]), n= 
startPointText+ "_ribbon_%02d_JNT" %(i+ 3), rad= 1)
cmds.reorder(lastRibbonJoint, relative= nurbsPlaneCNTLs- 1)

#Create CNTL and group above each driver joint, and add all to master 
driver group
cmds.select(startPointText+ "_ribbon*JNT", r= True)
allRibbonDriverJoints= cmds.ls(sl= True)
for jnt in allRibbonDriverJoints:
    currentRibbonJointPosition= cmds.xform(jnt, q= 1, ws= 1, t= 1)
    cmds.spaceLocator(n= jnt[:-4]+ "_CNTL")
    cmds.group(n= jnt[:-4]+ "_GRP")
    cmds.move(currentRibbonJointPosition[0], currentRibbonJointPosition[1], 
currentRibbonJointPosition[2], r= True)
    cmds.parent(jnt, jnt[:-4]+ "_CNTL")
    cmds.parent(jnt[:-4]+ "_GRP", ribbonDriverGroup)

#Create follicles and name them accordingly
folliclesMasterGRP= cmds.group(n= startPointText+ "_follicles_GRP", em= 
True)
parameterUFormula= (1.0/ nurbsPlaneSpans)/ 2 #Formula to get the first U 
coordinate, which needs to be half
parameterUFormulaIncrease= parameterUFormula* 2 #Get the exponent needed to 
increase the U coordinate after first iteration
for i in range(1, nurbsPlaneSpans+ 1):
    cmds.createNode("follicle")
    cmds.pickWalk(d= "up")
    cmds.rename(startPointText+ "_%02d_FOL" %(i))
    cmds.pickWalk(d= "down")
    currentFollicleShape= cmds.ls(sl= True)[0]
    #Connect them to NURBS plane
    cmds.connectAttr(startPointText+ "_NURBSShape"+ ".local", 
currentFollicleShape+ ".inputSurface", f= True)
    cmds.connectAttr(startPointText+ "_NURBSShape"+ ".worldMatrix[0]", 
currentFollicleShape+ ".inputWorldMatrix", f= True)
    cmds.connectAttr(currentFollicleShape+ ".outRotate", startPointText+ 
"_%02d_FOL" %(i)+ ".rotate", f= True)
    cmds.connectAttr(currentFollicleShape+ ".outTranslate", startPointText+ 
"_%02d_FOL" %(i)+ ".translate", f= True)
    #Position them on the correct U coordinate
    cmds.setAttr(currentFollicleShape+ ".parameterU", parameterUFormula)
    cmds.setAttr(currentFollicleShape+ ".parameterV", 0.5)
    #Parent follicles under follicle GRP
    cmds.parent(startPointText+ "_%02d_FOL" %(i), folliclesMasterGRP)
    #Increase the U coordinate
    parameterUFormula= parameterUFormula+ parameterUFormulaIncrease

#Select each follicle and create joint underneath
cmds.select(startPointText+ "*FOL", r= True)
allRibbonFollicles= cmds.ls(sl= True)
for fol in allRibbonFollicles:
    cmds.select(fol, r= True)
    cmds.joint(n= fol[:-7]+ "_follicle"+ fol[-7:-4]+ "_JNT", rad= 0.5)

#Select driver joints, NURBS plane, and bind skin
cmds.select(allRibbonDriverJoints, r= True)
cmds.select(ribbonNURBSPlane, add= True)
cmds.skinCluster(toSelectedBones= True, bindMethod= 0, skinMethod= 0, 
normalizeWeights= 1, weightDistribution= 0, maximumInfluences= 5, 
obeyMaxInfluences= True, removeUnusedInfluence= True, dropoffRate= 4)

#Hierarchy should be NURBS plane and follicle group under a master group, 
and driver joints under another master group
cmds.parent(ribbonNURBSPlane, ribbonBindGroup)
cmds.parent(folliclesMasterGRP, ribbonBindGroup)

#Connect the scale of each CNTL to the scale of the closest bind joints, 
until a new CNTL takes over
"""
This is the part I can't figure out
"""


-- 
You received this message because you are subscribed to the Google Groups 
"Python Programming for Autodesk Maya" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to python_inside_maya+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/python_inside_maya/f24ad8cd-c75d-45f7-9b11-e27a28690672%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to