0

我一直在努力解决 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)

类似的东西。当然,在处理像平面这样的完整表面时,代码会完全中断,因为至少有两条边与其他面共享。

它的用途:我编写了一个脚本,基本上可以在表面上种植草(或任何其他类型的几何图形)。原始脚本寻找面部中心并在面部中心种植草,或者你有什么。它还将限制方向为法线。但是,索引是混乱的,并且无法进行需要适当索引的额外工作。如果列表是人类可读的而不是机器可读的,这将对数据管理有很大帮助,这就是为什么我正在寻找一种方法来做到这一点。

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

感谢您的时间!

4

1 回答 1

0

没有一种完全可靠的方法来完成您的要求,因为面孔没有可靠的独立身份 - 并且因为即使很明显,想出对计算机实际上有意义的映射也可能非常棘手给我们。

简单的做法是使用专用的 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 将旧映射投影到新网格上。

于 2015-10-29T04:19:59.450 回答