2

Maya API (OpenMaya) で 2 つのポリゴン シェルを分離する方法はありますか? cmds.polySeparate関数と同じように(個別のノードをランダムな順序で返すため使用できないため、スクリプトでどれを削除し、どれを保持するかわかりません。さらに、API のみに依存したいと思います。コマンドと混同しないでください)。

ドキュメントを読んで、 私が探していたのはOpenMaya.MFnMesh.extractFacesだと思いましたが、(ドキュメントの内容とは異なります) 選択したチャンクを切り取るだけで、同じノードに残します。

4

1 に答える 1

1

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)

誰かがよりクリーンな方法を見つけたら、喜んでそれを知り、解決策としてマークします!

于 2015-10-21T16:33:45.540 に答える