Итак, я хочу создать очень простую структуру из узлов группы и локатора в 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.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 )
Имена могут немного раздражать MEL. В общем, хорошая практика никогда не доверять имени, которое вы указываете.
Это хороший пример того, как * не делать ничего:
group -n myGroup1 circle1 sphere1;
.. потому что это никоим образом не гарантирует, что получится что-то под названием "group1". Лучший способ сделать это - запустить команду и зафиксировать результат в строковой переменной, например:
string $result = `group -n myGroup circle1 sphere1`;
Затем используйте $result для ссылки на итоговую группу. Это все равно будет работать, даже если группа будет называться "myGroup23".
Я не уверен, как это выглядит на Python, поскольку я в основном знаком с прямым MEL, но должны применяться те же принципы.
Еще одна вещь, на которую стоит обратить внимание - это функциональность пространства имен (namespace и namespaceInfo), которая может использоваться для определения нового пространства имен для уникальной группы с верхним уровнем.
Надеюсь, что поможет
Вы видели VFX Overflow? Это Q & A для визуальных эффектов, поэтому я ожидаю, что многие наблюдатели будут хорошо знакомы с Maya/MEL и Python. Тем не менее, это довольно новое, поэтому пользовательская база все еще невелика...