2015-10-02 1 views
3

Есть ли способ разделить два многоугольника в Maya API (OpenMaya)? Точно так же, как функция cmds.polySeparate (которую я не могу использовать, потому что она возвращает отдельные узлы в случайном порядке, поэтому я не могу знать, какой из них нужно удалить, а какой - сохранить в моем скрипте.Кроме того, я бы хотел полагаться только на API и не использовать, t смешайте его с cmds).Отдельные оболочки многоугольника в отдельные сетки в Maya API

Чтение документации Я думал, что OpenMaya.MFnMesh.extractFaces что было я искал, но (в отличие от того, что, кажется, говорят документы) он просто вырезает выбранный кусок, но оставляет его в том же узле.

+0

Хотелось бы, чтобы мне было удобнее использовать методы api, чтобы помочь вам. Кажется, что 'extractFaces' будет одним, но он тоже не работает для меня. Я постараюсь копать глубже и сообщить, найду ли что-нибудь. –

+0

@ GreenCell Спасибо за попытку! я действительно ценю это – Jiloc

ответ

1

Похоже, что нет чистого способа сделать это с помощью API.

Поскольку мне нужно было отделить меш, чтобы удалить часть, в которой я не нуждался, я решил сохранить вершины и полигоны, которые я хотел удалить из сетки, и создать новую сетку без них.

Как вы можете видеть в этой функции, я просто сохраняю «хорошие» вершины и полигоны, а затем обновляю идентификаторы вершин в списке poly_connects.

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) 

Если кто-то найдет более чистый способ, я буду рад узнать и отметить его как решение!