Создание простой иерархической структуры в Maya с использованием mel / python

1

Итак, я хочу создать очень простую структуру из узлов группы и локатора в Maya, которая затем будет экспортирована для использования на моем уровне игры.

например.

Group_Root
  group_parent
    - group1
      - locator1
    - group2
      - locator2
    - group3

В файле есть только одна Group_Root, существует много group_parents (каждый из них уникально назван) Однако все group_parent имеют те же три названия подгрупп ( "group1", "group2", "group3" ), и все group1 имеют локатор, называемый locator1

Что я до сих пор:

group_parent = c.group( em=True, name="group_parent", parent="Group_Root")
modes =  ["group1", "group2", "group3"]
for mode in modes:
    mode_group = c.group( em=True, n=mode, parent=group_parent )
    if mode == "group1":
            s = c.spaceLocator(name="locator1")
            c.parent( mode_group ) 
    elif mode == "group3":
            s = c.spaceLocator(name="locator2")
            c.parent( mode_group )

Однако я получаю эту ошибку в "c.parent(mode_group)"

# Ошибка: группа объектов1 недействительна

Предположительно, потому что существует более одного node, называемого "group1", поэтому он не знает, какой из них принадлежит родительскому.

Любая идея, как я делаю это с полными путями? например "Group_Root | group_parent | group1"

Теги:
maya
mel
autodesk

3 ответа

0

Я предполагаю, что это уже более двух лет, вы уже догадались об этом. Но для потомков были две проблемы: во-первых, вы были на месте с необходимостью абсолютных путей, но также небольшая ошибка в том, как вы применяли вызов maya.cmds.parent(). Я просто сделал небольшую перезапись, чтобы проиллюстрировать - в основном вы могли использовать тот факт, что при создании вещей они становятся выбранными по умолчанию, а maya.cmds.ls() достаточно умен, чтобы вернуть вам то, что вам нужно. Ergo:

c.group( em=True, name="group_parent", parent="Group_Root")
group_parent = c.ls(sl=True)[0]

modes =  ["group1" , "group2", "group3"]
for mode in modes:
    c.group( em=True, n=mode, parent=group_parent )
    mode_group = c.ls(sl=True)[0]
    if mode == "group1":
            c.spaceLocator(name="locator1")
            s = c.ls(sl=True)[0]
            # maya.cmds.parent() with something selected will actually
            # parent the specified object to the selected object. 
            # You don't want that.


            # We might as well use the explicit syntax to be sure 
            # (parent everything specified to the last item in the list)
            c.parent( s, mode_group ) 
    elif mode == "group3":
            c.spaceLocator(name="locator2")
            s = c.ls(sl=True)[0]
            c.parent( s, mode_group )
0

Имена могут немного раздражать MEL. В общем, хорошая практика никогда не доверять имени, которое вы указываете.

Это хороший пример того, как * не делать ничего:

group -n myGroup1 circle1 sphere1;

.. потому что это никоим образом не гарантирует, что получится что-то под названием "group1". Лучший способ сделать это - запустить команду и зафиксировать результат в строковой переменной, например:

string $result = `group -n myGroup circle1 sphere1`;

Затем используйте $result для ссылки на итоговую группу. Это все равно будет работать, даже если группа будет называться "myGroup23".

Я не уверен, как это выглядит на Python, поскольку я в основном знаком с прямым MEL, но должны применяться те же принципы.

Еще одна вещь, на которую стоит обратить внимание - это функциональность пространства имен (namespace и namespaceInfo), которая может использоваться для определения нового пространства имен для уникальной группы с верхним уровнем.

Надеюсь, что поможет

0

Вы видели VFX Overflow? Это Q & A для визуальных эффектов, поэтому я ожидаю, что многие наблюдатели будут хорошо знакомы с Maya/MEL и Python. Тем не менее, это довольно новое, поэтому пользовательская база все еще невелика...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню