在Maya API中分离多边形外壳到单独的网格中



是否有办法在Maya API (OpenMaya)中分离两个多边形外壳?就像cmd一样。polySeparate函数(我不能使用,因为它以随机顺序返回单独的节点,所以我不知道要删除哪一个,要保留在我的脚本中。此外,我希望只依赖API,而不将其与cmd混合)。

阅读文件,我认为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)

如果有人找到一个更干净的方法,我会很高兴知道并标记为解决方案!

相关内容

  • 没有找到相关文章

最新更新