Python maya中多边形面索引的重新排序

Python maya中多边形面索引的重新排序,python,maya,maya-api,Python,Maya,Maya Api,我一直在努力解决Maya中的一个问题有一段时间了,但无论是在该网站上还是在该网站外,我都找不到解决方案。我这样做是为了向社区提出一个直接的问题,并希望得到答案 因此,问题是: 在建模过程中,面索引(例如obj.f[0])自然会变得混乱。我需要从用户指定的起始点按顺序重新排序该面索引。 这是为了将面放入选择列表中。(Maya将根据face_索引编号放置列表,这不是我们想要的) 为了澄清,面索引本身不需要更改。它只需要正确地进入一个列表 到目前为止我所做的: 我能够编写一些代码来选择一条多边形。选定

我一直在努力解决Maya中的一个问题有一段时间了,但无论是在该网站上还是在该网站外,我都找不到解决方案。我这样做是为了向社区提出一个直接的问题,并希望得到答案

因此,问题是: 在建模过程中,面索引(例如obj.f[0])自然会变得混乱。我需要从用户指定的起始点按顺序重新排序该面索引。 这是为了将面放入选择列表中。(Maya将根据face_索引编号放置列表,这不是我们想要的) 为了澄清,面索引本身不需要更改。它只需要正确地进入一个列表

到目前为止我所做的: 我能够编写一些代码来选择一条多边形。选定的面将转换为边列表,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)
差不多吧。当然,在处理像平面这样的完整曲面时,代码完全中断,因为至少有两条边与其他面共享

它的用途是: 我写了一个脚本,基本上是在曲面上种植草(或任何其他类型的几何体)。原始脚本查找面中心,并在面中心种植草或其他东西。它还将方向约束为法线。然而,索引是混乱的,并且不可能进行需要适当索引的额外工作。如果列表是人类可读的而不是机器可读的,那么它在数据管理方面会有很大帮助,这就是为什么我正在寻找一种方法来实现这一点

最后: 我试图寻找一个解决方案,但似乎没有找到任何一个完整的表面。也许我需要从另一个角度来考虑这一点,我将非常感谢社会各界的帮助或启发


谢谢你抽出时间

没有一种完全可靠的方法来满足你的要求,因为人脸没有一个可靠的独立身份——而且,即使对我们来说是显而易见的,但要想出一个对计算机来说真正有意义的映射可能非常棘手

简单的做法是使用专用的UV贴图来包含您的订购信息。如果这涉及到人类的决策,你实际上可以要求艺术家制作一张名为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
由于面中心只是元组,因此在字典键上使用sort()将首先按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

虽然UV和普通建模条件下的指数一样脆弱,但它们是一个非常简单的重新创建过程,允许艺术家对流动和顺序做出一些选择。您甚至可以使用TransferAttributes将旧映射投影到新网格上。

因此,您需要在一组面之间按顺序映射,而新的面不是相同的索引,而是看起来相同的?或者你想以某种确定性的方式排列一张人脸列表?嘿,多多克斯,谢谢你的回复!后者,以确定性的方式对面列表进行排序。想象一架3x3的飞机。通常在建模之后,面索引会变得混乱。我想对其重新排序,例如,plane.face[0]从左上角开始,然后是plane.face[1],然后是垂直方向,依此类推。我可以分离所有的面并重新组合,或者使用MFnMesh::createInPlace做类似的事情。但无论哪种方式,我都需要做一些手动选择。对于小数字来说,这不是什么大问题,但当一个场景有数百个时,这简直是胡说八道。这是一个很好的答案theodox!非常感谢。我将探索这一点!现在我正在尝试另一种方法,那就是使用numpy.linalg.norm来计算欧几里德距离,以比较到起始面的最短距离。这同样有效,但顺序是径向的。试图以一种特定的方式实现它将需要大量的代码争论。这个方法灵活多了,谢谢!