Как создать случайный полигонный примитив со случайным количеством подразделений? - PullRequest
0 голосов
/ 07 апреля 2019

Я пытаюсь порождать случайный полигональный примитив со случайным числом подразделений каждый раз.

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

Однако каждая сетка имеет свою команду / способ деления себя.

import random

object = cmds.polySphere ( r=10, sx=random.randrange(10, 100), sy=random.randrange(10,100), name='mySphere#' )

Я могу порождать каждую сетку отдельно и рандомизировать ее на основе определенных команд, но как мне заставить ее порождать куб, конус или любой другой примитив со случайным числом делений?

1 Ответ

2 голосов
/ 08 апреля 2019

Интересно, что при создании примитивов их возвращаемые значения согласованы. Они всегда возвращают преобразование и форму, например:

cmds.polyCube()
# Result: [u'pCube1', u'polyCube1'] # 

cmds.polyCone()
# Result: [u'pCone1', u'polyCone1'] # 

cmds.polySphere()
# Result: [u'pSphere1', u'polySphere1'] # 

И, к счастью, в каждом атрибуте деления есть слово "subdivision", поэтому мы можем установить случайное значение для любого атрибута, содержащего это слово.

Зная это, мы можем выбрать случайный примитив для создания, а затем перебрать атрибуты его фигуры, чтобы установить случайное подразделение:

import random
import maya.cmds as cmds


# Define a list of all primitive functions we can create from.
primitives = [cmds.polySphere, cmds.polyCube, cmds.polyCylinder, cmds.polyCone, cmds.polyTorus, cmds.polyPlane]

# Pick a random primitive and create it.
mesh_type = random.choice(primitives)
transform, shape = mesh_type()

# Set a random value on any attribute that has subdivision in its name.
attrs = cmds.listAttr(shape, keyable=True)
for attr in attrs:
    if "subdivision" in attr:
        cmds.setAttr(shape + "." + attr, random.randrange(10, 100))
...