在 Maya 中重新排序多边形面索引
re-ordering polygon face index in maya
我已经为 Maya 中的一个问题苦苦思索了一段时间,但我无法在该站点内外找到解决方案。我创建了帐户,因此我可以向社区提出直接问题并希望得到答案。
问题是这样的:
在建模过程中,面部索引(例如 obj.f[0])理所当然地变得混乱。我需要从用户指定的起点按顺序重新排序该面部索引。
这是为了将面孔放入选择列表中。 (maya会根据face_index号来放list,这不是我们想要的)
需要澄清的是,面部索引本身不需要更改。它只需要正确地进入列表。
到目前为止我做了什么:
我能够编写一些代码来选择一条多边形。选定的面被转换为边列表,然后 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 将旧映射投影到新网格上。
我已经为 Maya 中的一个问题苦苦思索了一段时间,但我无法在该站点内外找到解决方案。我创建了帐户,因此我可以向社区提出直接问题并希望得到答案。
问题是这样的: 在建模过程中,面部索引(例如 obj.f[0])理所当然地变得混乱。我需要从用户指定的起点按顺序重新排序该面部索引。 这是为了将面孔放入选择列表中。 (maya会根据face_index号来放list,这不是我们想要的) 需要澄清的是,面部索引本身不需要更改。它只需要正确地进入列表。
到目前为止我做了什么: 我能够编写一些代码来选择一条多边形。选定的面被转换为边列表,然后 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 将旧映射投影到新网格上。