如何在Maya网格中找到选定顶点的对称配对

1 投票
1 回答
1374 浏览
提问于 2025-04-18 08:12

找到一个顶点的对称点(比如,一个网格左边的点和它右边的对应点)最好的方法是什么?有没有更快的方法?我可以用Python的Open Maya API来实现这个吗,还是说有更好的办法?

1 个回答

1

你不想每次都检查每个点和其他点的位置,这样会非常慢。

一个简单的方法是为每个点生成一个哈希值——这是一种简单的比较操作——对于两个对称的点,它们的哈希值是相同的。幸运的是,元组——而不是列表——是可以生成哈希值的。所以算法可以这样做:

  1. 为每个点获取一个位置元组。
  2. 为所有在“左边”(或者“上面”或“后面”等)侧的点创建一个字典(位置: 点)。
  3. 为对面侧的点创建第二个字典(位置: 点),并翻转对称轴:如果你是在做左右对称,左边的列表会是

    { (x, y, z) : "pCube1.vtx[0]" }  #etc 
    

    而右边的列表会是

    { (-1 * x, y, z) : "pCube1.vtx[99]" } # and so on
    
  4. 在两个字典中重复出现的任何键都是对称的,所以你需要收集在两个字典中都出现的键,然后获取它们代表的每一侧的点:

    duplicates = [j for j in leftDictionary if j in rightDictionary]
    pairs = [leftDictionary[k], rightDictionary[k] for k in keys] 
    

在处理大型网格时,这个方法可能不会特别快,但应该能解决问题。

唯一可能出现问题的地方是,如果两侧的浮点数存在差异,虽然在视觉上对称,但在数学上可能并不对称。你可以通过调整数值的精度来解决这个问题,比如把元组中的值放大到某个倍数,比如1000,然后转化为整数。原始方法可能会漏掉一些看起来对称但实际上不完全对称的情况,而量化的方法如果数值太接近,可能会合并多个匹配。我建议在没有问题的情况下,尽量使用原始数据。

撰写回答