1

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

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

这就是我所拥有的,任何可以发现我所缺少的东西的额外眼睛将不胜感激。

4

1 回答 1

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获取与第一个顶点关联的变换节点。(它假设所有选定的顶点都在同一个网格中)。

于 2016-10-23T03:59:41.640 回答