将集群分配给对象中的每个shell - Maya Python

时间:2017-05-09 03:57:51

标签: python loops maya

我在Python中非常棒。 我可以编写一个简单的脚本来将一个簇分配给所选对象的顶点。

像这样:

import maya.cmds as cmds

activeSelection = cmds.ls(selection=True)

for i in activeSelection:
  cmds.polyListComponentConversion( i, ff=True, tv=True, internal=True ) 
  cmds.cluster( i, rel=True )  

但事实证明我需要将一个簇分配给对象的每个单独多边形外壳的顶点。我花了几个小时搜索并尝试不同的脚本并尝试修改它们但似乎没什么真的有用。 你们会这么善意地给出一个暗示吗?

谢谢,

安东

2 个答案:

答案 0 :(得分:0)

我尝试使用cmds.polySeparate()将网格分割成贝壳,然后将这些棋子聚类并重新组合成一个组合网格。像这样:

sel = cmds.ls(sl=True)
pieces = cmds.listRelatives(cmds.polySeparate(sel), c=True)
clusters = [cmds.cluster(p, rel=True) for p in pieces]
cmds.polyUnite(pieces)

根据应用程序的不同,您可能不需要群集,因为polySeparate将为每个shell提供一个变换,并且您将能够在保持组合网格的同时直接为原始shell变换设置动画

答案 1 :(得分:0)

如果您不想分离然后重新组合您的网格(以保持干净的历史记录,或者由于某种原因限制您以任何方式修改地理位置除了变形器...),您可以使用此将你的炮弹“非破坏性地”分离出来

import maya.cmds as mc

shells = []
face_count = mc.polyEvaluate(geom, f=True)
faces = set(range(face_count))
for face in xrange(face_count):
    if face in faces:
        shell_indices = mc.polySelect(geom, q=True, extendToShell=face)
        shell_faces = ['%s.f[%d]' %(geom, i) for i in shell_indices]
        shells.append(mc.polyListComponentConversion(shell_faces, toVertex=True))
        faces -= set(shell_indices)
    elif not faces:
        break

这将为您提供一个列表,其中每个项目都是shell的cps列表。剩下要做的就是聚集 shells 列表

的每个项目