2015-10-28 1 views
0

Я некоторое время боролся с проблемой в Maya, и я не могу найти решение на этом сайте или вне его. Я сделал учетную запись, чтобы я мог задать прямой вопрос сообществу и надеяться получить ответ.re-ordering polygon face index in maya

Таким образом, проблема заключается в следующем: В процессе моделирования индекс лица (например, obj.f [0]), как само собой разумеется. Мне нужно повторно упорядочить этот индекс лица с указанной начальной точки пользователя. Это должно помещать лица в список выбора. (Maya поставит список на основе номера face_index, чего мы не хотим) Чтобы уточнить, индекс лица не нужно менять самостоятельно. Это просто нужно войти в список должным образом.

Что я сделал до сих пор: Я смог написать код, который сделает выбор для полосы полигонов. Выбранное лицо преобразуется в список ребер, а Maya ищет лица, которые имеют один и тот же край, и добавляет их в новый список по порядку. Это легко работает в полосе, потому что для соседнего лица используется только один край. Псевдо-код:

select geo 
select start face and make new_list 
converts geo_sel into list 
for geo_sel_face in geo_sel: 
    convert to edge 
    for new_list_face in new_list: 
     convert to edge 
     if edge in geo_sel_face in new_list_face: 
      ordered_list.append(geo_sel_face) 

Что-то в этом роде. Конечно, код полностью ломается при работе с полной поверхностью, такой как плоскость, так как по крайней мере два ребра разделяются с другими гранями.

Что это для: Я написал сценарий, чтобы в основном травить траву (или любой другой тип геометрии) на поверхность. Оригинальный сценарий ищет лицевые центры и растения травы, или что у вас на лицевом центре. Это также сдерживает ориентацию на нормали. Однако индексирование смешано, и выполнение дополнительной работы, требующей правильного индекса, становится невозможным. Это очень помогло бы в управлении данными, если бы этот список был читаемым человеком, а не машиносчитываемым, поэтому я ищу способ сделать это.

И последнее: Я попытался найти решение, но, по-видимому, его не найдено для полной поверхности. Возможно, мне нужно подумать об этом под другим углом, и глубоко признателен за любую помощь или вдохновение со стороны сообщества.

Благодарим вас за внимание!

+0

Итак, вам нужно сопоставить один набор граней по порядку и новый, который не является одним и тем же индексом, но выглядит идентичным?Или вы хотите упорядочить список лиц каким-то детерминированным способом? – theodox

+0

Привет, спасибо, за ваш ответ! Последний, упорядочивая список лиц детерминированным способом. Представьте себе самолет 3x3. Часто после моделирования индекс лица начинает перебираться вверх. Я хотел бы переупорядочить его так, чтобы, например, плоскость.face [0] начиналась в верхнем левом углу, а затем вертикально по плоскости [1] и т. Д. Я могу либо разделить все лица и рекомбинировать, либо использовать MFnMesh :: createInPlace, чтобы сделать что-то похожее. Но в любом случае мне потребуется какой-то ручной выбор. Это не большое дело для небольших чисел, но когда у сцены сотни, это орехи. – XJZeng

ответ

0

Не существует надежного способа делать то, что вы просите, поскольку лица не имеют надежной независимой идентификации - и поскольку может быть очень сложно создать сопоставление, которое на самом деле имеет смысл для компьютера хотя это очевидно для нас.

Простая задача - использовать выделенную карту UV, чтобы содержать информацию о заказе. Если это что-то, что связано с принятием решений людей, вы можете просто попросить художников создать карту UV-карт и использовать UV-центроиды ваших лиц в качестве элементов упорядочения. Что-то, как это даст вам отображение между УФ-центрами граней и лицевыми индексами:

def uv_centroids(mesh, map = 'map1'): 
    results = dict() 
    for f in range(cmds.polyEvaluate(mesh, f=True)): 
     cmds.select("%s.f[%s]" % (mesh, f), r = True) 
     uu, vv = cmds.polyEvaluate( bc2=True, uvs=map) 
     uu = sum(uu)/2.0 
     vv =sum(vv)/2.0 
     results[uu,vv] = f 
    return results 

поскольку лицом-центры только кортежами, используя вид() на клавишах словаря будет ранжировать их сначала U, а затем V :

# example with a default plane 
uv_dict = uv_centroids('pPlane1')  
ordered = uv_dict.keys() 
ordered.sort() 
for k in ordered: 
    print k, uv_dict[k] 

# prints out the keys and faces ordered 0,10,20... 1, 11, 21.... etc 

Хотя УФ являются хрупкими, как индексы в обычных условиях моделирования, они довольно просто воссоздать и позволяют художникам делать выбор относительно потока и порядка. Вы даже можете проецировать старое сопоставление на новую сетку с помощью TransferAttributes.

+0

Это отличный ответ theodox! Спасибо! Я исследую это! Прямо сейчас я пытаюсь использовать другой метод, который должен найти евклидово расстояние, используя numpy.linalg.norm, чтобы сравнить кратчайшее расстояние до начала. Это тоже работает, но заказ радиальный. Попытка заставить его идти определенным образом, это потребует много перебора кода. Этот метод гораздо более гибкий, спасибо! – XJZeng