Skip to content

Instantly share code, notes, and snippets.

@paulwinex
Created January 29, 2018 21:55
Show Gist options
  • Save paulwinex/514c2378112a8b6acc4d8fadd4838166 to your computer and use it in GitHub Desktop.
Save paulwinex/514c2378112a8b6acc4d8fadd4838166 to your computer and use it in GitHub Desktop.
import maya.cmds as cmds
import maya.mel as mel
# ends positions
p1 = [0,0,0]
p2 = [0.0, 10.0, 0.0]
#create curve
curvePos = []
for i in range(6):
x = p1[0] + (((p2[0] - p1[0]) / 5.0)*i)
y = p1[1] + (((p2[1] - p1[1]) / 5.0)*i)
z = p1[2] + (((p2[2] - p1[2]) / 5.0)*i)
curvePos.append([x,y,z])
spineCurve = cmds.curve(d=5, p=(curvePos), k=[0,0,0,0,0,1,1,1,1,1], n='spineCurve')
#createSkinJoints
curveJoints = []
skinJoints = []
controlJoints = []
orientLocators = []
cmds.select(cl=1)
curvJointsGrp = cmds.createNode('transform', n='curvJointsGrp')
for i, p in enumerate(curvePos):
jnt = cmds.joint(p=p, n='curveJoint'+str(i).zfill(2), rad=0.5)
curveJoints.append(jnt)
cmds.select(cl=1)
skinJointsGrp = cmds.createNode('transform', n='skinJointsGrp', ss=1)
for i, p in enumerate(curvePos):
jnt = cmds.joint(p=p, n='skinJoint'+str(i).zfill(2), rad=1)
mel.eval('ToggleLocalRotationAxes;')
cmds.setAttr(jnt+".overrideEnabled", 1)
cmds.setAttr(jnt+'.overrideColor', 18)
cmds.parent(jnt, skinJointsGrp)
skinJoints.append(jnt)
#move joints
cmds.select(cl=1)
for i, p in enumerate([0,4]):
jnt = cmds.joint(p=curvePos[p], n='controlJoint'+str(i).zfill(2), rad=2.5)
cmds.setAttr(jnt+".overrideEnabled", 1)
cmds.setAttr(jnt+'.overrideColor', 13)
controlJoints.append(jnt)
#orient locators
cmds.select(cl=1)
orientLocatorsGrp = cmds.createNode('transform', n='orientLocatorsGrp', ss=1)
locators = []
for i, p in enumerate(curvePos[:-1]):
grp = cmds.createNode('transform', n='orintLocatorGrp'+str(i).zfill(2))
loc = cmds.spaceLocator(n='orientLocator'+str(i).zfill(2))[0]
locators.append(loc)
cmds.setAttr(loc+".localScale", 0.5, 0.5, 0.5)
cmds.parent(loc, grp)
cmds.xform(loc, t=[0,0,3])
cmds.xform(grp, t=p)
cmds.makeIdentity(grp, apply=True, t=1, r=1, s=1, n=2)
cmds.parent(grp, orientLocatorsGrp)
orientLocators.append(grp)
#skin joints constraint to curve joints
for i in range(len(curveJoints)):
cmds.pointConstraint(curveJoints[i], skinJoints[i])
#create controls
cDwn = cmds.circle(o=1, nr=(0, 1, 0), r=3, s=6, ch=0, n='SpineControl_Dwn')
cmds.xform(cDwn, t=curvePos[0])
cUp = cmds.circle(o=1, nr=(0, 1, 0), r=3, s=6, ch=0, n='SpineControl_Up')
cmds.xform(cUp, t=curvePos[-2])
cMid = cmds.circle(o=1, nr=(0, 0, 1), r=1, s=6, ch=0, n='SpineControl_Center')
cmds.xform(cMid, t=curvePos[0])
cmds.xform(cMid, r=1, t=[0,(curvePos[0][1]-curvePos[-2][1])*-0.5,-4])
cmds.xform(cMid, ws=1, piv=curvePos[0])
for c in cDwn, cUp, cMid:
cmds.setAttr(c[0]+'.overrideEnabled', 1)
cmds.setAttr(c[0]+'.overrideColor', 17)
cmds.setAttr(c[0]+'.rotateOrder', 1)
cmds.parent(controlJoints[0], cDwn)
cmds.parent(controlJoints[1], cUp)
cmds.parent(cDwn, cUp, cMid)
cmds.makeIdentity(cDwn, apply=True, t=1, r=1, s=1, n=2)
cmds.makeIdentity(cUp, apply=True, t=1, r=1, s=1, n=2)
cmds.makeIdentity(cMid, apply=True, t=1, r=1, s=1, n=2)
#spline solver
hahdle = cmds.ikHandle(sol='ikSplineSolver', sj=curveJoints[0], ee=curveJoints[-1], c=spineCurve, ccv=0, pcv=0)
#skin curve
cmds.skinCluster(controlJoints[0], controlJoints[1], spineCurve ,tsb=True, mi=5, dr=4, bm=0, sm=0)
#PlusMinusAverage sutup
pmaName = 'SpinMPA_'
pmaGrp = []
for i in range(5):
pma = cmds.createNode('plusMinusAverage', n=pmaName+str(i))
pmaGrp.append(pma)
#connects
cmds.setAttr(pmaGrp[0]+'.operation', 1)
cmds.connectAttr(cDwn[0]+'.rotateY', pmaGrp[0]+'.input1D[0]', f=1)
cmds.connectAttr(cMid[0]+'.rotateY', pmaGrp[0]+'.input1D[1]', f=1)
cmds.connectAttr(pmaGrp[0]+'.output1D', orientLocators[0]+'.rotateY', f=1)
cmds.setAttr(pmaGrp[4]+'.operation', 1)
cmds.connectAttr(cUp[0]+'.rotateY', pmaGrp[4]+'.input1D[0]', f=1)
cmds.connectAttr(cMid[0]+'.rotateY', pmaGrp[4]+'.input1D[1]', f=1)
cmds.connectAttr(pmaGrp[4]+'.output1D', orientLocators[4]+'.rotateY', f=1)
cmds.setAttr(pmaGrp[2]+'.operation', 3)
cmds.connectAttr(pmaGrp[0]+'.output1D', pmaGrp[2]+'.input1D[0]', f=1)
cmds.connectAttr(pmaGrp[4]+'.output1D', pmaGrp[2]+'.input1D[1]', f=1)
cmds.connectAttr(pmaGrp[2]+'.output1D', orientLocators[2]+'.rotateY', f=1)
cmds.setAttr(pmaGrp[1]+'.operation', 3)
cmds.connectAttr(pmaGrp[0]+'.output1D', pmaGrp[1]+'.input1D[0]', f=1)
cmds.connectAttr(pmaGrp[2]+'.output1D', pmaGrp[1]+'.input1D[1]', f=1)
cmds.connectAttr(pmaGrp[1]+'.output1D', orientLocators[1]+'.rotateY', f=1)
cmds.setAttr(pmaGrp[3]+'.operation', 3)
cmds.connectAttr(pmaGrp[4]+'.output1D', pmaGrp[3]+'.input1D[0]', f=1)
cmds.connectAttr(pmaGrp[2]+'.output1D', pmaGrp[3]+'.input1D[1]', f=1)
cmds.connectAttr(pmaGrp[3]+'.output1D', orientLocators[3]+'.rotateY', f=1)
#aim constraints
for i, j in enumerate(skinJoints[:-1]):
cmds.aimConstraint(locators[i], j,
offset=[0,0,0],
weight=1,
aimVector=[0,0,1],
upVector=[0,1,0],
worldUpType="object",
worldUpObject=skinJoints[i+1])
#buildStructure
cmds.setAttr(orientLocatorsGrp+'.visibility', 0)
RIG = cmds.createNode('transform', n='spineRig')
jointsGrp = cmds.createNode('transform', n='jointsGrp')
controlsGrp = cmds.createNode('transform', n='controlGrp')
setupGrp = cmds.createNode('transform', n='setupGrp')
cmds.parent(curvJointsGrp, skinJointsGrp, jointsGrp)
cmds.parent(cMid, controlsGrp)
cmds.parent(spineCurve, orientLocatorsGrp, hahdle[0], setupGrp)
cmds.parent(jointsGrp,controlsGrp,setupGrp, RIG)
cmds.select(cl=1)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment