Создание нескольких объектов по их последнему номеру, Maya Python

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

У меня есть переменная для определения количества суставов, которые я хочу. У меня также есть переменная для количества групп/контроллеров, которые я хочу. Эти суммы могут варьироваться, поэтому сценарий будет полудинамическим.

Итак, что я получаю, это пара суставов (joint1, Joint2, Joint3, ... и т. д.) и пара групп (группа 1, группа 2, группа 3, ... и т. д.).

Моя проблема в том, что я не знаю, как бы я стал родителем моей «группы 1» для «совместной 1» и «группы 2» с «совместной 2» и т. д. все за один раз. Поскольку я хочу иметь возможность изменять количество суставов и групп, я не могу жестко закодировать это.

Любая помощь будет оценена по достоинству :)


person Hampus    schedule 08.10.2018    source источник


Ответы (2)


Пример @DrWeeny возьмет существующие объекты и существующие соединения и объединит их вместе. Если вы хотите просто начать с геометрии и автоматически добавлять к ней соединения, вы можете попробовать что-то вроде этого:

import re

def add_joints_to_selected(orient = 'xyz'):
    selection = cmds.ls(sl=True)
    cmds.select(d=True)
    joints = []
    for geo in selection:
        pivot = cmds.xform(geo, q=True, rp=True, ws=True)
        suffix = '0'
        raw_name = re.findall( "\d$", geo)
        if raw_name:
            suffix = raw_name[-1]       
        jnt = cmds.joint(n = "joint_" + suffix, p=pivot)
        cmds.parent(geo, jnt)
        joints.append(jnt)
    if orient:
        cmds.joint(joints[:-1], e=True, oj = orient)

add_joints_to_selected('xyz')  # or add_joints_to_selected(None)

Он получает опорные точки выбранных узлов и создает соединения для каждого из них (в том порядке, в котором вы их выбрали). Если вы укажете общий порядок, такой как «xyz» или «yzx», он выровняет суставы, как если бы вы нарисовали их вручную; в противном случае суставы выровнены по миру. Единственная хитрость заключается в использовании регулярного выражения для получения суффиксов из существующих имен узлов (оно возвращается к «0», если у вас нет числового суффикса)

person theodox    schedule 08.10.2018
comment
Это очень интересное чтение и то, что я хотел бы применить в будущем, хотя для моего скрипта на самом деле не нужно применять эти функции. Но большое спасибо за ответ и знания :) - person Hampus; 10.10.2018
comment
о да, в моем примере я предполагаю, что вы уже знаете свою иерархию. Для вашего скрипта вы выбираете группы, чтобы рисовать суставы? И да, я бы определенно использовал регулярное выражение для шаблона именования. - person DrWeeny; 10.10.2018

может что-то вроде этого поможет вам?

grp = cmds.ls('group*')
nbs = [int(n.split('group')[-1]) for n in grp]
grpDic = dict(zip(nbs, grp))

joint = cmds.ls('joint*', type='joint')
nbs = [int(n.split('joint')[-1]) for n in joint]
jointDic = dict(zip(nbs, joint))

common = list(set(grpDic.keys())&set(jointDic.keys()))

for i in common:
    cmds.parent(grpDic[i], jointDic[i])

РЕДАКТИРОВАТЬ: включить воспитание nurbs

# filter by nurbs type    
nurbs_sh = cmds.ls('nurbsCircle*', type='nurbsCurve')
# get the transform node of this nurbs
nurbs_tr = cmds.listRelatives(nurbs_sh, p=1)
nbs = [int(n.split('nurbsCircle')[-1]) for n in nurbs_tr]
curveDic = dict(zip(nbs, nurbs_tr))

common = list(set(grpDic.keys())&set(curveDic.keys()))
# nurbs parent to group
for i in common:
    cmds.parent(curveDic[i], grpDic[i])
person DrWeeny    schedule 08.10.2018
comment
Это отлично сработало для воспитания моих групп в суставах! Большое спасибо! Я предположил, что могу использовать ту же формулу, чтобы родить мои nurbsCircles (nurbscircle1,2,3 и т. д.) для моих групп (1,2,3 и т. д.), изменив атрибуты имени, однако я не могу заставить ее работать. Кажется, я получаю больше, чем просто данные преобразования, и я предполагаю, что это не работает. Мне также интересно, почему я должен определять тип суставов, а не группы? Должен ли я также определять тип моих nurbscircles, чтобы они могли быть родительскими для групп? - person Hampus; 10.10.2018
comment
Я использую -type, потому что при создании соединений где-то есть узел с соединением в его имени (накануне, если я работал над действительно простым файлом сцены). Я просто предположил, что у вас есть список известных именованных узлов. Если вы используете тип nurbsCurve, вы получите формы, и вам нужно будет найти преобразование, чтобы создать его. Я попробую что-нибудь завтра, когда у меня будет майя. Моя точка зрения в этом коде заключалась в следующем: вы можете создать словарь идентификаторов и связать все. В этом случае есть одна группа, один сустав, но вы можете работать с несколькими группами, чтобы создать родительские элементы для суставов. Я не специалист по монтажу, поэтому стараюсь смотреть на вещи как можно шире. - person DrWeeny; 10.10.2018
comment
Ах, я вижу, мне удалось поместить свои nurbs в словарь, но, глядя в мой словарь, он заполнен МНОГО различных данных nurbs, и попытка связать их с группами ничего не делает, даже сообщение об ошибке. Но, как вы сказали, мне нужно получить данные преобразования от nurbs и передать их в группы? Я очень ценю, что вы нашли время, чтобы помочь мне, я полностью застрял раньше. Отличное сообщество :) - person Hampus; 10.10.2018
comment
я добавил фрагмент кода для создания словаря nurbs - person DrWeeny; 10.10.2018