2016-10-06 1 views
1

J'essaie de déplacer l'objet pivot sélectionné vers le centre d'une sélection de sommets.Maya - Pivot d'objet central vers le localisateur/cluster

Je suis arrivé au point où j'ai le xform défini, mais ne peut pas sembler déplacer l'objet (défini comme obj) pivotent à ce point

import maya.cmds as cmds 

sel = cmds.ls(sl=True) 
print sel 
obj = cmds.ls(*sel, o=True) 
print obj 

selVerts = cmds.ls(sl=True) 
tempClstr = cmds.cluster() 
pos = cmds.xform(tempClstr[1], q=True, ws=True, rp=True) 
loc = cmds.spaceLocator() 
cmds.move(pos[0], pos[1], pos[2]) 
cmds.delete(tempClstr) 

piv = cmds.xform (loc[1], piv=True, q=True, ws=True) 
print piv 
cmds.xform(obj, ws=True, piv=(piv[0], piv[1], piv[2])) 

Voici ce que j'ai, tout Des yeux supplémentaires qui peuvent repérer ce que je manque seraient grandement appréciés.

+0

Possible duplication de [Maya Python - Définir le pivot de l'objet vers le centre de sélection] (http://stackoverflow.com/questions/39902493/maya-python-set-object-pivot-to-selection-center) –

Répondre

1

Votre obj doit être le noeud de transformation, mais il s'agit plutôt d'un tableau dans lequel chaque élément a la même forme.

Essayez ceci:

import pymel.core as pm 
bigNum = 1.0e+9 
sel = pm.ls(sl=True, flatten=True) 
min = pm.dt.Point(bigNum,bigNum,bigNum) 
max = pm.dt.Point(-bigNum,-bigNum,-bigNum) 

for v in sel: 
    p = pm.pointPosition(v) 
    if p.x < min.x: 
     min.x = p.x 
    elif p.x > max.x: 
     max.x = p.x 
    if p.y < min.y: 
     min.y = p.y 
    elif p.y > max.y: 
     max.y = p.y  
    if p.z < min.z: 
     min.z = p.z 
    elif p.z > max.z: 
     max.z = p.z  

center = (min+max)*0.5 

obj = pm.listRelatives(pm.listRelatives(sel[0], p=True), p=True) 
pm.xform (obj, piv=(center.x, center.y, center.z) , ws=True) 
pm.spaceLocator(p=center) 

pm.select(obj) 

Le drapeau flatten de ls fera en sorte que chaque sommet a une entrée dans le tableau de résultats. Les sommets avec indices adjacents ne seront pas groupés.

Plutôt que de créer un cluster temporaire, il effectue une itération pour trouver la zone de délimitation de l'espace mondial, puis calcule son centre.

L'appel à listRelatives imbriqué dans un autre listRelatives obtient le noeud de transformation associé au premier sommet. (Il suppose que tous les sommets sélectionnés sont dans le même maillage).