如何为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
相关产品推荐
相关产品推荐

