我有一段代码,应该抓取对象的所有顶点,然后通过使用“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()
网格上不再有嘈杂的颜色值范围,而是用平坦的颜色填充。如何确保每个顶点在被选择时分配一种颜色而不接触其他顶点?
最佳答案
主要问题是您没有向 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
的名称,因为设置顶点而不是返回顶点列表会让人感到误导。
关于python - 如何将颜色随机分配给 "for loop"内的各个顶点而不是整个网格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55437745/