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

标签 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()

网格上不再有嘈杂的颜色值范围,而是用平坦的颜色填充。如何确保每个顶点在被选择时分配一种颜色而不接触其他顶点?

最佳答案

主要问题是您没有向 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/

相关文章:

python - 如何基于具有/相同维度和形状的掩码数组更新 numpy 数组

python - 定时任务错误: Windows can not find the specified file

linux - 如何将 FFTW 库连接到软件?

python - Maya - 在未捕获的异常上自动运行函数

python - Maya – 为什么在清除历史命令后无法执行打印方法?

python - string.replace 替换所有出现的地方

javascript - Django 向用户显示上传正在进行中

python - aiohttp:如何在下载响应正文之前有效地检查 HTTP header ?

python - 当我在 PyQt4 中打开新窗口时如何关闭旧窗口

Python + Maya - 如何将 float 更改为时间值