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

如何为Maya Python立方体生成器UI添加平移功能

Maya布局工具坐标不生效问题修复

问题原因

  • 你已经正确读取了location输入框的X/Y/Z坐标值,但没有把这组值应用到生成的模型上:cmds.polyCube()没有指定生成位置的参数,默认会把模型生成在世界坐标原点,你读取的三个坐标变量后续没有被任何变换命令调用。
  • 现有代码里「创建树」按钮错误绑定了建筑创建方法,点击后只会读取建筑分组的输入参数,完全不会用到树分组的名称、尺寸、位置设置。
  • 没有做名称为空的容错,名称输入框留空时执行创建命令会直接报错。

修复逻辑

  • 生成多边形基本体后,接住命令返回的变换节点对象,调用cmds.move(坐标X, 坐标Y, 坐标Z, 物体名)把模型移动到输入的坐标位置。
  • 给树单独写创建逻辑,对应读取树分组下的所有输入参数,同样执行创建+移动操作。
  • 增加空名称判断,用户未输入名称时自动使用默认名,避免命令报错。

修正后完整代码

import maya.cmds as cmds
import random 

# 生成地面
cmds.polyPlane(width=100, height = 100, name = 'Ground')

class DL_Window (object):
    def __init__(self):
        self.window = 'DL_Window'
        self.title = "City Layout Creator"
        self.size = (400,400)
        # 关闭已存在的旧窗口
        if cmds.window(self.window, exists = True):
            cmds.deleteUI (self.window, window= True)
        # 创建新窗口
        self.window = cmds.window (self.window, title=self.title, widthHeight=self.size)
        
        cmds.columnLayout(adjustableColumn = True)
        
        # 建筑创建模块
        cmds.text(self.title)
        cmds.separator(height = 20, width = 100)
        
        self.cubeName = cmds.textFieldGrp( label = 'Building Name:')
        self.cubeSize = cmds.floatFieldGrp ( numberOfFields = 3, label = 'size:', value1=1, value2=1,value3=1 ) 
        self.cubeLocation = cmds.floatFieldGrp (numberOfFields = 3, label = 'location:', value1=1,value2=1,value3=1)
        self.cubeSubdivs =cmds.intSliderGrp(field=True, label = 'subdivs', minValue=1,maxValue=20, value=1)
        self.buildingCreateBtn = cmds.button(label= 'Create Building', command=self.createBuilding)
        
        # 树木创建模块
        cmds.separator(height = 20, width = 100) 
        cmds.text("Tree Generator")
        cmds.separator(height = 20, width = 100) 
        
        self.treeName = cmds.textFieldGrp( label = 'Tree Name:')
        self.treeSize = cmds.floatFieldGrp ( numberOfFields = 3, label = 'size:', value1=1, value2=1,value3=1 ) 
        self.treeLocation = cmds.floatFieldGrp (numberOfFields = 3, label = 'location:', value1=0,value2=0,value3=0)
        self.treeSubdivs =cmds.intSliderGrp(field=True, label = 'subdivs', minValue=1,maxValue=20, value=1)
        self.treeCreateBtn = cmds.button(label= 'Create Tree', command=self.createTree)           
        
        cmds.showWindow()
        
    def createBuilding (self, *args):
        # 读取建筑参数
        name = cmds.textFieldGrp(self.cubeName, query = True, text=True)
        # 名称为空时用默认名
        if not name:
            name = "Building"
        
        width = cmds.floatFieldGrp (self.cubeSize, query=True, value1=True)
        height = cmds.floatFieldGrp (self.cubeSize, query=True, value2=True)
        depth = cmds.floatFieldGrp (self.cubeSize, query=True, value3=True)
        
        posX = cmds.floatFieldGrp (self.cubeLocation, query = True, value1=True)
        posY = cmds.floatFieldGrp (self.cubeLocation, query = True, value2=True)
        posZ = cmds.floatFieldGrp (self.cubeLocation, query = True, value3=True)
        
        subdivs = cmds.intSliderGrp (self.cubeSubdivs, query=True, value=True)
        
        # 创建立方体,取返回值第一个元素为变换节点
        building = cmds.polyCube(
            name = name, 
            width = width, 
            height = height, 
            depth = depth, 
            subdivisionsWidth = subdivs,
            subdivisionsHeight = subdivs,
            subdivisionsDepth = subdivs
        )[0]
        # 应用坐标位移
        cmds.move(posX, posY, posZ, building)

    def createTree (self, *args):
        # 读取树木参数
        name = cmds.textFieldGrp(self.treeName, query = True, text=True)
        if not name:
            name = "Tree"
        
        width = cmds.floatFieldGrp (self.treeSize, query=True, value1=True)
        height = cmds.floatFieldGrp (self.treeSize, query=True, value2=True)
        depth = cmds.floatFieldGrp (self.treeSize, query=True, value3=True)
        
        posX = cmds.floatFieldGrp (self.treeLocation, query = True, value1=True)
        posY = cmds.floatFieldGrp (self.treeLocation, query = True, value2=True)
        posZ = cmds.floatFieldGrp (self.treeLocation, query = True, value3=True)
        
        subdivs = cmds.intSliderGrp (self.treeSubdivs, query=True, value=True)
        
        # 这里暂时用立方体代替树,后续做资产引用时替换成引用逻辑即可
        tree = cmds.polyCube(
            name = name, 
            width = width, 
            height = height, 
            depth = depth, 
            subdivisionsWidth = subdivs,
            subdivisionsHeight = subdivs,
            subdivisionsDepth = subdivs
        )[0]
        # 应用坐标位移
        cmds.move(posX, posY, posZ, tree)
        
# 启动窗口
myWindow = DL_Window()

后续扩展提示

后续加资产引用功能时,只需要把createTree/createBuilding里的cmds.polyCube()替换成cmds.file(引用路径, reference=True, namespace=名称)的引用逻辑,生成引用节点后同样调用cmds.move()应用坐标即可,参数读取部分不需要改动。


内容的提问来源于stack exchange,提问作者Daniel LeBreton

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 00:57:25