You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Maya Python中如何解决For Loop导致桌腿定位默认到同一对象的问题

问题解决:Maya Python程序化桌子桌腿定位错误

问题根源

  1. position_legs函数逻辑完全错误:你给单个桌腿连续执行四次xform平移,每一次都会覆盖上一次的位置,所以不管创建多少桌腿,最后都会停在最后一组坐标[2.0,2.5,-4.0]。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 23:06:24