有没有办法在 Maya API (OpenMaya) 中分离两个多边形壳?就像cmds.polySeparate函数(我不能使用它,因为它以随机顺序返回单独的节点,所以我不知道要删除哪个节点以及要在我的脚本中保留哪个节点。此外,我只想依赖 API 和不要将它与 cmds 混合使用)。
阅读文档时,我认为 OpenMaya.MFnMesh.extractFaces我正在寻找什么,但是(与文档似乎所说的不同)它只是剪切选定的块,但将其留在同一节点中。
有没有办法在 Maya API (OpenMaya) 中分离两个多边形壳?就像cmds.polySeparate函数(我不能使用它,因为它以随机顺序返回单独的节点,所以我不知道要删除哪个节点以及要在我的脚本中保留哪个节点。此外,我只想依赖 API 和不要将它与 cmds 混合使用)。
阅读文档时,我认为 OpenMaya.MFnMesh.extractFaces我正在寻找什么,但是(与文档似乎所说的不同)它只是剪切选定的块,但将其留在同一节点中。
似乎没有干净的方法可以使用 API 执行此操作。
由于我需要分离网格以删除不需要的部分,因此我决定保留要从网格中删除的顶点和多边形,并创建一个没有它们的新网格。
正如你在这个函数中看到的,我只保留“好”的顶点和多边形,然后更新 poly_connects 列表中的顶点 ID。
def regenerate_mesh(source_mesh, vertices_to_delete, poly_to_delete):
points = source_mesh.getPoints(om.MSpace.kWorld)
num_points = len(points)
i = 0
while i < num_points:
p1 = points[i]
for p2 in vertices_to_delete['points']:
if p1.x == p2.x and p1.y == p2.y and p1.z == p2.z:
points.remove(i)
num_points -= 1
break
else:
i += 1
polygon_counts, polygon_connects = source_mesh.getVertices()
i = j = 0
polygon_counts_length = len(polygon_counts)
while i < polygon_counts_length:
k = 0
for poly in poly_to_delete:
if poly == polygon_connects[j:j+polygon_counts[i]]:
for l in range(polygon_counts[i]):
polygon_connects.remove(j)
polygon_counts.remove(i)
polygon_counts_length -= 1
break
else:
while k < polygon_counts[i]:
if polygon_connects[j+k] in vertices_to_delete['indices']:
for l in range(polygon_counts[i]):
polygon_connects.remove(j)
polygon_counts.remove(i)
polygon_counts_length -= 1
break
k += 1
else:
j += k
i += 1
# update indices
for vertex in sorted(vertices_to_delete['indices'], reverse=True):
for index, new_vertex in enumerate(polygon_connects):
if new_vertex > vertex:
polygon_connects[index] -= 1
new_mesh = om.MFnMesh()
new_mesh.create(points, polygon_counts, polygon_connects)
如果有人找到更清洁的方法,我将很高兴知道并将其标记为解决方案!