Maya Python:将曲线CV与链中的关节位置匹配?

Maya Python:将曲线CV与链中的关节位置匹配?,python,maya,Python,Maya,因此,我发现了一种很好的方法,可以找到一个好的位置,为极向量放置肘部ik控件。其思想是创建一条三点cv曲线,分别将cv捕捉到肩部、肘部和腕部,选择肘部cv,然后将移动工具的轴方向切换为法线,并将其移动到肘部后面。相反,我选择了一个脚本来完成这一切 我最初的行动计划是使用一组变量获取所选链中任意三个关节的平移,然后将链中每个关节的平移复制到poleVecCRV的CV,并将关节的每个部分捕捉到各自的位置,然后将中心CV移动到关节链后面 相反,我得到的错误是“读取数据元素编号1时出错:[(5.5520

因此,我发现了一种很好的方法,可以找到一个好的位置,为极向量放置肘部ik控件。其思想是创建一条三点cv曲线,分别将cv捕捉到肩部、肘部和腕部,选择肘部cv,然后将移动工具的轴方向切换为法线,并将其移动到肘部后面。相反,我选择了一个脚本来完成这一切

我最初的行动计划是使用一组变量获取所选链中任意三个关节的平移,然后将链中每个关节的平移复制到poleVecCRV的CV,并将关节的每个部分捕捉到各自的位置,然后将中心CV移动到关节链后面

相反,我得到的错误是“读取数据元素编号1时出错:[(5.552068394583248,-3.4185435904248E-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)
脚本应将曲线的三个CV捕捉到任意选定关节链的三个,然后将中心CV沿法线轴方向向后移动


谢谢

让我们打印一个translate值
cmds.getAttr(child[0]+'.translate')

[(-1.46044102058298,0.0,11.4809939390263558)]

注意,它是列表中的一个元组?因此,您需要像这样获取结果:
sldrJntPos=cmds.getAttr(child[0]+'.translate')[0]

但这仍然不能像您尝试使用
cmds.move时那样工作。您不能只按原样传递列表,而是逐个传递值:
cmds.move(sldrJntPos[0]、sldrJntPos[1]、sldrJntPos[2]、poleVecCRV+'.cv[0]')

但总体而言,它所做的工作仍然存在一个问题,因为一旦完成,您将注意到没有任何CV与关节对齐(除非它们是“父对象”或“世界原点”)。现在,您正在获取对象的局部平移,但您需要它们的世界平移。相反,您可以使用
cmds.xform(肩部,q=True,ws=True,t=True)
返回世界坐标中的位置


最后一个问题是
moveVertexAlongDirection
。现在您正在使用
n=[5,0,0]
,但这会导致它出错。该参数列表的长度应该与正在移动的CV数匹配,在本例中为一:
n=[5]

我很困惑。为什么不将变换与肘关节匹配,然后使用“对象轴”中的“移动”工具将控件移回?它完美地为极向量绘制了直线,现在你不需要创建曲线了……这是个好问题,现在我觉得自己很笨。特别是因为我刚刚测试了与上述方法相同的效果。尽管如此,了解如何将CV捕捉到特定对象可能在将来派上用场。