python对maya绑定的作用_maya 腿部绑定python源码

本文档展示了如何使用Python在Maya中创建腿部绑定的详细过程,包括关节创建、命名、骨骼校轴、点约束、父级约束、旋转中心调整、控制器创建等步骤。通过提供的源码,可以理解并实现自定义的腿部绑定解决方案。
摘要由CSDN通过智能技术生成

#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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值