Maya Python:将曲线 CV 匹配到链中的关节位置?
Maya Python: Match Curve CVs to Joint Positions in chain?
所以我发现了一种绝妙的方法来找到放置极向量的肘部 ik 控件的好位置。这个想法是你创建一个三点 cv 曲线,将 cvs 分别捕捉到肩膀、肘部和手腕,select 肘部 cv,然后将移动工具的轴方向切换为正常并将其移动到肘部后面。相反,我选择了一个脚本来为我做这一切。
我最初的行动计划是使用一组变量获取链中任意三个关节的翻译 select,然后它将链中每个关节的翻译复制到 cvs poleVecCRV 并将关节的每个部分捕捉到各自的位置,然后将中心 CV 移到关节链后面。
相反,我收到错误消息“读取数据元素编号 1 时出错:[(5.552068394583248,-3.418543359042418e-16,-4.440892098500626e-16)]”
一如既往,感谢您的帮助:
import maya.cmds as cmds
if cmds.window("buildWin", exists =True):
cmds.deleteUI("buildWin", window = True)
myWindow = cmds.window("buildWin",t='DS_pvFinder',rtf=1,w=100, h=100, toolbox=True)
column = cmds.columnLayout(adj=True)
def gui(*args):
cmds.columnLayout()
cmds.button(label='build placement curve',c=matchJNT)
cmds.showWindow(myWindow)
def matchJNT(*args):
root = cmds.ls(sl=True)[0]
child = cmds.listRelatives(root,ad=1,type='joint')
child.append(root)
child.reverse()
limbJnt = child
sldrJntPos = cmds.getAttr(child[0]+'.translate')
elbwJntPos = cmds.getAttr(child[1]+'.translate')
wrstJntPos = cmds.getAttr(child[2]+'.translate')
poleVecCRV = cmds.curve(d=1,p=[(0,1,0),(0,2,0),(0,3,0)])
#move placement curve for ik control
cmds.move(poleVecCRV+'.cv[0]', sldrJntPos)
cmds.move(poleVecCRV+'.cv[1]', elbwJntPos)
cmds.move(poleVecCRV+'.cv[2]', wrstJntPos)
#move curve behind elblow with normal axis orientation
cmds.moveVertexAlongDirection(poleVecCRV+'.cv[1]',n=[5,0,0])
cmds.setAttr(poleVecCRV + '.dispEP',1)
脚本应将曲线的三个 cvs 捕捉到任何 selected 关节链中的三个,然后将中心一个移回正常轴方向。
谢谢
让我们打印出其中一个翻译值 cmds.getAttr(child[0]+'.translate')
:
[(-1.46044102058298, 0.0, 11.480993930263558)]
注意到它是列表内部 的一个元组?所以你需要像这样获取结果:sldrJntPos = cmds.getAttr(child[0]+'.translate')[0]
.
但这仍然无法像您尝试使用 cmds.move
那样工作。您不能按原样传递列表,而是单独传递值:cmds.move(sldrJntPos[0], sldrJntPos[1], sldrJntPos[2], poleVecCRV+'.cv[0]')
但是仍然它在整体上所做的事情存在问题,因为一旦完成你会注意到 none 的 cvs 与关节对齐(除非它们're parent 是世界起源)。现在你正在获取对象的本地翻译,但你需要他们的世界翻译。相反,您可以使用 cmds.xform(shoulder, q=True, ws=True, t=True)
这将 return 世界坐标中的位置。
最后一期是 moveVertexAlongDirection
。现在您正在使用 n=[5,0,0]
,但这会导致它出错。该参数列表的长度应与您移动的 cvs 数量相匹配,在本例中为一个:n=[5]
.
所以我发现了一种绝妙的方法来找到放置极向量的肘部 ik 控件的好位置。这个想法是你创建一个三点 cv 曲线,将 cvs 分别捕捉到肩膀、肘部和手腕,select 肘部 cv,然后将移动工具的轴方向切换为正常并将其移动到肘部后面。相反,我选择了一个脚本来为我做这一切。
我最初的行动计划是使用一组变量获取链中任意三个关节的翻译 select,然后它将链中每个关节的翻译复制到 cvs poleVecCRV 并将关节的每个部分捕捉到各自的位置,然后将中心 CV 移到关节链后面。
相反,我收到错误消息“读取数据元素编号 1 时出错:[(5.552068394583248,-3.418543359042418e-16,-4.440892098500626e-16)]”
一如既往,感谢您的帮助:
import maya.cmds as cmds
if cmds.window("buildWin", exists =True):
cmds.deleteUI("buildWin", window = True)
myWindow = cmds.window("buildWin",t='DS_pvFinder',rtf=1,w=100, h=100, toolbox=True)
column = cmds.columnLayout(adj=True)
def gui(*args):
cmds.columnLayout()
cmds.button(label='build placement curve',c=matchJNT)
cmds.showWindow(myWindow)
def matchJNT(*args):
root = cmds.ls(sl=True)[0]
child = cmds.listRelatives(root,ad=1,type='joint')
child.append(root)
child.reverse()
limbJnt = child
sldrJntPos = cmds.getAttr(child[0]+'.translate')
elbwJntPos = cmds.getAttr(child[1]+'.translate')
wrstJntPos = cmds.getAttr(child[2]+'.translate')
poleVecCRV = cmds.curve(d=1,p=[(0,1,0),(0,2,0),(0,3,0)])
#move placement curve for ik control
cmds.move(poleVecCRV+'.cv[0]', sldrJntPos)
cmds.move(poleVecCRV+'.cv[1]', elbwJntPos)
cmds.move(poleVecCRV+'.cv[2]', wrstJntPos)
#move curve behind elblow with normal axis orientation
cmds.moveVertexAlongDirection(poleVecCRV+'.cv[1]',n=[5,0,0])
cmds.setAttr(poleVecCRV + '.dispEP',1)
脚本应将曲线的三个 cvs 捕捉到任何 selected 关节链中的三个,然后将中心一个移回正常轴方向。
谢谢
让我们打印出其中一个翻译值 cmds.getAttr(child[0]+'.translate')
:
[(-1.46044102058298, 0.0, 11.480993930263558)]
注意到它是列表内部 的一个元组?所以你需要像这样获取结果:sldrJntPos = cmds.getAttr(child[0]+'.translate')[0]
.
但这仍然无法像您尝试使用 cmds.move
那样工作。您不能按原样传递列表,而是单独传递值:cmds.move(sldrJntPos[0], sldrJntPos[1], sldrJntPos[2], poleVecCRV+'.cv[0]')
但是仍然它在整体上所做的事情存在问题,因为一旦完成你会注意到 none 的 cvs 与关节对齐(除非它们're parent 是世界起源)。现在你正在获取对象的本地翻译,但你需要他们的世界翻译。相反,您可以使用 cmds.xform(shoulder, q=True, ws=True, t=True)
这将 return 世界坐标中的位置。
最后一期是 moveVertexAlongDirection
。现在您正在使用 n=[5,0,0]
,但这会导致它出错。该参数列表的长度应与您移动的 cvs 数量相匹配,在本例中为一个:n=[5]
.