如何在Maya网格中找到选定顶点的对称配对
找到一个顶点的对称点(比如,一个网格左边的点和它右边的对应点)最好的方法是什么?有没有更快的方法?我可以用Python的Open Maya API来实现这个吗,还是说有更好的办法?
1 个回答
1
你不想每次都检查每个点和其他点的位置,这样会非常慢。
一个简单的方法是为每个点生成一个哈希值——这是一种简单的比较操作——对于两个对称的点,它们的哈希值是相同的。幸运的是,元组——而不是列表——是可以生成哈希值的。所以算法可以这样做:
- 为每个点获取一个位置元组。
- 为所有在“左边”(或者“上面”或“后面”等)侧的点创建一个字典(位置: 点)。
为对面侧的点创建第二个字典(位置: 点),并翻转对称轴:如果你是在做左右对称,左边的列表会是
{ (x, y, z) : "pCube1.vtx[0]" } #etc
而右边的列表会是
{ (-1 * x, y, z) : "pCube1.vtx[99]" } # and so on
在两个字典中重复出现的任何键都是对称的,所以你需要收集在两个字典中都出现的键,然后获取它们代表的每一侧的点:
duplicates = [j for j in leftDictionary if j in rightDictionary] pairs = [leftDictionary[k], rightDictionary[k] for k in keys]
在处理大型网格时,这个方法可能不会特别快,但应该能解决问题。
唯一可能出现问题的地方是,如果两侧的浮点数存在差异,虽然在视觉上对称,但在数学上可能并不对称。你可以通过调整数值的精度来解决这个问题,比如把元组中的值放大到某个倍数,比如1000,然后转化为整数。原始方法可能会漏掉一些看起来对称但实际上不完全对称的情况,而量化的方法如果数值太接近,可能会合并多个匹配。我建议在没有问题的情况下,尽量使用原始数据。