Maya - 中心对象转向定位器/群集

时间:2016-10-06 14:13:13

标签: python-2.7 maya maya-api

我试图将选定的对象枢轴移动到选定顶点的中心。

我已经明确了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]) ) 

这就是我所得到的,任何可以发现我失踪的额外眼睛都会受到高度赞赏。

1 个答案:

答案 0 :(得分: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的{​​{1}}标志将确保每个顶点在结果数组中都有一个条目。具有相邻索引的顶点不会被分组。

不是制作临时群集,而是迭代查找世界空间边界框,然后计算其中心。

对嵌套在另一个ls中的listRelatives的调用获取与第一个顶点关联的变换节点。 (它假设所有选定的顶点都在同一个网格中。)