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].