Как случайным образом назначить цвет вертам индивидуально внутри цикла for, а не всей сетке? - PullRequest
1 голос
/ 31 марта 2019

У меня есть кусок кода, который должен захватить все вершины объекта, а затем с помощью «для цикла» назначить им случайное значение цвета в диапазоне шкалы яркости.

Следующий код выбирает все вершины сетки один за другим, но не назначает цвет каждому из них.Вместо этого он назначает цвет всем им одновременно, заполняя весь объект однородным цветом.

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 Ответ

1 голос
/ 31 марта 2019

Основная проблема заключается в том, что вы ничего не передаете в 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, поскольку она вводит в заблуждение, устанавливая вершины вместо того, чтобы возвращать их список.

...