Maya Python中如何解决For Loop导致桌腿定位默认到同一对象的问题
问题解决:Maya Python程序化桌子桌腿定位错误
问题根源
position_legs函数逻辑完全错误:你给单个桌腿连续执行四次xform平移,每一次都会覆盖上一次的位置,所以不管创建多少桌腿,最后都会停在最后一组坐标[2.0,2.5,-4.0]。list_legs未收集桌腿对象:循环里创建了桌腿,但没把生成的xform_obj_legs添加到list_legs里,后面执行cmds.parent([list_legs[0], ...], 'legs_grp')时会直接报错索引越界。
修正方案
重新设计position_legs的逻辑,让它根据桌腿的序号对应到四个角落的坐标,同时修复list_legs的收集问题:
完整修正代码
import maya.cmds as cmds class Table(object): def __init__(self): self.height = 0.5 self.width = 5.0 self.depth = 9.0 self.legs = 4 self.leg_height = 5.0 self.leg_width = 0.5 self.leg_depth = 0.5 # 预定义四个桌腿的角落坐标(对应桌面的四个角下方) self.leg_positions = [ [-2.0, 2.5, -4.0], [2.0, 2.5, 4.0], [-2.0, 2.5, 4.0], [2.0, 2.5, -4.0] ] def make_top(self): xform, shape = cmds.polyCube(height=self.height, width=self.width, depth=self.depth) # table-top return xform def make_legs(self): xform, shape = cmds.polyCube(height=self.leg_height, width=self.leg_width, depth=self.leg_depth) return xform def position_top(self, obj_top): cmds.xform(obj_top, translation=[0,5.0,0]) def position_legs(self, object_legs, position): # 只执行一次对应位置的平移 cmds.xform(object_legs, translation=position) def build(self): # Table Top xform_obj = self.make_top() # make the top self.position_top(xform_obj) # position the top # Table legs list_legs = [] for leg_num in range(self.legs): xform_obj_legs = self.make_legs() # 把创建的桌腿加入列表 list_legs.append(xform_obj_legs) # 根据序号获取对应坐标,传入position_legs self.position_legs(xform_obj_legs, self.leg_positions[leg_num]) cmds.group(name='table_top', empty=True) cmds.group(name='legs_grp', empty=True) cmds.parent([xform_obj], 'table_top') # 直接传入整个list_legs即可,不用手动写四个索引 cmds.parent(list_legs, 'legs_grp') cmds.group(name='Table', empty=True) cmds.parent(['legs_grp', 'table_top'], 'Table')
关键修改点
- 新增
self.leg_positions列表,存储四个桌腿的目标坐标,清晰对应每个角落 - 重构
position_legs函数,改为接收单个桌腿对象和目标坐标,只执行一次平移操作 - 循环中添加
list_legs.append(xform_obj_legs),把每个创建的桌腿存入列表 - 父化桌腿时直接传入整个
list_legs,避免手动索引出错
内容的提问来源于stack exchange,提问作者DummyWComputer
相关产品推荐
相关产品推荐

