2016-10-06 4 views
1

Я пытаюсь переместить выбранный объект в центр выбора вершин.Maya - центр объекта, расположенный к локатору/кластеру

я добрался до места, где у меня есть xform определено, но не похоже, чтобы переместить объект (определяется как obj) шарнира к этой точке

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])) 

Вот что у меня есть, любой дополнительные глаза, которые могут определить, что им недостает, будут очень признательны.

+0

Возможный дубликат [Maya Python - Установить объект в центр выделения] (http://stackoverflow.com/questions/39902493/maya-python-set-object-pivot-to-selection-center) –

ответ

1

Ваш obj должен быть узлом преобразования, но вместо этого он представляет собой массив, в котором каждый элемент имеет одинаковую форму.

Попробуйте это:

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) 

flatten флаг ls будет убедиться, что каждая вершина имеет запись в результирующем массиве. Вершины с соседними индексами не будут сгруппированы.

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

Звонок listRelatives, вложенный в другой listRelatives, получает узел преобразования, связанный с первой вершиной. (Предполагается, что все выбранные вершины находятся в одной и той же сетке).