在 Maya 中将多边形壳分离为单独的网格 API
Separate polygon shells into separate meshes in Maya API
有没有办法在 Maya 中分离两个多边形壳 API (OpenMaya)?就像 cmds.polySeparate 函数(我不能使用它,因为它 returns 随机顺序的单独节点,所以我不知道要删除哪个节点,哪个要保留在我的脚本中。此外,我想仅依赖 API,不要将其与 cmds 混合使用)。
阅读文档我认为
OpenMaya.MFnMesh.extractFaces 我在寻找什么,但是(与文档似乎所说的不同)它只是剪切选定的块但将其留在同一节点中。
似乎没有干净的方法可以用 API 做到这一点。
由于我需要分离网格以删除不需要的部分,因此我决定保留要从网格中删除的顶点和多边形,并创建一个没有它们的新网格。
如您在此函数中所见,我只保留 "good" 顶点和多边形,然后更新 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)
如果有人找到更简洁的方法,我将很高兴知道并将其标记为解决方案!
有没有办法在 Maya 中分离两个多边形壳 API (OpenMaya)?就像 cmds.polySeparate 函数(我不能使用它,因为它 returns 随机顺序的单独节点,所以我不知道要删除哪个节点,哪个要保留在我的脚本中。此外,我想仅依赖 API,不要将其与 cmds 混合使用)。
阅读文档我认为 OpenMaya.MFnMesh.extractFaces 我在寻找什么,但是(与文档似乎所说的不同)它只是剪切选定的块但将其留在同一节点中。
似乎没有干净的方法可以用 API 做到这一点。
由于我需要分离网格以删除不需要的部分,因此我决定保留要从网格中删除的顶点和多边形,并创建一个没有它们的新网格。
如您在此函数中所见,我只保留 "good" 顶点和多边形,然后更新 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)
如果有人找到更简洁的方法,我将很高兴知道并将其标记为解决方案!