关节上的重命名和定位器定位

2024-04-29 01:49:48 发布

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

我试图让这个重命名工作,因为定位器是复制和移动到关节的位置。 例如,如果我有一个大腿关节、膝盖关节、脚踝关节,则创建的定位器将命名为loc_nghigh_nt、loc_膝盖_jnt等

但是它对我不起作用,因为我收到了诸如# ValueError: No object matches name: loc_0 #之类的错误

不用说,定位器可以被创建,但它不在关节的位置。 另外,我可以问一下是否可以为all关节创建定位器?目前,它只为大腿和膝盖而不是脚踝创建

import maya.cmds as cmds

def createLoc():

    cmds.select( cmds.listRelatives( type = 'joint', fullPath = True, allDescendents = True ) )
    cmds.select( cmds.listRelatives( parent = True, fullPath = True ) )
    sel = cmds.ls ( selection = True, type = 'joint' )
    if not sel :
        cmds.warning( "Please select a joint / No joints in selection " )
        return

    locGrp = cmds.group(n="loc_Grp_#", em=True)
    cmds.addAttr ( locGrp, attributeType = 'double' , longName = 'locScale' , defaultValue = 1.0 , keyable = 1 )
    masterLoc = cmds.spaceLocator(n="loc_0")[0]
    cmds.parent( masterLoc, locGrp )

    for attr in ["scaleZ", "scaleY", "scaleX"]:
        cmds.connectAttr ( locGrp + ".locScale" , "%s.%s" % ( masterLoc, attr ) )

    for jnt in sel:
        print jnt
        coords = cmds.xform ( jnt, query = True, worldSpace = True, pivots = True )[0:3]
        cmds.select( masterLoc, replace = True )
        cmds.duplicate( returnRootsOnly = True , inputConnections = True )

        # This is where the errors starts
        #cmds.rename(str(masterLoc), ("loc_" + str(sel)))

        cmds.move( coords[0], coords[1], coords[2], rotatePivotRelative = True )

Tags: intruecoordsselectloccmds定位器关节
1条回答
网友
1楼 · 发布于 2024-04-29 01:49:48

下面是您的代码片段,其中包含一些修改和更正以使其正常工作。在

import maya.cmds as cmds

def createLoc():

    cmds.select( cmds.listRelatives( type='joint', fullPath=True, allDescendents=True ), add=True )
    cmds.select( cmds.listRelatives( parent=True, fullPath=True ), add=True )
    sel = cmds.ls ( selection = True, type = 'joint' )
    if not sel :
        cmds.warning( "Please select a joint / No joints in selection " )
        return

    locGrp = cmds.group(n="loc_Grp_#", em=True)
    cmds.addAttr ( locGrp, attributeType='double' , longName='locScale' , defaultValue=1.0 , keyable=1 )
    masterLoc = cmds.spaceLocator(n="loc_0")[0]
    cmds.parent( masterLoc, locGrp )

    for attr in ["scaleZ", "scaleY", "scaleX"]:
        cmds.connectAttr ( locGrp + ".locScale" , "%s.%s" % ( masterLoc, attr ) )

    is_root_loop = True
    loc_to_rename = masterLoc

    for jnt in sel:
        print jnt        
        coords = cmds.xform ( jnt, query=True, worldSpace=True, pivots=True )[0:3]
        cmds.select( masterLoc, replace=True )        

        if not is_root_loop:
            loc_to_rename = cmds.duplicate( returnRootsOnly=True , inputConnections=True )[0]

        # No more errors!
        renamed_loc = cmds.rename(str(loc_to_rename), ("loc_" + str(jnt)))
        if is_root_loop:
            masterLoc = renamed_loc

        cmds.move( coords[0], coords[1], coords[2], rotatePivotRelative=True )
        is_root_loop = False       

在前两个命令。选择()调用,我添加了add=True标志。没有那面旗帜,命令。选择()默认情况下将假定replace=True。这就是为什么你的根关节被忽略了。在

在for循环中,masterLoc被复制了N次,其中N是关节的数目,因此产生了N+1个定位器(包括masterLoc)。所以我添加了is_root_loop标志来检查循环是否是第一次运行。在这个运行过程中,我们操纵masterLoc本身(不复制它),重命名masterLoc并存储名称。在这个循环的第二次迭代中,我们使用这个masterLoc来复制和重命名复制的定位器,正如您之前所写的那样。在

我做的另一个更改是存储重复定位器的名称

^{pr2}$

用这个来重命名。这就是您得到错误的地方,因为您试图在每次迭代中重命名masterLoc。在

另外,捕捉命令的返回结果总是很重要的,比如命令。重复以及命令.重命名,因为它们指定的名称可能并不总是如预期的那样,因为如果名称与场景中的其他内容发生冲突,Maya将在新名称的末尾附加一个数字或增加该数字。在

我希望这有帮助!在

相关问题 更多 >