Я пытаюсь создать случайный полигональный примитив со случайным количеством подразделений каждый раз.
Если мои ограниченные знания верны, я не могу просто создать случайную сетку. Мне нужно будет собрать все типы мешей, которые я могу создать, в массив чисел, а затем выбрать случайное число, представляющее этот меш, и создать его.
Однако у каждой сетки есть своя команда/способ разделения.
import random
object = cmds.polySphere ( r=10, sx=random.randrange(10, 100), sy=random.randrange(10,100), name='mySphere#' )
Я могу создать каждую сетку отдельно и рандомизировать ее на основе определенных команд, но как мне заставить ее создавать куб, конус или любой другой примитив со случайным числом делений?
Интересная вещь при создании примитивов заключается в том, что их возвращаемые значения непротиворечивы. Они всегда возвращают преобразование и форму, например:
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))
Вы можете перечислять объекты и фильтровать по типу, поэтому, если вы имеете в виду все сетки, которые вы можете сделать cmds.ls(type = "mesh")
, или если вы хотите, чтобы определенные типы вы могли сделать cmds.ls(type = "polySphere")
Привет, @Green-cell! Не уверен, что вы увидите этот комментарий, но мне было интересно, как мне создать список этих мешей, чтобы отслеживать их количество в сцене? Это не может быть так просто, как примитивы = cmds.ls(‘myMesh’)? Таким образом, я мог контролировать их количество в сцене и удалять их при необходимости. Спасибо.