2010-01-19 20 views
1

Je veux créer une structure très simple sur les nœuds de groupe et de localisation dans Maya qui seront ensuite exportés dans le cadre de mon niveau de jeu.Création d'une structure simple de hiérarchie dans Maya en utilisant mel/python

par exemple.

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

Il n'y a qu'un seul Group_Root dans le fichier, il y a beaucoup de group_parents (chaque nom unique) Cependant ont de tous group_parent les trois mêmes noms sous-groupe (« groupe1 », « group2 », « Group3 ») et tous groupe1 ont un localisateur appelé locator1

ce que j'ai à ce jour est:

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) 

Cependant, je reçois cette erreur à "c.parent (mode_group)"

# Erreur: le groupe d'objets1 est invalide

Probablement parce qu'il y a plus d'un noeud appelé "group1" donc il ne sait pas lequel doit être parent.

Toute idée comment je le fais avec le chemin complet? par exemple. "Group_Root | group_parent | groupe1"

Répondre

0

Avez-vous vu VFX Overflow? C'est Q & A pour les effets visuels, donc je m'attendrais à ce qu'un certain nombre d'observateurs soient assez familiers avec Maya/MEL et Python. Cela dit, il est assez nouveau de sorte que le nombre d'utilisateurs est encore petit ...

0

Les noms peuvent être un peu ennuyeux avec MEL. En général, il est recommandé de ne jamais faire confiance à un nom pour être ce que vous spécifiez.

Ceci est un bon exemple de la façon dont * ne pas faire les choses:

group -n myGroup1 circle1 sphere1; 

..car qui est nullement garantie d'aboutir à quelque chose de « Groupe1 ». La meilleure façon de le faire est d'exécuter votre commande et afficher un résultat d'une variable de chaîne, tels que:

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

Ensuite, utilisez $ result pour faire référence au groupe résultant. Cela fonctionnera encore, même si le groupe a fini par s'appeler 'myGroup23'.

Je ne sais pas comment l'apparence ci-dessus en Python, comme je suis surtout connu avec MEL droite, mais les mêmes principes devraient appliquer.

Une autre chose à regarder est la fonctionnalité de l'espace de noms (namespace et namespaceInfo), qui pourrait être utilisée pour définir un nouvel espace de noms pour le groupe top-leve unique à portée de main.

espoir qui aide

0

Je devine que qu'il soit plus de deux ans, vous avez trouvé celui-ci par maintenant .. mais pour la postérité, il y avait deux problèmes - d'une part, vous sur place avec la besoin de chemins absolus, mais il y avait aussi un léger bug dans la façon dont vous appliquiez l'appel maya.cmds.parent(). Je viens de faire une légère réécriture pour illustrer - principalement vous pourriez utiliser le fait que lorsque vous créez des choses, ils sont sélectionnés par défaut, et maya.cmds.ls() est assez intelligent pour vous renvoyer ce dont vous avez besoin .. 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)