我有此代码:
def block_stacks(num):
stack = cmds.group(empty=True, name='Stacks#')
size = num
for var in range(num):
i = 0
r_rot = random.uniform(0,359)
block = cmds.polyCube(h=0.5, w=0.5, d=0.5, name='block#')
cmds.parent(block, stack)
cmds.move(0, 5.38 + i, 0, 'block*')
cmds.rotate(0, r_rot, 0, 'block*')
rR= random.uniform(0, 1.0)
rG= random.uniform(0, 1.0)
rB= random.uniform(0, 1.0)
cmds.polyColorPerVertex('block*', rgb=[rR,rG,rB], cdo = True)
i+=0.5
block_stacks(5)
在Maya的脚本编辑器中。当我运行它时,随机旋转和随机颜色都可以正常工作,并且该块放置在正确的位置,但是它只会创建1个块而不是5个块(就像我打算的那样)并说
“警告:不能在地下世界中建立组件或对象的父级。”
多次。我完全不知道这意味着什么,而且显然整个互联网上的任何地方都找不到答案,确切说明了这个错误是什么。当我运行它时,它仍然会创建该对象,并且不会给出任何红色错误消息。有谁知道这意味着什么,为什么它只使堆栈高1个块而不是原来的5个块?我一直在试图解决这个问题将近2个小时,现在我已经精疲力尽了。
答案 0 :(得分:4)
我相信该错误意味着您无法将dg节点(没有任何变换的节点)作为dag节点的父级。例如,尝试将对象集作为转换的父项。它不会让您,因为dg节点本身没有转换,因此不能属于层次结构。
现在它给您这个错误,因为您正尝试将多维数据集的polyCube输入作为父项,而该输入没有任何变换!这是偶然完成的,因为您假设cmds.polyCube
返回了多维数据集的转换。它不是。实际上,它返回2个项目的列表:多维数据集的转换和多维数据集的polyCube输入。并且由于cmds.parent
可以在其第一个参数中接受列表,因此您实际上是在尝试将转换AND polyCube作为堆栈转换的父级。您可以通过像这样cmds.polyCube()[0]
现在另一个问题是所有多维数据集都移到同一位置。这是因为您的i
变量位于for循环内。因此,每次迭代i
都会重置为0而不是递增,因此它们都移动到同一位置。
另一个问题是,在许多命令中,您正在使用"block*"
。这样做并不涉及block
变量,而是实际上将抓取所有以名称"block"
开头的转换。实际上,您根本不需要"*"
,只需传递变量block
。
牢记所有这些,下面是工作代码:
import random
import maya.cmds as cmds
def block_stacks(num):
stack = cmds.group(empty=True, name='Stacks#')
i = 0 # Need to move this OUT of the loop otherwise it always resets to 0 and all of the blocks will move to the same place.
for var in range(num):
r_rot = random.uniform(0,359)
block = cmds.polyCube(h=0.5, w=0.5, d=0.5, name='block#')[0] # This command actually returns a list of 2 items, the transform and the polyCube input, so grab the first index.
cmds.parent(block, stack)
cmds.move(0, 5.38 + i, 0, block) # Pass the variable.
cmds.rotate(0, r_rot, 0, block)
rR = random.uniform(0, 1.0)
rG = random.uniform(0, 1.0)
rB = random.uniform(0, 1.0)
cmds.polyColorPerVertex(block, rgb=[rR, rG, rB], cdo=True)
i += 0.5
block_stacks(5)