def matchPoleVectorControl(jointChain, pv=None, doSnap=True):
'''
Position a pole vector based on a 3-joint chain
'''
def distanceBetween(a,b):
difference = [x-y for x,y in zip(a,b)]
return math.sqrt(sum([x**2 for x in difference]))
p1 = mc.xform(jointChain[0], query=True, rotatePivot=True, worldSpace=True)
p2 = mc.xform(jointChain[1], query=True, rotatePivot=True, worldSpace=True)
p3 = mc.xform(jointChain[2], query=True, rotatePivot=True, worldSpace=True)
mag1 = distanceBetween(p2,p1)
mag2 = distanceBetween(p3,p2)
#these are all temporary nodes
loc = mc.spaceLocator(name='TEMP#')[0]
mc.pointConstraint(jointChain[0], loc, weight=mag2)
mc.pointConstraint(jointChain[2], loc, weight=mag1)
mc.aimConstraint(jointChain[1], loc, aimVector=(1,0,0), upVector=(0,1,0), worldUpType='object', worldUpObject=jointChain[0])
pCenter = mc.xform(loc, query=True, rotatePivot=True, worldSpace=True)
pPV = mc.xform(pv, query=True, rotatePivot=True, worldSpace=True)
pvDist = distanceBetween(pPV,pCenter)
loc2 = mc.spaceLocator(name='TEMP#')[0]
loc2 = mc.parent(loc2, loc)[0]
mc.setAttr(loc2+'.translate', (pvDist),0,0)
if doSnap:
snap(pv, loc2)
mc.delete(loc)
else:
#for matching a range
return loc, loc2
评论列表
文章目录