我有一段代码应该捕获对象的所有版本,然后通过使用“ for循环”为它们分配灰度范围内的随机颜色值。
下面的代码一个一个地选择网格的每个顶点,但不为每个网格指定颜色。相反,它会同时为所有对象分配颜色。
import maya.cmds as cmds
import functools
import random
colorList =cmds.ls('colorSet*' )
sphereList = cmds.ls( 'mySphere*' )
if len( sphereList ) > 0:
cmds.delete( sphereList)
result = cmds.polySphere ( r=50, sx=random.randrange(10, 100), sy=random.randrange(10,100), name='mySphere#' )
cmds.polyColorSet ( create=True, colorSet='colorSet1')
def get_random_vertexes():
percent = 1
vertexes = []
for obj in cmds.ls(sl=1, long=1):
indexes = range(cmds.polyEvaluate(obj, vertex=1))
random.shuffle(indexes)
indexes = indexes[:int(percent*len(indexes))]
for i in range(len(indexes)):
indexes[i] = obj+'.vtx['+str(indexes[i])+']'
brightness = random.uniform(0.1,1.0)
rgb = (brightness, brightness, brightness)
cmds.polyColorPerVertex (rgb=rgb)
vertexes.extend(indexes)
cmds.select(vertexes, r=1)
get_random_vertexes()
不是在网格上具有嘈杂的颜色值范围,而是用纯色填充。我该如何确保在不触摸其他版本的情况下为每个版本指定了颜色?
答案 0 :(得分:1)
主要问题是,您不会将任何内容传递给cmds.polyColorPerVertex
,因此每次调用它时,它都会为当前选择的内容着色(在这种情况下,所有球体都是从球体发出的)。如果通过该函数传递一个顶点,它将按预期设置在单个顶点上:
import maya.cmds as cmds
import random
sphereList = cmds.ls('mySphere*')
if sphereList: # Can shorten if statement.
cmds.delete(sphereList)
new_obj, _ = cmds.polySphere (r=50, sx=random.randrange(10, 20), sy=random.randrange(10, 20), name='mySphere#')
cmds.setAttr('{}.displayColors'.format(new_obj), True) # Display vert colors.
cmds.polyColorSet(new_obj, create=True, colorSet='colorSet1')
def set_random_vertexes(percent=1): # Move percent as a parameter so it's not hard-coded.
vertexes = []
for obj in cmds.ls(sl=1, long=1):
all_verts = cmds.ls('{}.vtx[*]'.format(obj), flatten=True) # Use `cmds.ls` with `flatten` to get a list of all vertexes.
random.shuffle(all_verts)
verts = all_verts[:int(percent * len(all_verts))]
for vert in verts:
brightness = random.uniform(0.1, 1.0)
rgb = (brightness, brightness, brightness)
cmds.polyColorPerVertex(vert, rgb=rgb) # Pass vert's name to change its color.
vertexes.extend(verts)
cmds.select(vertexes, r=1)
set_random_vertexes()
我还在那里进行了一些优化。您可能需要考虑更改函数get_random_vertexes
的名称,因为它会通过设置顶点而不是返回它们的列表来产生误导。