Основная проблема заключается в том, что вы ничего не передаете в cmds.polyColorPerVertex
, поэтому каждый раз, когда вы вызываете его, он окрашивает все, что выбрано в данный момент (в данном случае все вершины из сферы). Если вы передадите vert через эту функцию, он установит его на одном верте, как и ожидалось:
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
, поскольку она вводит в заблуждение, устанавливая вершины вместо того, чтобы возвращать их список.