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

2024-05-31 23:46:15 发布

您现在位置:Python中文网/ 问答频道 /正文

因此,我发现了一种很好的方法,可以找到一个好的位置,为极向量放置肘部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沿法线轴方向向后移动

多谢各位


Tags: childtruemoverootwindowcvtranslatecurve
1条回答
网友
1楼 · 发布于 2024-05-31 23:46:15

让我们打印一个translate值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]')

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

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

相关问题 更多 >