如何将颜色随机分配给“ for循环”内的各个顶点,而不分配给整个网格?

时间:2019-03-31 03:57:37

标签: python maya

我有一段代码应该捕获对象的所有版本,然后通过使用“ 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()

不是在网格上具有嘈杂的颜色值范围,而是用纯色填充。我该如何确保在不触摸其他版本的情况下为每个版本指定了颜色?

1 个答案:

答案 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的名称,因为它会通过设置顶点而不是返回它们的列表来产生误导。