#coding:UTF-8
# ************************************************************************************************************
# Title: lr_leg_rig.py
# Author: li ran
# Created: 2017 03 01
# Last Update: 2017 03 01
# version: 1.0
# ************************************************************************************************************
import maya.cmds as cmds
import pymel.core as pm
import maya.mel as mel
def cre_joint(n,LR,final_int_sel):
joint_sel = []
jointCoo = [[2.0, 16.000000000000004, 0.0], [2.0000000000000027, 9.000000000000004, 1.0000000000000004],\
[2.000000000000005, 1.0000000000000018, -2.220446049250313e-16], [2.0000000000000138, 1.1102230246251565e-15, 2.0000000000000018], \
[2.0000000000000133, 9.853229343548264e-16, 4.0000000000000036], [3.0000000000000036, 1.64625257870199e-15, 2.2000000000000037],\
[1.0000000000000036, 7.494005416219807e-16, 2.200000000000001], [2.000000000000027, 2.1094237467877974e-15, -1.0000000000000016]]
jointName=['leg','knee','ankle','ball','toe','outside','inside','heel']
#创建腿部基础骨骼并命名
for i in range(len(jointCoo)-3):
cooInt = cmds.joint(p=jointCoo[i])
joint_sel.append(cooInt)
for j in range(len(jointName)-3):
finalInt = cmds.rename(joint_sel[j],'%s_%s_%s_%s'%(n,LR,jointName[j],'skInt'))
final_int_sel.append(finalInt)
#剩下的辅助定点的三个骨骼
for k in range(5,len(jointCoo)):
cooInt = cmds.joint(p=jointCoo[k])
joint_sel.append(cooInt)
for l in range(5,len(jointName)):
finalInt = cmds.rename(joint_sel[l],'%s_%s_%s_%s'%(n,LR,jointName[l],'skInt'))
final_int_sel.append(finalInt)
cmds.parent(final_int_sel[5],final_int_sel[6],final_int_sel[3])
cmds.parent(final_int_sel[7],final_int_sel[2])
#骨骼校轴
cmds.select(final_int_sel[0])
cmds.joint(e=True, oj='xyz', secondaryAxisOrient='zup', ch=True, zso=True)
cmds.setAttr(final_int_sel[4]+'.jointOrient',0,0,0)
cmds.select(cl=True)
return final_int_sel
def snap_joint(objs,TR):
#创建loctor 拾取位置
if TR==0:
tr=cmds.xform(objs,q=True,ws=True,t=True)
loc=cmds.spaceLocator(n=objs.replace('_ikInt','_loc'))
cmds.xform(loc,t=tr,ws=True)
return loc
#创建loctor 拾取位置旋转
if TR==1:
tr=cmds.xform(objs,q=True,ws=True,t=True)
loc=cmds.spaceLocator(n=objs.replace('_ikInt','_loc'))
cmds.xform(loc,t=tr,ws=True)
oriCt = cmds.orientConstraint(objs,loc,mo=False)
cmds.delete(oriCt[0])
return loc
def dup_loc(first,second,n,LR,name):
tr=cmds.xform(first,q=True,t=True,ws=True)
cmds.select(second)
loc=cmds.duplicate(n='%s_%s_%s_%s'%(n,LR,name,'loc'))[0]
cmds.xform(loc,t=tr,ws=1)
return loc
def real_snap(first,second,method):
#点约束
if method==0:
point= cmds.pointConstraint(first,second,mo=False)
cmds.delete(point[0])
#父子约束
if method==1:
parent = cmds.parentConstraint(first,second,mo=False)
cmds.delete(parent[0])
#改变物体旋转中心
if method==2:
pos = cmds.xform(first,q=True,t=True,ws=True)
cmds.xform(second,piv=pos,ws=True)
def attr(objs,method):
attr = ['.tx','.ty','.tz','.rx','.ry','.rz','.sx', '.sy', '.sz','.visibility']
#获取tx
if method==0:
tx=cmds.getAttr(objs+'.translateX')
return tx
#锁定隐藏 缩放、显示
if method==1:
for i in range(6,10):
cmds.setAttr(objs + attr[i], lock=True,keyable=False)
#锁定隐藏 旋转 缩放 显示
if method ==2:
for j in range(3,10):
cmds.setAttr(objs + attr[j], lock=True,keyable=False)
#隐藏该项
if method ==3:
for k in range(9,10):
cmds.setAttr(objs + attr[k],0)
#返回查询到该项的translation
if method ==4:
t=cmds.xform(objs,q=1,t=1,ws=1)
return t
if method==5:
for i in range(0,10):
cmds.setAttr(objs + attr[i], lock=True,keyable=False)
def add_attr(objs,name,method):
if method==0:
cmds.addAttr(objs,ln=name)
#tilt
if method==1:
cmds.addAttr(objs,ln=name,min=-90,max=90)
#stretch
if method==2:
cmds.addAttr(objs,ln=name,min=0,max=1,dv=1)
#lenght
if method==3:
cmds.addAttr(objs,ln=str(name),dv=1)
if method==4:
cmds.addAttr(objs,ln=name,min=0,max=1)
if method==5:
cmds.addAttr(objs,ln=name,min=0)
cmds.setAttr(objs+'.'+str(name), e=True, keyable=1)
#物体打组
def add_grp(objs,n,LR,name):
grp=cmds.group(objs,n='%s_%s_%s_%s'%(n,LR,name,'grp'))
return grp
#颜色设置
def color_set(objs,method):
if method=='red':
cmds.setAttr( objs+'.overrideEnabled', 1)
cmds.setAttr( objs + '.overrideColor', 13)
if method=='blue':
cmds.setAttr( objs+ '.overrideEnabled', 1)
cmds.setAttr( objs+ '.overrideColor', 6)
#fk控制器
def fk_con():
cir=[]
cir_grp=[]
sel=cmds.ls(sl=True)
for i in range(len(sel)):
cre_cir=cmds.circle(n=sel[i]+'_fkCon',nr=(1,0,0))
mel.eval('DeleteHistory')
attr(cre_cir[0],1)
cir.append(cre_cir[0])
grp=cmds.group(cre_cir[0],n=sel[i]+'_fkCon_grp')
real_snap(sel[i],grp,1)
cir_grp.append(grp)
cmds.parentConstraint(cre_cir[0],sel[i],mo=True)
#层级整理
for j in range(len(cir)):
k=j+1
if k
cmds.parent(cir_grp[k],cir[j])
return cir_grp[0]
#极向量控制器的位置
def place_correct_pole_locator(joint1, joint2, joint3):
joint_start_position = pm.xform(joint1, q = 1, ws = 1, rp = 1)
joint_mid_position = pm.xform(joint2, q = 1, ws = 1, rp = 1)
joint_end_position = pm.xform(joint3, q = 1, ws = 1, rp = 1)
#坐标转化向量
joint_start_vector = pm.dt.Vector(joint_start_position)
joint_mid_vector = pm.dt.Vector(joint_mid_position)
joint_end_vector = pm.dt.Vector(joint_end_position)
#生成两边向量
start_end_vector = joint_end_vector - joint_start_vector
start_mid_vector = joint_mid_vector - joint_start_vector
#向量点乘得到长边模,和短边在长边阴影的乘积。 获得该阴影的长度。 获得长边的方向向量。
dotP = start_mid_vector.dot(start_end_vector)
proj = float(dotP)/float(start_end_vector.length())
start_end_normal = start_end_vector.normal()
#获得阴影向量。求出对边的向量。对边整理为,长边除以对边得出一个倍数,再乘以一个参数。
proj_vector = start_end_normal*proj
arrow_vector = start_mid_vector - proj_vector
arrow_vector *= 0.6 *start_end_vector.length()/ arrow_vector.length()
final_vector = arrow_vector + joint_mid_vector #...
locator = pm.spaceLocator()
locator.t.set(final_vector)
def import_joint(arg):
n= cmds.textField('name', q=True, tx=True)
LR='L'
final_int_sel=[]
final_int_sel=cre_joint(n,LR,final_int_sel)
nodeL = cmds.createNode('unknown')
cmds.addAttr(ln="selObjects" , at='message' , multi=1, im=0)
for intL in final_int_sel:
cmds.connectAttr(intL+'.message', nodeL+".selObjects", na=True)
def auto_joint():
Num = cmds.checkBox('checkBox_test', q=True, v=True)
l_leg_int = cmds.li