gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 04:59:11 26 4
gpt4 key购买 nike

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

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

之类的错误

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

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 )

最佳答案

这是您的代码片段,经过一些修改和更正以使其正常工作。

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

在前两个 cmds.select() 调用中,我添加了 add=True 标志。如果没有该标志,cmds.select() 将默认假定replace=True。这就是为什么您的根关节在此调用后被忽略的原因。

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

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

loc_to_rename = cmds.duplicate( returnRootsOnly=True , inputConnections=True )[0]

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

此外,捕获 cmds.duplicate 和 cmds.rename 等命令的返回结果始终很重要,因为它们分配的名称可能并不总是符合预期,因为 Maya 会在末尾附加一个数字或递增数字如果名称与场景中的其他内容发生冲突,则使用新名称。

我希望这有帮助!

关于python - 关节上的重命名和定位器定位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26667038/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com