Maya中如何将选中对象属性值存为变量并解决取值报错
问题描述
我想要编写一段代码,实现将后续关键帧的属性值设置为“初始值+1”,例如第1帧的值为10时,后续帧的值设为11。为此我需要获取对象各属性的值并存储到变量中,但在使用getAttr命令时遇到了问题。我尝试用cmds.ls命令获取选中对象的名称,但Maya提示场景中不存在以该变量名命名的对象。
我的当前代码如下:
import maya.cmds as cmds objectnameplaceholder = cmds.ls(sl=True) obj_TX = cmds.getAttr("objectnameplaceholder.translateX") obj_TY = cmds.getAttr("objectnameplaceholder.translateY") obj_TZ = cmds.getAttr("objectnameplaceholder.translateZ") obj_RX = cmds.getAttr("objectnameplaceholder.rotateX") obj_RY = cmds.getAttr("objectnameplaceholder.rotateY") obj_RZ = cmds.getAttr("objectnameplaceholder.rotateZ") print(objectnameplaceholder)
我选中的对象名称为pSphere1,打印objectnameplaceholder时输出pSphere1,但运行代码时报错:“No object matches name: objectnameplaceholder.translateX”。我确定是一个简单错误导致的,但始终无法找出问题所在。
解决方案
- 核心错误:你把变量名
objectnameplaceholder直接写在了字符串里,Maya会把"objectnameplaceholder.translateX"当成字面量的对象名称去查找,而不是读取变量里存储的pSphere1。 - 额外注意:
cmds.ls(sl=True)返回的是选中对象的列表,即使只选了一个对象,它也是长度为1的列表,所以需要取列表的第一个元素才能得到对象名称字符串。
修正后的代码示例(包含关键帧设置逻辑):
import maya.cmds as cmds # 获取选中对象,取第一个元素 selected_objs = cmds.ls(sl=True) if not selected_objs: print("请先选中一个对象") else: obj_name = selected_objs[0] # 获取当前帧的属性初始值 tx_val = cmds.getAttr(f"{obj_name}.translateX") ty_val = cmds.getAttr(f"{obj_name}.translateY") tz_val = cmds.getAttr(f"{obj_name}.translateZ") rx_val = cmds.getAttr(f"{obj_name}.rotateX") ry_val = cmds.getAttr(f"{obj_name}.rotateY") rz_val = cmds.getAttr(f"{obj_name}.rotateZ") # 假设要在第2帧设置初始值+1的关键帧 target_frame = 2 cmds.setKeyframe(obj_name, attribute="translateX", time=target_frame, value=tx_val + 1) cmds.setKeyframe(obj_name, attribute="translateY", time=target_frame, value=ty_val + 1) cmds.setKeyframe(obj_name, attribute="translateZ", time=target_frame, value=tz_val + 1) cmds.setKeyframe(obj_name, attribute="rotateX", time=target_frame, value=rx_val + 1) cmds.setKeyframe(obj_name, attribute="rotateY", time=target_frame, value=ry_val + 1) cmds.setKeyframe(obj_name, attribute="rotateZ", time=target_frame, value=rz_val + 1) print(f"已为{obj_name}在第{target_frame}帧设置属性值为初始值+1")
代码说明
- 先判断是否有选中对象,避免空列表报错
- 使用f-string(Python 3.6+支持)将变量
obj_name和属性名拼接成正确的属性路径,比如pSphere1.translateX - 增加了关键帧设置的逻辑,实现你需要的“后续帧值为初始值+1”的需求
- 如果需要批量处理多个帧,可以用循环遍历帧列表
内容的提问来源于stack exchange,提问作者PigeonAce
相关产品推荐
相关产品推荐

