如何将颜色随机分配给 "for loop" 内的顶点,而不是整个网格?

How to randomly assign color to verts individually inside a "for loop" but not to the whole mesh?

我有一段代码应该抓取对象的所有顶点,然后通过使用 "for loop" 为它们分配一个灰度范围内的随机颜色值。

以下代码逐个选择网格的每个顶点,但不为每个顶点分配颜色。相反,它同时为所有对象分配一种颜色,并用统一的颜色填充整个对象。

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,因为设置顶点而不是返回顶点列表会产生误导。